JavaMail API - SMTP服务器

SMTP是简单邮件传输协议的首字母缩写.它是跨Internet协议(IP)网络的电子邮件(电子邮件)传输的Internet标准. SMTP使用TCP端口25.由SSL保护的SMTP连接以速记SMTPS为人所知,但SMTPS本身不是协议.

JavaMail API包 com.sun.mail.smtp ,用作访问SMTP服务器的SMTP协议提供程序.下表列出了此包中包含的类:

Class描述
SMTPMessage此类是MimeMessage类的特化,允许您指定各种SMTP选项和通过SMTP发送此邮件时将使用的参数.
SMTPSSLTransport此类使用SMTP over SSL实现传输抽象类用于消息提交和传输.
SMTPTransport此类使用SMTP实现传输抽象类以进行消息提交和传输.

下表列出了抛出的异常:

异常描述
SMTPAddressFailedException无法发送消息时抛出此异常.
SMTPAddressSucceededException mail.smtp.reportsuccess 属性为true时,此异常将链接到SendFailedException.
SMTPSenderFailedException当无法发送邮件时抛出此异常.
SMTPSendFailedException当无法发送邮件时抛出此异常.例外包括邮件服务器拒绝的发件人地址.

com.sun.mail.smtp 提供程序可选择使用SMTP身份验证.要使用SMTP身份验证,您需要设置 mail.smtp.auth 属性,或在连接到SMTP服务器时为SMTP传输提供用户名和密码.您可以使用以下方法之一执行此操作:

  • 在创建邮件会话时提供Authenticator对象并提供用户名验证器回调期间的密码和密码信息.可以将 mail.smtp.user 属性设置为提供回调的默认用户名,但仍需要明确提供密码.此方法允许您使用静态传输发送方法来发送消息.例如:

  •  
     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中设置会话对象.属性始终设置为字符串.例如:

props.put("mail.smtp.port","587");

这里 Type 列描述了字符串的解释方式.

名称类型描述
mail.smtp.user字符串SMTP的默认用户名.
mail.smtp.host字符串要连接的SMTP服务器.
mail .smtp.portint要连接的SMTP服务器端口,如果connect()方法未明确指定一个.默认为25.
mail.smtp.connectiontimeoutint套接字连接超时值,以毫秒为单位.默认为无限超时.
mail.smtp.timeoutint套接字I/O超时值毫秒.默认为无限超时.
mail.smtp.from字符串用于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字符串如果设置,则列出身份验证要考虑的机制.仅使用服务器支持并由当前实现支持的机制.默认为"LOGIN PLAIN DIGEST-MD5 NTLM",其中包括当前实现支持的所有身份验证机制.
mail.smtp.auth.login. disableboolean如果为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.submitterString要在MAIL FROM命令的AUTH标记中使用的提交者.邮件中继通常用于传递有关邮件原始提交者的信息.
mail.smtp.dsn.notify字符串RCPT命令的NOTIFY选项.永远,或者成功,失败和延迟的某种组合(用逗号分隔).
mail.smtp.dsn.retStringMAIL命令的RET选项. FULL或HDRS.
mail.smtp.sendpartialboolean如果设置为true,则为message有一些有效的和一些无效的地址,无论如何都要发送消息,用SendFailedException报告部分失败.如果设置为false(默认值),则如果收件人地址无效,则不会将邮件发送给任何收件人.
mail.smtp.sasl .enableboolean如果设置为true,请尝试使用javax.security.sasl包来选择登录的身份验证机制.默认为false.
mail.smtp.sasl.mechanismsString空格或逗号分隔列表尝试使用的SASL机制名称.
mail.smtp.sasl.authorizationidString在SASL身份验证中使用的授权标识.如果未设置,则使用身份验证ID(用户名).
mail.smtp.sasl.realmString用于DIGEST-MD5身份验证的领域.
mail.smtp.quitwaitboolean如果设置为false,则发送QUIT命令并立即关闭连接.如果设置为true(默认值),则导致传输等待对QUIT命令的响应.
mail.smtp.reportsuccessboolean如果设置为true,则导致传输为每个成功的地址包含SMTPAddressSucceededException.
mail.smtp.socketFactorySocket 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.portint指定要连接的端口使用指定的套接字工厂时.如果未设置,将使用默认端口.
mail.smtp.ssl.enableboolean如果设置为true,则默认情况下使用SSL连接并使用SSL端口.对于"smtp"协议,默认为false;对于"smtps"协议,默认为true.
mail.smtp.ssl.checkserveridentityboolean如果设置为true,则检查RFC 2595指定的服务器标识.默认为false.
mail.smtp.ssl .trustString如果设置,并且未指定套接字工厂,则启用MailSSLSocketFactory.
如果设置为"*",则所有主机都是如果设置为以空格分隔的主机列表,则这些主机是可信的.
否则,信任取决于服务器提供的证书.
mail.smtp.ssl.socketFactorySSL套接字工厂如果设置为扩展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.protocolsstring指定将为SSL连接启用的SSL协议.属性值是javax.net.ssl.SSLSocket.setEnabledProtocols方法可接受的以空格分隔的标记列表.
mail.smtp.starttls.enableboolean如果为true,则允许使用STARTTLS命令(如果服务器支持)在发出任何登录命令之前将连接切换到受TLS保护的连接.默认为false.
mail.smtp.starttls.requiredboolean如果为true,则需要使用STARTTLS命令.如果服务器不支持STARTTLS命令,或者命令失败,则connect方法将失败.默认为false.
mail.smtp.socks.hoststring指定a的主机名SOCKS5代理服务器,用于连接邮件服务器.
mail.smtp.socks.portstring指定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对象.