一、SMTP协议
SMTP(Simple Mail Transfer Protocol)是因特网电子邮件传输的标准协议,使用TCP协议25号端口。JavaMail是Java EE平台上发送、接收电子邮件的API规范,JavaMail还实现了SMTP及IMAP等邮件协议。JavaMail发送电子邮件的过程就是使用SMTP协议与邮件服务器进行通信,传输邮件消息传输给对方。SMTP协议发送邮件需要实现以下几个步骤:
1、建立连接(connect):建立与邮件服务器连接,获取服务器连接的Socket对象。
2、握手(handshake):客户端和服务器通过交换特定的协议码来确认对方的身份和协议,以及对方邮件服务器是否开启SMTP服务,一般客户端在请求连接后会发送EHLO或HELO命令请求服务器确认身份并获取服务器支持的协议。
3、登录(login):进行SMTP用户认证,使用用户名和密码(如果SMTP服务器要求的话)。
4、设置发件人(set sender):使用MAIL FROM命令指定哪个邮件地址将作为发件人(MAIL FROM后面加上要发送邮件的发件人的邮件地址)。
5、设置收件人(set recipient):使用RCPT TO命令指定哪个邮件地址将作为收件人(RCPT TO后面加上要发送邮件的收件人的邮件地址)。
6、设置邮件内容(set content):使用DATA命令开始发送邮件内容,通过Socket输入流将邮件内容发送至服务器。
7、退出(quit):使用QUIT命令关闭SMTP连接。
二、JavaMail API
JavaMail API包含两个主要类库:
1、javax.mail: JavaMail中SMTP和IMAP协议的实现。
2、javax.mail.internet:该类库用于编码和解析Internet消息。它包括MIME(Multipurpose Internet Mail Extensions)处理的实现。
三、实现步骤
以下代码实现了基本邮件发送功能,其中SMTP_SERVER为邮件服务器地址,AUTH_USER和AUTH_PWD为邮件服务器账号和密码,TO_MAIL为收件人邮箱地址,FROM_MAIL为发件人邮箱地址,SUBJECT为邮件主题,BODY为邮件内容。
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
public class SendMail{
public static void main(String[] args) throws Exception{
final String SMTP_SERVER = "smtp.qq.com";
final String AUTH_USER = "example@qq.com";
final String AUTH_PWD = "password";
String TO_MAIL = "to@example.com";
String FROM_MAIL = "example@qq.com";
String SUBJECT = "邮件主题";
String BODY = "邮件内容";
//设置邮件会话属性
Properties props = new Properties();
props.put("mail.smtp.host", SMTP_SERVER);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.ssl.enable", "true");
props.setProperty("mail.smtp.port", "465");
// 获取会话对象
Session session = Session.getInstance(props, new javax.mail.Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(AUTH_USER, AUTH_PWD);
}
});
//设置邮件消息
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(FROM_MAIL));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_MAIL));
message.setSubject(SUBJECT);
message.setText(BODY);
//发送邮件
Transport.send(message);
System.out.println("邮件已发送至" + TO_MAIL);
}
}
四、其他实现方式
1、发送附件
以下代码实现了带附件的邮件发送功能,其中attachments为附件地址。
//设置邮件消息
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(FROM_MAIL));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_MAIL));
message.setSubject(SUBJECT);
// 创建整个邮件的容器描述数据对象
MimeMultipart multipart = new MimeMultipart();
// 添加邮件的文本内容
BodyPart contentPart = new MimeBodyPart();
contentPart.setText(BODY);
multipart.addBodyPart(contentPart);
// 添加附件
for(String filePath : attachments){
BodyPart attachmentPart = new MimeBodyPart();
File file = new File(filePath);
if (file.exists()) {
DataSource source = new FileDataSource(file);
attachmentPart.setDataHandler(new DataHandler(source));
attachmentPart.setFileName(MimeUtility.encodeText(file.getName()));
multipart.addBodyPart(attachmentPart);
}
}
// 将多重消息放到一个复合消息中
message.setContent(multipart);
//发送邮件
Transport.send(message);
2、HTML邮件
以下代码实现了HTML格式的邮件发送功能,其中HTML为HTML邮件内容。
//设置邮件消息 MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(FROM_MAIL)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_MAIL)); message.setSubject(SUBJECT); // 内容采用html方式并设置编码方式为utf-8 message.setContent(HTML, "text/html;charset=utf-8"); //发送邮件 Transport.send(message);
3、邮件模板
以下代码实现了使用Freemarker模板生成邮件内容并发送邮件的功能,其中templatePath为模板文件所在路径,data为模板数据。
//设置邮件消息
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(FROM_MAIL));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_MAIL));
message.setSubject(SUBJECT);
// 解析模板
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File(templatePath));
Template template = cfg.getTemplate("template.ftl");
StringWriter out = new StringWriter();
template.process(data, out);
String content = out.toString();
// 内容采用html方式并设置编码方式为utf-8
message.setContent(content, "text/html;charset=utf-8");
//发送邮件
Transport.send(message);
原创文章,作者:TGNKE,如若转载,请注明出处:https://www.506064.com/n/368647.html
微信扫一扫
支付宝扫一扫