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当无法发送邮件时,会抛出此异常。
SMTPAddressSucceededExceptionmail.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.userStringSMTP 的默认用户名。
mail.smtp.hostString要连接的 SMTP 服务器。
mail.smtp.portint要连接的 SMTP 服务器端口(如果 connect() 方法未明确指定)。默认为 25。
mail.smtp.connectiontimeoutint套接字连接超时值(以毫秒为单位)。默认为无限超时。
mail.smtp.timeoutint套接字 I/O 超时值(以毫秒为单位)。默认为无限超时。
mail.smtp.fromString用于 SMTP MAIL 命令的电子邮件地址。这将设置信封返回地址。默认为 msg.getFrom() 或 InternetAddress.getLocalAddress()。
mail.smtp.localhostStringSMTP HELO 或 EHLO 命令中使用的本地主机名。默认为 InetAddress.getLocalHost().getHostName()。如果您的 JDK 和名称服务配置正确,通常不需要设置。
mail.smtp.localaddressString创建 SMTP 套接字时要绑定到的本地地址(主机名)。默认为 Socket 类选择的地址。通常不需要设置。
mail.smtp.localportint创建 SMTP 套接字时要绑定到的本地端口号。默认为 Socket 类选择的端口号。
mail.smtp.ehloboolean如果为 false,则不尝试使用 EHLO 命令登录。默认为 true。
mail.smtp.authboolean如果为 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.disableboolean如果为 true,则阻止使用 AUTH PLAIN 命令。默认值为 false。
mail.smtp.auth.digest-md5.disableboolean如果为 true,则阻止使用 AUTH DIGEST-MD5 命令。默认为 false。
mail.smtp.auth.ntlm.disableboolean如果为 true,则阻止使用 AUTH NTLM 命令。默认为 false。
mail.smtp.auth.ntlm.domainStringNTLM 身份验证域。
mail.smtp.auth.ntlm.flagsintNTLM 协议特定标志。
mail.smtp.submitter StringMAIL FROM 命令中 AUTH 标记中使用的提交者。通常由邮件中继用来传递有关邮件原始提交者的信息。
mail.smtp.dsn.notify StringRCPT 命令的 NOTIFY 选项。NEVER,或 SUCCESS、FAILURE 和 DELAY 的某种组合(以逗号分隔)。
mail.smtp.dsn.retStringMAIL 命令的 RET 选项。 FULL 或 HDRS。
mail.smtp.sendpartialboolean如果设置为 true,并且邮件包含一些有效地址和一些无效地址,则无论如何都会发送邮件,并使用 SendFailedException 报告部分失败。如果设置为 false(默认值),如果收件人地址无效,则不会将邮件发送给任何收件人。
mail.smtp.sasl.enableboolean如果设置为 true,则尝试使用 javax.security.sasl 包选择登录的身份验证机制。默认为 false。
mail.smtp.sasl.mechanismsString尝试使用的 SASL 机制名称的空格或逗号分隔列表。
mail.smtp.sasl.authorizationid StringSASL 身份验证中使用的授权 ID。如果未设置,则使用身份验证 ID(用户名)。
mail.smtp.sasl.realmString与 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.classString如果设置,则指定实现 javax.net.SocketFactory 接口的类的名称。此类将用于创建 SMTP 套接字。
mail.smtp.socketFactory.fallbackboolean如果设置为 true,则使用指定的套接字工厂类创建套接字失败将导致使用 java.net.Socket 类创建套接字。默认为 true。
mail.smtp.socketFactory.port int指定使用指定套接字工厂时要连接的端口。如果未设置,则将使用默认端口。
mail.smtp.ssl.enableboolean如果设置为 true,则使用 SSL 进行连接并默认使用 SSL 端口。对于"smtp"协议,默认为 false,对于"smtps"协议,默认为 true。
mail.smtp.ssl.checkserveridentityboolean如果设置为 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.classString如果设置,则指定扩展 javax.net.ssl.SSLSocketFactory 类的类的名称。该类将用于创建 SMTP SSL 套接字。
mail.smtp.ssl.socketFactory.portint指定使用指定套接字工厂时要连接的端口。如果未设置,则将使用默认端口。
mail.smtp.ssl.protocols string指定将为 SSL 连接启用的 SSL 协议。该属性值是一个空格分隔的 javax.net.ssl.SSLSocket.setEnabledProtocols 方法可接受的令牌列表。
mail.smtp.starttls.enable boolean如果为 true,则允许使用 STARTTLS 命令(如果服务器支持)在发出任何登录命令之前将连接切换到受 TLS 保护的连接。默认为 false。
mail.smtp.starttls.requiredboolean如果为 true,则要求使用 STARTTLS 命令。如果服务器不支持 STARTTLS 命令,或者命令失败,则 connect 方法将失败。默认为 false。
mail.smtp.socks.hoststring指定用于连接到邮件服务器的 SOCKS5 代理服务器的主机名。
mail.smtp.socks.port string指定 SOCKS5 代理服务器的端口号。仅当代理服务器未使用标准端口号 1080 时才需要使用此选项。
mail.smtp.mailextensionString附加到 MAIL 命令的扩展字符串。
mail.smtp.usersetboolean如果设置为 true,则在 isConnected 方法中使用 RSET 命令而不是 NOOP 命令。在某些情况下,sendmail 在许多 NOOP 命令之后会响应缓慢;使用 RSET 可避免此 sendmail 问题。默认为 false。

通常,应用程序不需要直接使用此包中的类。相反,它们应该使用 javax.mail 包(及其子包)定义的 API。例如,应用程序永远不应直接构造 SMTPTransport 的实例。相反,他们应该使用 Session 方法 getTransport 来获取适当的 Transport 对象。

使用 SMPT 服务器的示例在发送电子邮件一章中进行了演示。