JavaMail API - SMTP 服务器
SMTP 是简单邮件传输协议的缩写。它是跨 Internet 协议 (IP) 网络传输电子邮件 (e-mail) 的 Internet 标准。SMTP 使用 TCP 端口 25。SSL 保护的 SMTP 连接简称为 SMTPS,尽管 SMTPS 本身不是一种协议。
JavaMail API 有包 com.sun.mail.smtp,它充当 SMTP 协议提供程序来访问 SMTP 服务器。下表列出了此包中包含的类:
类 | 描述 |
---|---|
SMTPMessage | 此类是 MimeMessage 类的特化,允许您指定通过 SMTP 发送此消息时将使用的各种 SMTP 选项和参数。 |
SMTPSSLTransport | 此类使用 SMTP over SSL 实现 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 发送方法发送消息。例如:
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");
此处的 Type 列描述了如何解释字符串。
名称 | 类型 | 描述 |
---|---|---|
mail.smtp.user | String | SMTP 的默认用户名。 |
mail.smtp.host | String | 要连接的 SMTP 服务器。 |
mail.smtp.port | int | 要连接的 SMTP 服务器端口(如果 connect() 方法未明确指定)。默认为 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 | NTLM 身份验证域。 |
mail.smtp.auth.ntlm.flags | int | NTLM 协议特定标志。 |
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 命令。在某些情况下,sendmail 在许多 NOOP 命令之后会响应缓慢;使用 RSET 可避免此 sendmail 问题。默认为 false。 |
通常,应用程序不需要直接使用此包中的类。相反,它们应该使用 javax.mail 包(及其子包)定义的 API。例如,应用程序永远不应直接构造 SMTPTransport 的实例。相反,他们应该使用 Session 方法 getTransport 来获取适当的 Transport 对象。
使用 SMPT 服务器的示例在发送电子邮件一章中进行了演示。