- JavaMail API 教程
- JavaMail - 首頁
- JavaMail API - 概述
- JavaMail - 環境設定
- JavaMail - 核心類
- JavaMail - 傳送郵件
- JavaMail - 檢查郵件
- JavaMail - 獲取郵件
- JavaMail - 身份驗證
- JavaMail - 回覆郵件
- JavaMail - 轉發郵件
- JavaMail - 刪除郵件
- JavaMail - Gmail SMTP 伺服器
- JavaMail - 資料夾管理
- JavaMail - 配額管理
- JavaMail - 退信
- JavaMail API 協議
- JavaMail - SMTP 伺服器
- JavaMail - IMAP 伺服器
- JavaMail - POP3 伺服器
- JavaMail API 有用資源
- JavaMail - 快速指南
- JavaMail - 有用資源
- JavaMail - 討論
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 | 當郵件無法傳送時,將丟擲此異常。 |
| SMTPAddressSucceededException | 當 mail.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.socketFactory | SSL 套接字工廠 | 如果設定為擴充套件 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 伺服器的示例在第 傳送電子郵件 章中進行了演示。