JavaMail - SMTP 服务

  • 简述

    SMTP 是以下的首字母缩写词Simple Mail Transfer Protocol.它是跨 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.reportsucces属性为 tru时,此异常与 SendFailedException 相关
    SMTPSenderFailedException 无法发送消息时抛出此异常
    SMTPSendFailedException 当邮件无法发送时抛出此异常。异常包括发件人地址,邮件服务器拒绝了该地址
    com.sun.mail.smtp提供商可选择使用 SMTP 身份验证要使用 SMTP 身份验证,您需要设mail.smtp.aut属性或在连接到 SMTP 服务器时为 SMTP 传输提供用户名和密码您可以使用以下方法之一执行此操作
    • 在创建邮件会话时提供 Authenticator 对象,并在 Authenticator 回调期间提供用户名和密码信息mail.smtp.use属性可以设置为回调提供默认用户名,但仍然需要明确提供密码这种方法允许您使用静态传输发送方法来发送消息例如
    • 
      Transport.send(message);
      
    • 使用用户名和密码参数显式调用传输连接方法例如:
      
      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 命令登录默认为真
    mail.smtp.auth boolean 如果为 true,则尝试使用 AUTH 命令对用户进行身份验证默认为假
    mail.smtp.auth.mechanisms String 如果设置,则列出要考虑的身份验证机制仅使用服务器支持和当前实现支持的机制默认值为“LOGIN PLAIN DIGEST-MD5 NTLM”,其中包括当前实现支持的所有身份验证机制
    mail.smtp.auth.login.disable boolean 如果为 true,则阻止使用 AUTH LOGIN 命令默认为假
    mail.smtp.auth.plain.disable boolean 如果为 true,则阻止使用 AUTH PLAIN 命令默认为假
    mail.smtp.auth.digest-md5.disable boolean 如果为 true,则阻止使用 AUTH DIGEST-MD5 命令默认为假
    mail.smtp.auth.ntlm.disable boolean 如果为 true,则阻止使用 AUTH NTLM 命令默认为假
    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 包来选择登录的身份验证机制默认为假
    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 类创建套接字默认为真
    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 保护的连接默认为假
    mail.smtp.starttls.required boolean 如果为 true,则需要使用 STARTTLS 命令如果服务器不支持 STARTTLS 命令,或者命令失败,则连接方法将失败默认为假
    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 问题默认为假
    一般来说,应用程序不需要直接使用这个包中的类相反,他们应该使用 javax.mail 包(和子包)定义的 API例如,应用程序永远不应该直接构造 SMTPTransport 的实例相反,他们应该使用 Session 方法 getTransport 来获取适当的 Transport 对象
    使用 SMPT 服务器的示例发送电子邮一章中演