Javamail Api 简明教程
JavaMail API - SMTP Servers
SMTP 是 Simple Mail Transfer Protocol 的缩写。它是一种用于通过因特网协议 (IP) 网络传输电子邮件 (e-mail) 的因特网标准。SMTP 使用 TCP 端口 25。由 SSL 保护的 SMTP 连接被称为 SMTPS,尽管 SMTPS 自身并不是一种协议。
JavaMail API 具有包 com.sun.mail.smtp ,该包充当 SMTP 协议提供者以访问 SMTP 服务器。下表列出了包含在此包中的类:
Class |
Description |
SMTPMessage |
此类是 MimeMessage 类的专业化版本,允许您指定在通过 SMTP 发送此消息时将使用的各种 SMTP 选项和参数。 |
SMTPSSLTransport |
此类使用 SMTP over SSL 针对消息提交和传输实现 Transport 抽象类。 |
SMTPTransport |
此类使用 SMTP 针对消息提交和传输实现 Transport 抽象类。 |
下表列出了引发的异常:
Exception |
Description |
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 属性以提供回调的默认用户名,但仍需要明确提供密码。通过这种方法,您可以使用静态传输 send 方法来发送消息。例如:
-
使用用户名和密码参数明确调用 Transport connect 方法。例如:Transport tr = session.getTransport("smtp");tr.connect(smtphost, username, password);msg.saveChanges();tr.sendMessage(msg, msg.getAllRecipients());tr.close();
SMTP 协议提供者支持以下属性,可以在 JavaMail 会话对象中设置这些属性。这些属性始终以字符串形式设置。例如:
props.put("mail.smtp.port", "587");
这里, Type 列描述了如何解释字符串。
Name |
Type |
Description |
mail.smtp.user |
String |
SMTP 的默认用户名。 |
mail.smtp.host |
String |
要连接到的 SMTP 服务器。 |
mail.smtp.port |
int |
如果 connect() 方法未明确指定,则要连接到的 SMTP 服务器端口。默认为 25。 |
mail.smtp.connectiontimeout |
int |
套接字连接超时值(以毫秒为单位)。默认为无限超时。 |
mail.smtp.timeout |
int |
套接字 I/O 超时值(以毫秒为单位)。默认为无限超时。 |
mail.smtp.from |
String |
用于 SMTP MAIL 命令的电子邮件地址。这将设置信封退件地址。默认为 msg.getFrom() 或 InternetAddress.getLocalAddress()。 |
mail.smtp.localhost |
String |
SMTP HELO 或 EHLO 命令中使用的本地主机名。默认为 InetAddress.getLocalHost().getHostName()。如果 JDK 和名称服务配置正确,则通常不需要设置。 |
mail.smtp.localaddress |
String |
在创建 SMTP 套接字时用于绑定的本地地址(主机名)。默认为 Socket 类选择的地址。通常不需要设置。 |
mail.smtp.localport |
int |
在创建 SMTP 套接字时用于绑定的本地端口号。默认为 Socket 类选择的端口号。 |
mail.smtp.ehlo |
boolean |
如果为 false,请勿尝试使用 EHLO 命令登录。默认为 true。 |
mail.smtp.auth |
boolean |
如果为 true,请尝试使用 AUTH 命令验证用户。默认为 false。 |
mail.smtp.auth.mechanisms |
String |
如果设置,则列出要考虑的身份验证机制。只会使用服务器支持且当前实现支持的机制。默认值为“LOGIN PLAIN DIGEST-MD5 NTLM”,其中包括当前实现支持的所有身份验证机制。 |
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 |
The NTLM authentication domain. |
mail.smtp.auth.ntlm.flags |
int |
NTLM protocol-specific flags. |
mail.smtp.submitter |
String |
在 MAIL FROM 命令中的 AUTH 标记中使用提交者。通常由邮件中继使用,以传递有关邮件原始提交者的信息。 |
mail.smtp.dsn.notify |
String |
RCPT 命令的 NOTIFY 选项。 NEVER 或 SUCCESS、FAILURE 和 DELAY(以逗号分隔)的某种组合。 |
mail.smtp.dsn.ret |
String |
MAIL 命令的 RET 选项。 FULL 或 HDRS。 |
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.quitwait |
boolean |
如果设置为 false,则发送 QUIT 命令并立即关闭连接。如果设置为 true(默认值),则会导致传输等待 QUIT 响应。 |
mail.smtp.reportsuccess |
boolean |
如果设置为 true,则会导致传输为每个成功的地址包含 SMTPAddressSucceededException。 |
mail.smtp.socketFactory |
Socket Factory |
如果设置为实现 javax.net.SocketFactory 接口的类,则此类将用于创建 SMTP 套接字。 |
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 检查服务器身份。默认值为 false。 |
mail.smtp.ssl.trust |
String |
如果设置,并且尚未指定套接字工厂,则允许使用 MailSSLSocketFactory。如果设置为“*”,则所有主机都是受信任的。如果设置为用空格分隔的主机列表,则这些主机是受信任的。否则,信任取决于服务器提供的证书。 |
mail.smtp.ssl.socketFactory |
SSL Socket Factory |
如果设置为扩展 javax.net.ssl.SSLSocketFactory 类,则此类将用于创建 SMTP SSL 套接字。 |
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.starttls.enable |
boolean |
如果为 true,则允许使用 STARTTLS 命令(如果服务器支持)在发出任何登录命令之前将连接切换到受 TLS 保护的连接。默认值为 false。 |
mail.smtp.starttls.required |
boolean |
如果为 true,则要求使用 STARTTLS 命令。如果服务器不支持 STARTTLS 命令或该命令失败,则 connect 方法将失败。默认值为 false。 |
mail.smtp.socks.host |
string |
指定将用于连接到邮件服务器的 SOCKS5 代理服务器的主机名。 |
mail.smtp.socks.port |
string |
指定 SOCKS5 代理服务器的端口号。如果代理服务器未使用标准端口号 1080,则只需要使用此端口号。 |
mail.smtp.mailextension |
String |
要附加到 MAIL 命令的扩展字符串。 |
mail.smtp.userset |
boolean |
如果设置为 true,则在 isConnected 方法中使用 RSET 命令而非 NOOP 命令。某些情况下,在执行多个 NOOP 命令后 sendmail 响应会很慢;使用 RSET 可以避免此 sendmail 问题。默认为 false。 |
一般来说,应用程序无需直接使用此包中的类。相反,它们应使用 javax.mail 包(及其子包)定义的 API。例如,应用程序绝不应直接构造 SMTPTransport 实例。相反,它们应使用 Session 方法 getTransport 检索适当的 Transport 对象。
有关如何使用 SMPT 服务器的示例请参阅第 Sending Emails 章。