- JavaMail API 教程
- JavaMail - 首页
- JavaMail API - 概述
- JavaMail - 环境设置
- JavaMail - 核心类
- JavaMail - 发送邮件
- JavaMail - 检查邮件
- JavaMail - 获取邮件
- JavaMail - 身份验证
- JavaMail - 回复邮件
- JavaMail - 转发邮件
- JavaMail - 删除邮件
- JavaMail - Gmail SMTP 服务器
- JavaMail - 文件夹管理
- JavaMail - 配额管理
- JavaMail - 退信
- JavaMail API 协议
- JavaMail - SMTP 服务器
- JavaMail - IMAP 服务器
- JavaMail - POP3 服务器
- JavaMail API 有用资源
- JavaMail - 快速指南
- JavaMail - 有用资源
- JavaMail - 讨论
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 | 当邮件无法发送时,将抛出此异常。 |
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 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.socketFactory | SSL 套接字工厂 | 如果设置为扩展 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 服务器的示例在第 发送电子邮件 章中进行了演示。