一、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);