SMTP服务器(SMTP Servers)
优质
小牛编辑
136浏览
2023-12-01
SMTP是Simple Mail Transfer Protocol的首字母缩写。 它是跨Internet协议(IP)网络的电子邮件(电子邮件)传输的Internet标准。 SMTP使用TCP端口25.由SSL保护的SMTP连接以速记SMTPS为人所知,尽管SMTPS本身不是协议。
JavaMail API具有包com.sun.mail.smtp ,它作为SMTP协议提供程序来访问SMTP服务器。 下表列出了此包中包含的类:
类 | 描述 |
---|---|
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对象,并在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 | 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命令登录。 默认为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协议特定的标志。 |
mail.smtp.submitter | String | 要在MAIL FROM命令的AUTH标记中使用的提交者。 通常由邮件中继使用来传递有关邮件的原始提交者的信息。 |
mail.smtp.dsn.notify | String | RCPT命令的NOTIFY选项。 永远不会,或成功,失败和延迟的某种组合(以逗号分隔)。 |
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(用户名)。 |
mail.smtp.sasl.realm | String | 与DIGEST-MD5身份验证一起使用的领域。 |
mail.smtp.quitwait | boolean | 如果设置为false,则发送QUIT命令并立即关闭连接。 如果设置为true(默认值),则导致传输等待对QUIT命令的响应。 |
mail.smtp.reportsuccess | boolean | 如果设置为true,则导致传输为每个成功的地址包含SMTPAddressSucceededException。 |
mail.smtp.socketFactory | 套接字工厂 | 如果设置为实现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套接字工厂 | 如果设置为扩展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命令。 在某些情况下,sendmail会在许多NOOP命令后缓慢响应; 使用RSET避免了这个sendmail问题。 默认为false。 |
通常,应用程序不需要直接使用此包中的类。 相反,他们应该使用javax.mail包(和子包)定义的API。 比如说,应用程序永远不应该直接构造SMTPTransport的实例。 相反,他们应该使用Session方法getTransport来获取适当的Transport对象。
使用SMPT服务器的示例在发送电子邮件一章中进行了演示。