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 传输提供用户名和密码。您可以使用以下方法之一执行此操作:

  1. 在创建邮件会话时提供 Authenticator 对象,并在 Authenticator 回调期间提供用户名和密码信息。可以设置 mail.smtp.user 属性以提供回调的默认用户名,但仍需要明确提供密码。通过这种方法,您可以使用静态传输 send 方法来发送消息。例如:

  2. 使用用户名和密码参数明确调用 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 章。