一、概念
首先需要明白以下概念:
不需要深入了解他们是怎么工作的,记住关键字即可:
SMTP协议
:邮件发送协议POP3协议
:邮件接收协议IMAP协议
:邮件接收协议
也就是说,发送邮件一般有SMTP协议,接收邮件常用的有两种协议(POP3、IMAP)
网易邮箱中就提供了这两种组合给用户选择
所以,代码发送邮箱的过程如下:
我们要在程序中发送邮件,就必须有SMTP服务器,可以选择网易、Gmail等邮箱,并开启POP3/SMTP服务,用于充当我们的SMTP服务器,也可以自己搭建一个SMTP服务器。
二、Java中发送邮件
Java开发中,经常用sun公司的JavaMail
组件来进行邮件的发送。
项目地址为:JavaMail
1.导入
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
2.连接SMTP服务器
// 账号信息
String username = "邮箱账号";// 邮箱发送账号
String password = "邮箱授权码";// 邮箱授权码,从具体的邮箱平台获取
// 创建一个配置文件,并保存
Properties props = new Properties();
// SMTP服务器连接信息
// 126——smtp.126.com
// 163——smtp.163.com
// qqsmtp.qq.com"
props.put("mail.smtp.host", "smtp.126.com");// SMTP主机名
// 126——25
// 163——465
props.put("mail.smtp.port", "25");// 主机端口号
props.put("mail.smtp.auth", "true");// 是否需要用户认证
props.put("mail.smtp.starttls.enale", "true");// 启用TlS加密
3.创建Session会话
// 创建session会话
// 参数1:smtp服务器连接参数
// 参数2:账号和密码的授权认证对象
Session session = Session.getInstance(props,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username,password);
}
});
System.out.println(session);
4.发送纯文本邮件
//构造邮件主体
MimeMessage message = new MimeMessage(session);
message.setSubject(title);
message.setText(content);
message.setFrom(new InternetAddress(USERNAME));
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(toMail));
//发送
Transport.send(message);
5.发送带附件邮件
//构造邮件主体
MimeMessage message = new MimeMessage(session);
message.setSubject(title);
//邮件主体
BodyPart textPart = new MimeBodyPart();
textPart.setContent(content, "text/html;charset=utf-8");
//邮件附件
BodyPart filePart = new MimeBodyPart();
filePart.setFileName(fileName);
filePart.setDataHandler(new DataHandler(new ByteArrayDataSource(Files.readAllBytes(Paths.get(filePath)), "application/octet-stream")));
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(filePart);
message.setContent(multipart);
message.setFrom(new InternetAddress(USERNAME));
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(toMail));
//发送
Transport.send(message);
可以看到,这段代码构建TextPart的时候,格式支持HTML代码,如果要在邮件中展示图片,只需要在其中构造图片标签即可。
三、封装工具类
为了方便日常使用,构造成工具类,如下:
package com.potato.commonpro.util;
import javax.activation.DataHandler;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Properties;
/**
* JavaMail工具类,用于在Java中发送邮件
*/
public class JavaMailUtils {
public static String USERNAME = "hello@gmail.com"; // 邮箱发送账号
public static String PASSWORD = "sfws izbu tsac vxsz"; //邮箱平台的授权码
public static String HOST = "smtp.gmail.com"; // SMTP服务器地址
public static String PORT = "587"; //SMTP服务器端口
public static Session session = null;
/**
* 创建Sesssion
*/
public static void createSession() {
if (session != null) return;
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", HOST); //SMTP主机名
props.put("mail.smtp.port", PORT);
session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(USERNAME, PASSWORD);
}
});
}
/**
* 发送纯文本邮件,单人发送
*
* @param title
* @param content
* @param toMail
*/
public static void postMessage(String title, String content, String toMail) {
try {
createSession();
//构造邮件主体
MimeMessage message = new MimeMessage(session);
message.setSubject(title);
message.setText(content);
message.setFrom(new InternetAddress(USERNAME));
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(toMail));
//发送
Transport.send(message);
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
/**
* 发送带附件的邮件
*
* @param title
* @param content
* @param fileName
* @param filePath
* @param toMail
*/
public void postMessageWithFile(String title, String content, String fileName, String filePath, String toMail) {
try {
createSession();
//构造邮件主体
MimeMessage message = new MimeMessage(session);
message.setSubject(title);
//邮件主体
BodyPart textPart = new MimeBodyPart();
textPart.setContent(content, "text/html;charset=utf-8");
//邮件附件
BodyPart filePart = new MimeBodyPart();
filePart.setFileName(fileName);
filePart.setDataHandler(new DataHandler(new ByteArrayDataSource(Files.readAllBytes(Paths.get(filePath)), "application/octet-stream")));
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(filePart);
message.setContent(multipart);
message.setFrom(new InternetAddress(USERNAME));
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(toMail));
//发送
Transport.send(message);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}