1. 程式人生 > 實用技巧 >Jakarta Java Mail屬性引數配置

Jakarta Java Mail屬性引數配置

前言

Jakarta Mail網址:https://eclipse-ee4j.github.io/mail

SMTP協議可匹配的屬性:https://eclipse-ee4j.github.io/mail/docs/api/com/sun/mail/smtp/package-summary.html

翻譯(Package com.sun.mail.smtp)

Package com.sun.mail.smtp

Jakarta Mail API的SMTP協議提供程式,提供對SMTP伺服器的訪問。

Class Summary

  • SMTPMessage 此類是MimeMessage類的特殊化,它允許您指定通過SMTP傳送此訊息時將使用的各種SMTP選項和引數。
  • SMTPSSLTransport 此類使用SSL上的SMTP實現SMTP傳輸抽象類,以進行郵件提交和傳輸。
  • SMTPTransport 此類使用SMTP實現Transport抽象類,以進行郵件提交和傳輸。

Exception Summary

Package com.sun.mail.smtp Description

Jakarta Mail API的SMTP協議提供程式,提供對SMTP伺服器的訪問。有關更多資訊,請參考RFC 821

傳送訊息時,在丟擲的頂級SendFailedException連結的SMTPAddressFailedException中提供了有關每個失敗地址的詳細資訊。 此外,如果設定了mail.smtp.reportsuccess屬性,則對於每個成功地址,SMTPAddressSucceededException將包括在列表中。 請注意,即使傳送成功,這也會導致丟擲頂級SendFailedException。

SMTP提供程式還支援ESMTP(RFC 1651)。它可以選擇使用LOGIN,PLAIN,DIGEST-MD5和NTLM機制(RFC 4616RFC 2831)使用SMTP身份驗證(RFC 2554)。

要使用SMTP身份驗證,您需要設定mail.smtp.auth屬性(請參見下文)或在連線到SMTP伺服器時為SMTP傳輸提供使用者名稱和密碼。您可以使用以下方法之一來執行此操作:

  • 在建立郵件Session時提供Authenticator物件,並在Authenticator回撥過程中提供使用者名稱和密碼資訊。

請注意,可以將mail.smtp.user屬性設定為為回撥提供預設使用者名稱,但是仍然需要顯式提供密碼。這種方法允許您使用靜態傳輸傳送方法來發送訊息。

  • 使用使用者名稱和密碼引數顯式呼叫Transport connect方法。

此方法要求您顯式管理傳輸物件,並使用傳輸sendMessage方法傳送訊息。 transport.java演示程式演示瞭如何管理Transport物件。 以下內容大致等同於靜態Transport send方法,但提供了所需的使用者名稱和密碼:

Transport tr = session.getTransport("smtp");
tr.connect(smtphost, username, password);
msg.saveChanges();      // don't forget this
tr.sendMessage(msg, msg.getAllRecipients());
tr.close();

使用DIGEST-MD5身份驗證時,您還需要提供適當的領域(realm);您的郵件伺服器管理員可以提供此資訊。您可以使用mail.smtp.sasl.realm屬性或SMTPTransport上的setSASLRealm方法進行設定。

SMTP協議提供程式可以在支援javax.security.sasl API(例如J2SE 5.0)的系統上使用SASL(RFC 2222)身份驗證機制。 除了內置於SASL實現中的SASL機制之外,使用者還可以提供自己設計的其他SASL機制,以支援自定義身份驗證方案。 有關詳細資訊,請參見《 Java SASL API程式設計和部署指南》。 請注意,當前的實現不支援提供自己的完整性或機密性層的SASL機制。

通過上述的SASL支援或作為SMTP提供程式中的內建身份驗證機制,可以通過XOAUTH2身份驗證機制支援OAuth 2.0身份驗證。 OAuth 2.0訪問令牌應作為此機制的密碼傳遞。 有關詳細資訊,請參見OAuth2支援

SMTP還可以選擇請求傳遞狀態通知(RFC 1891)。 通常使用帶有“message/delivery-status”(RFC 1894)部分的“multipart/report”(RFC 1892)訊息型別報告傳遞狀態。 您可以使用com.sun.mail.dsn包中的類來處理這些MIME型別。 請注意,您需要在CLASSPATH中包含dsn.jar,因為mail.jar中不包含此支援。

請參閱以下有關啟用這些功能的屬性。

還請注意,這裡沒有足夠的文件來使用這些功能!!! 您將需要閱讀上述適當的RFC,以瞭解這些功能的作用以及如何使用它們。 不要只是開始設定屬性,然後在無法正常執行時向我們投訴,就像您期望的那樣。 首先閱讀RFC !!!

SMTP協議提供程式支援RFC 3030中定義的CHUNKING擴充套件。將mail.smtp.chunksize屬性設定為所需的塊大小(以位元組為單位)。 如果伺服器支援CHUNKING擴充套件,則將使用BDAT命令以塊大小發送訊息。 請注意,沒有流水線(pipelining )操作,因此這比傳送訊息慢得多。 另請注意,不支援RFC 3030中描述的BINARYMIME擴充套件。

Properties

SMTP協議提供程式支援以下屬性,可以在Jakarta Mail Session物件中設定這些屬性。這些屬性始終設定為字串。 “型別”列描述瞭如何解釋字串。例如使用

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

設定型別為int的mail.smtp.port屬性。

請注意,如果您使用“smtps”協議通過SSL訪問SMTP,則所有屬性都將命名為 "mail.smtps.*" 。

SMTP properties
NameTypeDescription
mail.smtp.user String SMTP的預設使用者名稱。
mail.smtp.host String 要連線的SMTP伺服器。
mail.smtp.port int 如果 connect()方法未明確指定一個,則要連線的SMTP伺服器埠。預設為25。
mail.smtp.connectiontimeout int 套接字連線超時值(以毫秒為單位)。此超時由java.net.Socket實現。預設值為無限超時。
mail.smtp.timeout int 套接字讀取超時值(以毫秒為單位)。此超時由java.net.Socket實現。預設值為無限超時。
mail.smtp.writetimeout int 套接字寫入超時值(以毫秒為單位)。 此超時是通過每個連線使用java.util.concurrent.ScheduledExecutorService來實現的,該連線計劃在超時後排程執行緒以關閉套接字。 因此,使用此超時的開銷是每個連線一個執行緒。 預設值為無限超時。
mail.smtp.from String SMTP MAIL命令使用的電子郵件地址。設定信封的返回地址。預設為 msg.getFrom() 或 InternetAddress.getLocalAddress() 。注意:以前曾使用過mail.smtp.user。
mail.smtp.localhost String SMTP HELO或EHLO命令中使用的本地主機名。預設為 InetAddress.getLocalHost().getHostName() 。如果您的JDK和名稱服務配置正確,通常不需要設定。
mail.smtp.localaddress String 建立SMTP套接字時要繫結的本地地址(主機名)。 預設為Socket class選擇的地址。 通常不需要設定,但對於選擇特定本地地址進行繫結的multi-homed主主機很有用。
mail.smtp.localport int 建立SMTP套接字時要繫結的本地埠號。預設為Socket類選擇的埠號。
mail.smtp.ehlo boolean 如果為false,則不要嘗試使用EHLO命令登入。 預設為true。 通常,EHLO命令的失敗將回退到HELO命令。 此屬性僅適用於未正確使EHLO失敗或未正確實現EHLO的伺服器。
mail.smtp.auth boolean 如果為true,請嘗試使用AUTH命令對使用者進行身份驗證。預設為false。
mail.smtp.auth.mechanisms String 如果已設定,則列出要考慮的身份驗證機制以及考慮它們的順序。 僅使用伺服器支援和當前實現支援的機制。 預設值為“LOGIN PLAIN DIGEST-MD5 NTLM”,其中包括當前實現(除XOAUTH2之外)支援的所有身份驗證機制。
mail.smtp.auth.login.disable boolean 如果為true,則禁止使用AUTH LOGIN命令。預設為false。
mail.smtp.auth.plain.disable boolean 如果為true,則禁止使用AUTH PLAIN命令。預設為false。
mail.smtp.auth.digest-md5.disable boolean 如果為true,則禁止使用AUTH DIGEST-MD5命令。預設為false。
mail.smtp.auth.ntlm.disable boolean 如果為true,則禁止使用AUTH NTLM命令。預設為false。
mail.smtp.auth.ntlm.domain String NTLM身份驗證域。
mail.smtp.auth.ntlm.flags int NTLM協議特定的標誌。有關詳細資訊,請參見http://curl.haxx.se/rfc/ntlm.html#theNtlmFlags
mail.smtp.auth.xoauth2.disable boolean 如果為true,則禁止使用AUTHENTICATE XOAUTH2命令。 由於OAuth 2.0協議需要特殊的訪問令牌而不是密碼,因此預設情況下會禁用此機制。 通過將此屬性顯式設定為“ false”或將“ mail.smtp.auth.mechanisms”屬性設定為“ XOAUTH2”,可以啟用它。
mail.smtp.submitter String 在MAIL FROM命令的AUTH標記中使用的提交者。 通常由郵件中繼用於傳遞有關郵件原始提交者的資訊。 另請參見SMTPMessagesetSubmitter方法。 郵件客戶端通常不使用此功能。
mail.smtp.dsn.notify String RCPT命令的NOTIFY選項。要麼 NEVER,或SUCCESS, FAILURE, 和 DELAY 的某種組合(以逗號分隔)。
mail.smtp.dsn.ret String MAIL命令的RET選項。要麼 FULL 或 HDRS。
mail.smtp.allow8bitmime boolean 如果設定為true,並且伺服器支援8BITMIME擴充套件,則使用“quoted-printable”或“base64”編碼的郵件文字部分如果遵循RFC2045規則的8bit文字,則轉換為使用“8bit”編碼。
mail.smtp.sendpartial boolean 如果設定為true,並且一條訊息具有一些有效和一些無效的地址,則無論如何都要傳送該訊息,並通過SendFailedException報告部分失敗。 如果設定為false(預設值),則在收件人地址無效的情況下,不會將郵件傳送給任何收件人。
mail.smtp.sasl.enable boolean 如果設定為true,請嘗試使用javax.security.sasl包來選擇用於登入的身份驗證機制。預設為false。
mail.smtp.sasl.mechanisms String 嘗試使用的用空格或逗號分隔的SASL機制名稱列表。
mail.smtp.sasl.authorizationid String 在SASL身份驗證中使用的授權ID。如果未設定,則使用身份驗證ID(使用者名稱)。
mail.smtp.sasl.realm String 與DIGEST-MD5身份驗證一起使用的領域。
mail.smtp.sasl.usecanonicalhostname boolean 如果設定為true,則由InetAddress.getCanonicalHostName返回的規範主機名將傳遞到SASL機制,而不是用於連線的主機名。預設為false。
mail.smtp.quitwait boolean 如果設定為false,則傳送QUIT命令,並立即關閉連線。如果設定為true(預設值),則使傳輸等待對QUIT命令的響應。
mail.smtp.quitonsessionreject boolean 如果設定為false(預設值),則在會話發起拒絕時不傳送QUIT命令,並且連線立即關閉。如果設定為true,則使傳輸在關閉連線之前傳送QUIT命令。
mail.smtp.reportsuccess boolean 如果設定為true,則使傳輸為每個成功的地址包括一個SMTPAddressSucceededException。 還要注意,這將導致從SMTPTransportsendMessage方法丟擲SendFailedException,即使所有地址正確並且訊息已成功傳送也是如此。
mail.smtp.socketFactory SocketFactory 如果設定為實現javax.net.SocketFactory介面的類,則該類將用於建立SMTP套接字。 請注意,這是類的例項,而不是名稱,必須使用put方法(而不是setProperty方法)進行設定。
mail.smtp.socketFactory.class String 如果設定,則指定實現javax.net.SocketFactory介面的類的名稱。此類將用於建立SMTP套接字。
mail.smtp.socketFactory.fallback boolean 如果設定為true,則無法使用指定的套接字工廠類建立套接字,這將導致使用java.net.Socket類建立套接字。預設為true。
mail.smtp.socketFactory.port int 指定使用指定的套接字工廠時要連線的埠。如果未設定,將使用預設埠。
mail.smtp.ssl.enable boolean 如果設定為true,則預設情況下使用SSL連線並使用SSL埠。對於“smtp”協議,預設為false;對於“smtps”協議,預設為true。
mail.smtp.ssl.checkserveridentity boolean 如果設定為true,則檢查RFC 2595指定的伺服器身份。這些基於伺服器證書內容的附加檢查旨在防止中間人(man-in-the-middle)攻擊。預設為false。
mail.smtp.ssl.trust String 如果設定,並且未指定套接字工廠,則啟用MailSSLSocketFactory的使用。 如果設定為“ *”,則所有主機都是受信任的。 如果設定為以空格分隔的主機列表,則這些主機是可信任的。 否則,信任取決於伺服器提供的證書。
mail.smtp.ssl.socketFactory SSLSocketFactory 如果設定為擴充套件javax.net.ssl.SSLSocketFactory類的類,則該類將用於建立SMTP SSL套接字。 請注意,這是類的例項,而不是名稱,必須使用put方法(而不是setProperty方法)進行設定。
mail.smtp.ssl.socketFactory.class String 如果設定,則指定擴充套件javax.net.ssl.SSLSocketFactory類的類的名稱。此類將用於建立SMTP SSL套接字。
mail.smtp.ssl.socketFactory.port int 指定使用指定的套接字工廠時要連線的埠。如果未設定,將使用預設埠。
mail.smtp.ssl.protocols string 指定將為SSL連線啟用的SSL協議。該屬性值是javax.net.ssl.SSLSocket.setEnabledProtocols方法可接受的標記的空格分隔列表。
mail.smtp.ssl.ciphersuites string 指定將為SSL連線啟用的SSL密碼套件。該屬性值是javax.net.ssl.SSLSocket.setEnabledCipherSuites方法可接受的標記的空格分隔列表。
mail.smtp.starttls.enable boolean 如果為true,則在發出任何登入命令之前,允許使用STARTTLS命令(如果伺服器支援)將連線切換到 TLS-protected 的連線。 如果伺服器不支援STARTTLS,則在不使用TLS的情況下繼續連線。 如果不支援STARTTLS,請參閱mail.smtp.starttls.required屬性失敗。 請注意,必須配置適當的信任庫,以便客戶端信任伺服器的證書。 預設為false。
mail.smtp.starttls.required boolean 如果為true,則要求使用STARTTLS命令。如果伺服器不支援STARTTLS命令,或者該命令失敗,則connect方法將失敗。預設為false。
mail.smtp.proxy.host string 指定將用於連線到郵件伺服器的HTTP Web代理伺服器的主機名。
mail.smtp.proxy.port string 指定HTTP Web代理伺服器的埠號。預設為埠80。
mail.smtp.proxy.user string 指定用於與HTTP Web代理伺服器進行身份驗證的使用者名稱。預設情況下,不進行身份驗證。
mail.smtp.proxy.password string 指定用於與HTTP Web代理伺服器進行身份驗證的密碼。預設情況下,不進行身份驗證。
mail.smtp.socks.host string 指定將用於連線到郵件伺服器的SOCKS5代理伺服器的主機名。
mail.smtp.socks.port string 指定SOCKS5代理伺服器的埠號。僅當代理伺服器未使用標準埠號1080時,才應使用此選項。
mail.smtp.mailextension String 擴充套件字串追加到MAIL命令。 擴充套件字串可用於指定標準SMTP服務擴充套件以及特定於供應商的擴充套件。 通常,應用程式應使用SMTPTransport方法supportsExtension來驗證伺服器是否支援所需的服務擴充套件。 請參閱RFC 1869和其他定義特定副檔名的RFC。
mail.smtp.userset boolean 如果設定為true,則在isConnected方法中使用RSET命令而不是NOOP命令。在某些情況下,在執行許多NOOP命令後,sendmail的響應速度會很慢。使用RSET可以避免此sendmail問題。預設為false。
mail.smtp.noop.strict boolean 如果設定為true(預設值),則堅持使用NOOP命令的250響應程式碼來指示成功。 isConnected方法使用NOOP命令來確定連線是否仍然有效。 一些較舊的伺服器在成功時返回錯誤的響應程式碼,一些伺服器根本不執行NOOP命令,因此總是返回失敗程式碼。 將此屬性設定為false可處理以這種方式損壞的伺服器。 通常,當伺服器超時連線時,它將傳送421響應程式碼,客戶端將其視為對它發出的下一個命令的響應。 超時連線時,某些伺服器會發送錯誤的故障響應程式碼。 處理以這種方式損壞的伺服器時,請勿將此屬性設定為false。

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

除了按Session配置控制列印除錯輸出外,com.sun.mail.smtp提供程式還使用Logger記錄相同的資訊,如下表所述:

SMTP Loggers

Logger NameLogging LevelPurpose
com.sun.mail.smtp CONFIG SMTPTransport的配置
com.sun.mail.smtp FINE 常規除錯輸出
com.sun.mail.smtp.protocol FINEST 完整的協議跟蹤

警告:此軟體包獨有的API應該被視為實驗性的。將來可能會以與使用當前API的應用程式不相容的方式對其進行更改。


翻譯完成(2020/08/19)