什么是 SMTP 协议
SMTP或简单的邮件传输协议,是一种将电子邮件从一台服务器发送到另一台服务器的快速简便的方法。通过 SendGrid 等第三方服务商提供的SMTP服务,我们可以通过第三方服务器而不是客户端或服务器来传递电子邮件。
要了解 SMTP 协议, 我们使用Telnet发送测试SMTP电子邮件
$ telnet smtp.sendgrid.net 25
Trying 169.45.113.201...
Connected to smtp.sendgrid.net.
Escape character is '^]'.
220 SG ESMTP service ready at ismtpd0009p1sjc2.sendgrid.net
AUTH LOGIN #成功连接到SendGrid后,通过键入登录到服务器AUTH LOGIN。
334 VXNlcm5hbWU6 #邮件服务器以回应334 VXNlcm5hbWU6,即对您的用户名进行Base64编码的请求。
YXBpa2V5 #apikey即用户名的加密
334 UGFzc3dvcmQ6 #此响应是对您的密码(您的API密钥)的Base64编码请求。
??????????????? #在下一行中输入您的Base64转换后的API密钥作为密码。
235 Authentication successful #邮件服务器以响应235 Authentication successful。到此为止表示您通过选定端口到smtp.sendgrid.net的连接已打开,并且您的API密钥有效。
通过SMTP协议, 编写客户端向邮件服务器提交发送邮件请求
package mail
import javax.mail.internet.MimeMessage
import java.util.Properties
import javax.mail.Session
import javax.mail.Message
import javax.mail.Transport
import java.util.Date
import javax.mail.MessagingException
fun main() {
val props = Properties();
// SMTP 邮件服务器名称
props.put("mail.smtp.host", "smtp.139.com");
//props.put("mail.smtp.port", "25");
val session = Session.getInstance(props, null);
try {
val msg = MimeMessage(session);
// 发件人
val me = "me@139.com"
msg.setFrom(me);
// 收件人
msg.setRecipients(Message.RecipientType.TO, "test@qq.com")
msg.setSubject("subject")
// 发送日期
msg.setSentDate(Date())
// 正文
msg.setText("content");
// SMTP 邮件服务器认证账号&密码
Transport.send(msg, me, "139pswd");
println("发送OK")
} catch (e: Throwable) {
println("发送失败 ${ e.message }");
e.printStackTrace()
}
}