JavaMail API - SMTP 伺服器



SMTP 是 **簡單郵件傳輸協議** 的縮寫。它是用於在網際網路協議 (IP) 網路上進行電子郵件 (電子郵件) 傳輸的網際網路標準。SMTP 使用 TCP 埠 25。透過 SSL 保護的 SMTP 連線簡稱為 SMTPS,儘管 SMTPS 本身並不是一種協議。

JavaMail API 包含 com.sun.mail.smtp 包,該包充當 SMTP 協議提供程式以訪問 SMTP 伺服器。下表列出了此包中包含的類

描述
SMTPMessage此類是 MimeMessage 類的專門化,允許您指定各種 SMTP 選項和引數,這些選項和引數將在透過 SMTP 傳送此郵件時使用。
SMTPSSLTransport此類使用透過 SSL 的 SMTP 實現 Transport 抽象類,用於郵件提交和傳輸。
SMTPTransport此類使用 SMTP 實現 Transport 抽象類,用於郵件提交和傳輸。

下表列出了丟擲的異常

異常描述
SMTPAddressFailedException當郵件無法傳送時,將丟擲此異常。
SMTPAddressSucceededExceptionmail.smtp.reportsuccess 屬性為 true 時,此異常是 SendFailedException 的鏈式異常。
SMTPSenderFailedException當郵件無法傳送時,將丟擲此異常。
SMTPSendFailedException當郵件無法傳送時,將丟擲此異常。此異常包括郵件伺服器拒絕的傳送方的地址。

com.sun.mail.smtp 提供程式可選地使用 SMTP 身份驗證。要使用 SMTP 身份驗證,您需要設定 mail.smtp.auth 屬性或在連線到 SMTP 伺服器時向 SMTP 傳輸提供使用者名稱和密碼。您可以使用以下方法之一執行此操作

  • 在建立郵件會話時提供 Authenticator 物件,並在 Authenticator 回撥期間提供使用者名稱和密碼資訊。mail.smtp.user 屬性可以設定為提供回撥的預設使用者名稱,但仍需要顯式提供密碼。此方法允許您使用靜態 Transport send 方法傳送郵件。例如

  • Transport.send(message);
    
  • 使用使用者名稱和密碼引數顯式呼叫 Transport connect 方法。例如

    Transport tr = session.getTransport("smtp");
    tr.connect(smtphost, username, password);
    msg.saveChanges();
    tr.sendMessage(msg, msg.getAllRecipients());
    tr.close();
    

SMTP 協議提供程式支援以下屬性,這些屬性可以在 JavaMail Session 物件中設定。這些屬性始終設定為字串。例如

 props.put("mail.smtp.port", "587");

此處,**型別** 列描述了字串的解釋方式。

名稱型別描述
mail.smtp.user字串SMTP 的預設使用者名稱。
mail.smtp.host字串要連線到的 SMTP 伺服器。
mail.smtp.port整數要連線到的 SMTP 伺服器埠,如果 connect() 方法沒有顯式指定埠。預設為 25。
mail.smtp.connectiontimeout整數以毫秒為單位的套接字連線超時值。預設為無限超時。
mail.smtp.timeout整數以毫秒為單位的套接字 I/O 超時值。預設為無限超時。
mail.smtp.from字串用於 SMTP MAIL 命令的電子郵件地址。這設定信封回覆地址。預設為 msg.getFrom() 或 InternetAddress.getLocalAddress()。
mail.smtp.localhost字串在 SMTP HELO 或 EHLO 命令中使用的本地主機名。預設為 InetAddress.getLocalHost().getHostName()。如果您的 JDK 和您的名稱服務已正確配置,則通常不需要設定。
mail.smtp.localaddress字串建立 SMTP 套接字時要繫結到的本地地址(主機名)。預設為 Socket 類選擇的地址。通常不需要設定。
mail.smtp.localport整數建立 SMTP 套接字時要繫結到的本地埠號。預設為 Socket 類選擇的埠號。
mail.smtp.ehlo布林值如果為 false,則不要嘗試使用 EHLO 命令登入。預設為 true。
mail.smtp.auth布林值如果為 true,則嘗試使用 AUTH 命令對使用者進行身份驗證。預設為 false。
mail.smtp.auth.mechanisms字串如果設定,則列出要考慮的身份驗證機制。僅伺服器支援並由當前實現支援的機制將被使用。預設為“LOGIN PLAIN DIGEST-MD5 NTLM”,其中包含當前實現支援的所有身份驗證機制。
mail.smtp.auth.login.disable布林值如果為 true,則阻止使用 AUTH LOGIN 命令。預設為 false。
mail.smtp.auth.plain.disable布林值如果為 true,則阻止使用 AUTH PLAIN 命令。預設為 false。
mail.smtp.auth.digest-md5.disable布林值如果為 true,則阻止使用 AUTH DIGEST-MD5 命令。預設為 false。
mail.smtp.auth.ntlm.disable布林值如果為 true,則阻止使用 AUTH NTLM 命令。預設為 false。
mail.smtp.auth.ntlm.domain字串NTLM 身份驗證域。
mail.smtp.auth.ntlm.flags整數NTLM 協議特定的標誌。
mail.smtp.submitter字串在 MAIL FROM 命令的 AUTH 標記中使用的提交者。通常由郵件中繼用於傳遞有關郵件原始提交者的資訊。
mail.smtp.dsn.notify字串對 RCPT 命令的 NOTIFY 選項。可以是 NEVER,也可以是 SUCCESS、FAILURE 和 DELAY 的某種組合(用逗號分隔)。
mail.smtp.dsn.ret字串對 MAIL 命令的 RET 選項。可以是 FULL 或 HDRS。
mail.smtp.sendpartial布林值如果設定為 true,並且郵件包含一些有效地址和一些無效地址,則無論如何都發送郵件,並使用 SendFailedException 報告部分失敗。如果設定為 false(預設值),則如果存在無效的收件人地址,則不會將郵件傳送到任何收件人。
mail.smtp.sasl.enable布林值如果設定為 true,則嘗試使用 javax.security.sasl 包為登入選擇身份驗證機制。預設為 false。
mail.smtp.sasl.mechanisms字串要嘗試使用的 SASL 機制名稱的空格或逗號分隔列表。
mail.smtp.sasl.authorizationid字串在 SASL 身份驗證中使用的授權 ID。如果未設定,則使用身份驗證 ID(使用者名稱)。
mail.smtp.sasl.realm字串與 DIGEST-MD5 身份驗證一起使用的領域。
mail.smtp.quitwait布林值如果設定為 false,則傳送 QUIT 命令並立即關閉連線。如果設定為 true(預設值),則會導致傳輸等待對 QUIT 命令的響應。
mail.smtp.reportsuccess布林值如果設定為 true,則會導致傳輸為每個成功的地址包含一個 SMTPAddressSucceededException。
mail.smtp.socketFactory套接字工廠如果設定為實現 javax.net.SocketFactory 介面的類,則此類將用於建立 SMTP 套接字。
mail.smtp.socketFactory.class字串如果設定,則指定實現 javax.net.SocketFactory 介面的類的名稱。此類將用於建立 SMTP 套接字。
mail.smtp.socketFactory.fallback布林值如果設定為 true,則使用指定的套接字工廠類建立套接字失敗將導致使用 java.net.Socket 類建立套接字。預設為 true。
mail.smtp.socketFactory.port整數指定使用指定的套接字工廠時要連線到的埠。如果未設定,則將使用預設埠。
mail.smtp.ssl.enable布林值如果設定為 true,則使用 SSL 連線並預設使用 SSL 埠。對於“smtp”協議預設為 false,對於“smtps”協議預設為 true。
mail.smtp.ssl.checkserveridentity布林值如果設定為 true,則根據 RFC 2595 檢查伺服器身份。預設為 false。
mail.smtp.ssl.trust字串如果設定,並且未指定套接字工廠,則啟用 MailSSLSocketFactory 的使用。
如果設定為“*”,則所有主機都受信任。
如果設定為主機列表(空格分隔),則這些主機受信任。
否則,信任取決於伺服器提供的證書。
mail.smtp.ssl.socketFactorySSL 套接字工廠如果設定為擴充套件 javax.net.ssl.SSLSocketFactory 類的類,則此類將用於建立 SMTP SSL 套接字。
mail.smtp.ssl.socketFactory.class字串如果設定,則指定擴充套件 javax.net.ssl.SSLSocketFactory 類的類的名稱。此類將用於建立 SMTP SSL 套接字。
mail.smtp.ssl.socketFactory.port整數指定使用指定的套接字工廠時要連線到的埠。如果未設定,則將使用預設埠。
mail.smtp.ssl.protocols字串指定將為 SSL 連線啟用的 SSL 協議。屬性值為 javax.net.ssl.SSLSocket.setEnabledProtocols 方法可接受的標記的空格分隔列表。
mail.smtp.starttls.enable布林值如果為 true,則啟用 STARTTLS 命令的使用(如果伺服器支援),在發出任何登入命令之前將連線切換到 TLS 保護的連線。預設為 false。
mail.smtp.starttls.required布林值如果為 true,則需要使用 STARTTLS 命令。如果伺服器不支援 STARTTLS 命令,或者命令失敗,則 connect 方法將失敗。預設為 false。
mail.smtp.socks.host字串指定將用於連線到郵件伺服器的 SOCKS5 代理伺服器的主機名。
mail.smtp.socks.port字串指定 SOCKS5 代理伺服器的埠號。只有當代理伺服器未使用標準埠號 1080 時,才需要使用此埠號。
mail.smtp.mailextension字串要附加到 MAIL 命令的擴充套件字串。
mail.smtp.userset

布林值如果設定為 true,則在 isConnected 方法中使用 RSET 命令而不是 NOOP 命令。在某些情況下,sendmail 在執行許多 NOOP 命令後會響應緩慢;使用 RSET 可以避免此 sendmail 問題。預設為 false。

一般來說,應用程式不需要直接使用此包中的類。相反,它們應該使用 javax.mail 包(和子包)定義的 API。例如,應用程式永遠不應該直接構造 SMTPTransport 的例項。相反,它們應該使用 Session 方法 getTransport 獲取合適的 Transport 物件。

使用 SMPT 伺服器的示例在第 傳送電子郵件 章中進行了演示。

廣告

© . All rights reserved.