1. 程式人生 > >java使用smtp協議傳送郵件注意的問題

java使用smtp協議傳送郵件注意的問題

公司經常遇到傳送郵件的問題,普通郵件傳送就不說了,說一下無賬號密碼傳送郵件的過程,在這裡總結一下:

smtp傳送郵件過程

這部分說明是從網上摘抄的,寫的很詳細,我就貼過來修改了一下:

使用smtp協議傳送郵件給郵件伺服器時規定了要做以下幾件事:

  1、使用"ehlo"命令和連線上的smtp伺服器打聲招呼,例如:
     ehlo zqz
               命令格式為  “ehlo 當前計算機的hostname”; zqz即為當前計算機的主機名;

  2、使用"auth login"命令登入到Smtp伺服器,登入使用的使用者名稱和密碼必須經過Base64加密,例如:
    ①、輸入命令:auth login  
    ②、輸入使用Base64加密過後的使用者名稱:Z2FjbA==
    ③、輸入Base64加密過後的密碼:MTIzNDU2
            說明:好多企業內部郵箱不需要設定使用者名稱密碼,一般都是將傳送郵件的伺服器ip列入白名單,那麼這一步就可以省略;

  3、指明郵件的發件人和收件人

    mail from:<

[email protected]>
    rcpt to:<[email protected]>

   4、編寫要傳送的郵件內容,郵件的編寫格式是有一定的規則的,一封格式良好的郵件應該包含郵件頭和郵件的主體內容。

 郵件頭使用下面的三個欄位來指明:

  1. from欄位用於指明郵件的傳送人
  2. to欄位用於指明郵件的收件人
  3. subject欄位用於指明郵件的主題

   郵件的內容包含了這些資訊之後才是一封格式良好的郵件。

    ①、輸入"data"命令
      data
    ②、編寫郵件內容
                    Cc:[email protected]

                    ----郵件頭   抄送給誰
      From:[email protected]              ----郵件頭   郵件傳送者
      To:[email protected]            ----郵件頭   郵件接收者
      Subject:hello test         ----郵件頭   郵件標題
                          ----空行
      hello test                 ----郵件的具體內容

  5、輸入一個.告訴郵件伺服器郵件內容已經寫完了。
    .
  6、輸入quit命令斷開與郵件伺服器的連線。
    quit
 

以上的6個步驟就是Smtp協議規定的傳送一封Email必須要做的事情。

下面就用命令列來執行一下整個過程:

[C:\Users\Administrator]$ telnet smtp.tingyun.com 25

Host 'smtp.tingyun.com' resolved to 163.177.72.143.
Connecting to 163.177.72.143:25...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

220 smtp.qq.com Esmtp QQ Mail Server         //連線成功後伺服器主動推送的訊息,220為響應程式碼,後面歡迎訊息說明伺服器的域名為smtp.qq.com ,協議為Esmtp ,伺服器名為QQ Mail Server;

ehlo localhost                                         //此命令成功後,伺服器推送支援的認證方式
250-smtp.qq.com
250-PIPELINING
250-SIZE 73400320
250-STARTTLS
250-AUTH LOGIN PLAIN                       //這裡是伺服器返回的支援的驗證方式 LOGIN 和PLAIN兩種方式
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
auth login                                             //此命令向伺服器發起認證請求
334 VXNlcm5hbWU6                           //334代表等待輸入命令  後面字串代表輸入使用者名稱
ZXRwdGVzdEB0aW5neXVuLmNvbQ==           //base64的使用者名稱    
334 UGFzc3dvcmQ6                            //334代表等待輸入命令  後面字串代表輸入密碼
VFl1bjAxMA==                                                 //base64的密碼
235 Authentication successful            //235代表驗證通過,如果驗證失敗則返回530
mail from:<[email protected]>   //誰傳送的郵件
250 Ok
rcpt to:<[email protected]>           //誰接收郵件
250 Ok
data                                                   //data命令代表郵件正文
354 End data with <CR><LF>.<CR><LF>       //354代表可以傳送郵件正文,並提示郵件以"."結尾

From:[email protected]             //傳送者
To:[email protected]                     //接收者
Cc:[email protected]                    //抄送
Subject:hello test                               //標題
Content-Type: text/plain

                                                           //回車空行 ,此行上面是head,下面是body
hello test.                                           //郵件正文
.                                                          //  .代表正文結束
250 Ok: queued as 

以上紅色部分為我們自己需要輸入的命令列。

qq郵箱收到的郵件:

hello test

發件人:etptest <[email protected]>    
時   間:2018年5月9日(星期三) 下午5:36 純文字 | 

收件人:

randolpha <[email protected]>

抄   送:

zhuqz <[email protected]>

hello test.

SMTP協議中HELO和EHLO


HELO是普通SMTP,不帶身份驗證,可以偽造郵件!一般如果不關閉SMTP的話,就可以製造垃圾郵件了,這個已經沒有公司使這種方式了;

EHLO是ESMTP,帶有身份驗證,所以沒法偽造。

java中SMTP協議傳送郵件


SMTP協議傳送郵件使用的是com.sun.mail.smtp.SMTPTransport這個類,建立連線,驗證身份的邏輯在protocolConnect方法裡面;
如果不設定mail.smtp.auth 和 mail.smtp.ehlo ,預設mail.smtp.auth = false,mail.smtp.ehlo=true;
相關的程式碼邏輯在com.sun.mail.smtp.SMTPTransport.protocolConnect()的613行:

       // setting mail.smtp.ehlo to false disables attempts to use EHLO
	boolean useEhlo =  PropUtil.getBooleanSessionProperty(session, "mail." + name + ".ehlo", true);
	// setting mail.smtp.auth to true enables attempts to use AUTH
	boolean useAuth = PropUtil.getBooleanSessionProperty(session, "mail." + name + ".auth", false);

判斷是否需要執行auth login操作驗證使用者名稱和密碼在第682行:
 

if ((useAuth || (user != null && passwd != null)) &&
		  (supportsExtension("AUTH") ||
		   supportsExtension("AUTH=LOGIN"))) {
		connected = authenticate(user, passwd);

注意這裡的判斷條件 ,如果mail.smtp.auth = true 或者 使用者名稱和密碼都不為null;
也就是在以下條件都會程序login驗證:
1. mail.smtp.auth = true ;
2. mail.smtp.auth = false, 但是使用者名稱和密碼都不為null;

所以如果我們不去設定mail.smtp.auth引數(那麼它預設就是false),只要將使用者名稱和密碼設定為null或者非null,即可讓java決定是否需要執行login操作;所以建議不要設定mail.smtp.auth引數,只使用使用者名稱和密碼來控制是否執行login操作;

注意:
1. 對於不需要使用者名稱和密碼傳送郵件的情況,需要將mail.smtp.auth = false或不設定(預設就是fasle),並把userName和password設定為null;

2. 對於exchange郵箱傳送郵件,userName不要設定加@郵箱域名後面的內容,只需要@符號前的使用者名稱即可;

狀態碼查詢

500 格式錯誤,命令不可識別(此錯誤也包括命令列過長)
501 引數格式錯誤
502 命令不可實現
503 錯誤的命令序列
504 命令引數不可實現
211 系統狀態或系統幫助響應
214 幫助資訊
220 <domain> 服務就緒
221 <domain> 服務關閉傳輸通道
421 <domain> 服務未就緒,關閉傳輸通道(當必須關閉時,此應答可以作為對任何命令的響應)
250 要求的郵件操作完成
251 使用者非本地,將轉發向<forward-path>
450 要求的郵件操作未完成,郵箱不可用(例如,郵箱忙)
550 要求的郵件操作未完成,郵箱不可用(例如,郵箱未找到,或不可訪問)
451 放棄要求的操作;處理過程中出錯
551 使用者非本地,請嘗試<forward-path>
452 系統儲存不足,要求的操作未執行
552 過量的儲存分配,要求的操作未執行
553 郵箱名不可用,要求的操作未執行(例如郵箱格式錯誤)
354 開始郵件輸入,以<CRLF>.<CRLF>結束
554 操作失敗

傳送smtp郵件

下面是阿里雲禁用25埠的情況下如何使用465埠smtps協議傳送郵件

相關推薦

java使用smtp協議傳送郵件注意的問題

公司經常遇到傳送郵件的問題,普通郵件傳送就不說了,說一下無賬號密碼傳送郵件的過程,在這裡總結一下: smtp傳送郵件過程 這部分說明是從網上摘抄的,寫的很詳細,我就貼過來修改了一下: 使用smtp協議傳送郵件給郵件伺服器時規定了要做以下幾件事:   1、使用"ehlo

c語言利用SMTP協議傳送郵件

#ifdef WIN32 #include <windows.h> #include <stdio.h> #else #include <stdio.h> #include <sys/types.h> #include

C++ 使用smtp協議傳送郵件的簡單實現

心血來潮,簡單實現一個傳送郵件的小程式, 首先實現一個簡單的socket類 標頭檔案 #ifndef _CSOCKET_H_ #define _CSOCKET_H_ #include <sys/socket.h> #include <arpa/inet

C#使用SMTP協議傳送郵件(騰訊企業郵箱)

大部分郵箱都支援使用SMTP協議傳送郵件,使用這種方法可以很方便的在系統開發中傳送郵件。 在C#語言中,傳送郵件的相關類位於System.Net.Mail名稱空間下。 具體過程為建立郵件類MailM

python應用系列教程——python使用smtp協議傳送郵件:html文字郵件、圖片郵件、檔案附件郵件

全棧工程師開發手冊 (作者:欒鵬) python使用smtp協議傳送電子郵件。包含傳送html文字郵件、包含圖片附件的郵件,包含其他檔案附件的郵件。可設定郵件的收發人,主題,內容。並以163郵件為例,分別在python2.7和python3.6下進行試驗。

python通過SMTP協議傳送郵件失敗,報錯505或535

傳送失敗錯誤1:smtplib.SMTPAuthenticationError: (550, b'User has no permission')   我們使用python傳送郵件時相當於自定義客戶端

用Spring的郵件封裝類JavaMailSenderImpl傳送郵件注意埠號不需要設定(設定了反而linux上釋出後傳送失敗)

===》###注意埠號不需要設定:》加不加埠:window都行,linux加了埠反而發不出去! 是的。配置了埠,Windows沒問題。linux就有問題了。仔細檢視錯誤資訊: 發現是 JavaMail API 程式碼問題。排除了是我的程式碼邏輯問題。 而且是埠超時問題。 看到這

阿里雲Centos7中GitLab使用smtp 163郵箱傳送郵件注意事宜

1.修改gitlab.rb配置項目錄:/etc/gitlab/gitlab.rb修改:gitlab_rails['smtp_enable'] = truegitlab_rails['smtp_address'] = "smtp.163.com"gitlab_rails['sm

smtp協議 VC實現傳送郵件

利用VC2005實現了郵件傳送,源程式如下: //-------------------------------------------------------SmtpSendEmail.h------------------------------------ #pr

JavaMail使用SMTP協議傳送電子郵件(詳解)

package cn.outofmemory.javamail; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import j

PHPMailer 傳送郵件 gmail注意事項

gmail 注意 1.ssl 2.埠465 3.開啟IMAP https://mail.google.com/mail/u

javax.mail 傳送郵件(工具類)

前言:注意自己郵箱賬號的授權碼 傳送不成功,要設定授權碼(勿掉坑裡) 1.座標 <dependency> <groupId>javax.mail</groupId> <artifactId&

無後臺網站傳送郵件方法(formspree)

<!doctype html> <html> <head> <meta charset="utf-8"> <title>無後臺網站傳送郵件方法(formspree)開通黃金會員才能使用AJAX提交,否則只能使用form提交</titl

Linux系統使用mailx命令傳送郵件

一、環境核實以及準備。     在centos7系統中預設有安裝mailx命令進行系統郵件的傳送。如果沒有相關的命令可以自行通過yum安裝     #yum install mailx -y    使用#ss  &nbs

telnet通過smtp傳送郵件

////////////////////////////////////CMD指令////////////////////////////////////////////// cmd telnet smtp.163.com 25   or &nb

註冊成功傳送郵件

前提:確認匯入了jar包:mail.jar           *注:網易郵箱給網易郵箱發的較快。 MailUtils.java package com.pb.utils; import java.util.Properties; i

iOS 呼叫系統傳送郵件

第一步 匯入messageUI.framework框架 第二步 匯入標頭檔案 #import <MessageUI/MessageUI.h> 第三步 @property (nonatomic,strong)  MFMailComposeViewCon

QQ 傳送郵件

  之前也釋出過一篇QQ發郵件的,後來那種方法在阿里雲伺服器中報錯了,查了好久才發現,是阿里雲的伺服器把 25 埠 給封殺了。現在重新做了個功能。 public static string UserName = ""; public static string UserPas

織夢會員註冊郵箱驗證傳送郵件配置教程

環境要求 主機465埠是開啟和放行的 php擴充套件openssl是開啟的 php擴充套件sockets是開啟的 1、QQ郵箱 或者 163郵箱 126郵箱 開啟SMTP服務,拿到授權碼,根據自己的來 QQ郵箱開啟SMTP服務 和 獲取授權碼 163郵箱開啟SM

python傳送郵件給多人

親測,163郵箱不能傳送,我用的qq的 import smtplib from email.mime.text import MIMEText sender = '[email protected]' passwd = '****' receiver = ["[email&#