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当邮件无法发送时,将抛出此异常。
SMTPAddressSucceededExceptionmail.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.socketFactorySSL 套接字工厂如果设置为扩展 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 服务器的示例在第 发送电子邮件 章中进行了演示。

广告