Java中邮箱的相关使用
项目中常常有一些场景需要发送邮箱, 整理一下使用邮箱的相关实现
1 Java中邮箱的简介
电子邮件在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议( Simple Mail Transfer Protocol) ,即简单邮件传输协议。
2 邮箱的使用
1 Java原生操作邮箱
1 导入maven坐标
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.6</version>
</dependency>
2 添加邮件工具类
public class MailTest {
// 发邮件账号
public static String sendEmailAccount = "[email protected]";
// 发邮箱账号授权码
public static String sendEmailPassword = "****";
// 发邮箱账号主机
public static String sendEmailSMTPHost = "smtp.163.com";
// 发邮箱协议
public static String sendEmailProtocol = "smtp";
// 邮件的标题
public static String sendEmailSubject = "邮件的标题";
// 邮件的内容
public static String sendEmailContext = "邮件的内容";
// 收邮箱账号
public static String receiveMailAccount = "[email protected]";
public static void main(String[] args) {
// 配置参数
Properties prop = new Properties();
// 发件人的邮箱的SMTP 服务器地址(不同的邮箱,服务器地址不同,如139和qq的邮箱服务器地址不同)
prop.setProperty("mail.host", sendEmailSMTPHost);
// 使用的协议(JavaMail规范要求)
prop.setProperty("mail.transport.protocol", sendEmailProtocol);
// 需要请求认证
prop.setProperty("mail.smtp.auth", "true");
// 使用JavaMail发送邮件的5个步骤
// 1 创建session
Session session = Session.getInstance(prop);
// 开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
Transport ts = null;
try {
// 2 通过session得到transport对象
ts = session.getTransport();
// 3 使用账户和授权码
ts.connect(sendEmailSMTPHost, sendEmailAccount, sendEmailPassword);
// 4 创建邮件
Message message = createSimpleMail(session);
// 5 发送邮件
ts.sendMessage(message, message.getAllRecipients());
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} finally {
try {
// 关闭transport对象
ts.close();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
/**
* 创建只包含文本的邮件
*
* @param session
* @return
* @throws MessagingException
*/
public static MimeMessage createSimpleMail(Session session)
throws MessagingException {
// 创建邮件对象
MimeMessage message = new MimeMessage(session);
// 指明发件人
message.setFrom(new InternetAddress(sendEmailAccount));
// 指明收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiveMailAccount));
// 可选 添加收件人
// message.addRecipient(Message.RecipientType.TO, new InternetAddress(receiveMailAccount));
// Cc: 抄送(可选)
// message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress(receiveMailAccount));
// Bcc: 密送(可选)
// message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress(receiveMailAccount));
// 邮件的标题
message.setSubject(sendEmailSubject,"UTF-8");
// 邮件的文本内容
message.setContent(sendEmailContext, "text/html;charset=UTF-8");
// 设置显示发件时间
message.setSentDate(new Date());
return message;
}
/**
* 创建包含文本和附件的邮件
*
* @param session
* @return
* @throws MessagingException
*/
public static MimeMessage createFileMail(Session session)
throws MessagingException {
// 创建邮件对象
MimeMessage message = new MimeMessage(session);
// 指明发件人
message.setFrom(new InternetAddress(sendEmailAccount));
// 指明收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiveMailAccount));
// 可选 添加收件人
// message.addRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));
// Cc: 抄送(可选)
// message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress(receiveMailAccount));
// Bcc: 密送(可选)
// message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress(receiveMailAccount));
// 邮件的标题
message.setSubject(sendEmailSubject,"UTF-8");
// 邮件的文本内容
// message.setContent(sendEmailContext, "text/html;charset=UTF-8");
// 设置显示发件时间
message.setSentDate(new Date());
// 创建消息部分
BodyPart messageBodyPart = new MimeBodyPart();
// 消息
messageBodyPart.setText("This is message body");
// 创建多重消息
MimeMultipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
// 附件部分
messageBodyPart = new MimeBodyPart();
String filePath = "C:\\Users\\YC01369\\Desktop\\file.txt";
String fileName = "file.txt";
DataSource source = new FileDataSource(filePath);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(fileName);
multipart.addBodyPart(messageBodyPart);
// 发送完整消息
message.setContent(multipart);
return message;
}
2 SpringBoot中操作邮箱
0 准备一个好的SpringBoot环境
1 添加maven坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2 添加发送邮箱接口
public interface MailService {
/**
* 发送邮件
* @param to 接收者 邮件接收地址
* @param subject 主题 邮件标题
* @param content 内容 邮件正文
* @param os 附件
* @param attachmentFilename 附件名称
* @throws Exception
*/
public void sendMail(String to, String subject, String content, ByteArrayOutputStream os,
String attachmentFilename) throws Exception;
}
3 添加发送邮箱实现类
@Component
@Slf4j
public class MailServiceImpl implements MailService {
@Autowired
private JavaMailSender mailSender;
@Value("${mail.fromMail.addr}")
private String from;
/**
*
* @param to 接收者 邮件接收地址
* @param subject 主题 邮件标题
* @param content 内容 邮件正文
* @param os 附件
* @param attachmentFilename 附件名称
* @throws Exception
*/
@Override
public void sendMail(String to, String subject, String content, ByteArrayOutputStream os,
String attachmentFilename) throws Exception {
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content);
// 判断附件是否存在
if (null != os){
InputStreamSource inputStreamSource = new ByteArrayResource(os.toByteArray());
mimeMessageHelper.addAttachment(attachmentFilename, inputStreamSource);
}
mailSender.send(mimeMessage);
log.info("邮件发送完成");
} catch (Exception e) {
log.error("邮件发送失败 , ={}",e);
}
}
}
4 添加配置文件
# 邮箱服务器地址
spring.mail.host=smtp.163.com
# 用户名
[email protected]
# 密码
spring.mail.password=******
spring.mail.default-encoding=UTF-8
#spring.mail.port=587 # 使用报错
spring.mail.port=25 # 使用ok
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
# 来发送邮件账号
[email protected]
5 添加一个控制器
@Controller
@RequestMapping("/hello")
public class HelloWorld {
public static String sendEmailSubject = "邮件的标题";
public static String sendEmailContext = "邮件的内容";
public static String receiveMailAccount = "[email protected]";
@Autowired
private MailService mailService;
@GetMapping("/sendMail")
@ResponseBody
public String sendMail() throws Exception {
// 邮件接受者 邮件标题 邮件内容 附件 附件名称
mailService.sendMail(receiveMailAccount,sendEmailSubject,sendEmailContext,null,"");
return "<h1>Hello Wrold</h1>";
}
}
6 测试
在地址栏访问:
http://localhost:8080/hello/sendMail
控制台日志:
// 2021-11-01 18:04:41.535 INFO 16576 --- [nio-8080-exec-1] c.cf.demo.service.impl.MailServiceImpl : 邮件发送完成
查看邮箱,邮件已送达.
3 错误问题
1 smtp.SMTPSendFailedException: 553 Mail from must equal authorized user
发邮件的人的账号填写错误, 要和授权码的账户一致.
// 接收邮件服务器:imap.qq.com,使用SSL,端口号993。
// 发送邮件服务器:smtp.qq.com,使用SSL,端口号465或587。 使用25时成功
参考资料:
https://www.cnblogs.com/new-life/p/10549837.html