使用JAVA工具类进行邮件发送
使用JAVA工具类进行邮件发送
前言
提示:我们在开发过程中,经常遇到发送邮件的需求,我们往往需要考虑怎么去开发,考虑关于邮件的兼容性,很多让人烦恼的关联事务。
提示:以下是本篇文章正文内容,下面案例可供参考
一、前期准备工作
准备账号开通支持smtp发送服务
大部分使用的邮箱有两种(QQ邮箱和163网易邮箱),这里分别介绍怎么进行开通smtp服务的。。
- QQ邮箱开通SMTP服务
使用QQ邮箱进行发送需要进行开通QQ邮箱的邮箱客户端授权服务,获取邮箱的客户端授权码(设置——>账户——>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务)。
2. 163邮箱开通SMTP服务
二、使用步骤
1.引入依赖
进行发送邮件的工具类我使用的是Hutool包里面的MailUtil进行发送邮件的。附:Hutool的工具包里面还包含大量的其他的工具类,有时间的伙伴可以参考一下。
<!-- 发送邮件引入的依赖 -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
<!-- 使用工具类 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.7</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
2.进行发送邮件
下面这些参数我只是在application.yml配置里面进行随便配置的参数,实际开发中可以转化为传参。
sendMail:
config:
mailFrom: 3175924***@QQ.com
mailTo: wlz1385137****@163.com
mailHost: smtp.qq.com #mailHost: smtp.163.com
mailPort: 465 #QQ的SSL传输端口是465/987,TCP的587 163的SSL 465/994 TCP:20
mailPass: jzlqdadpzknf**** #申请的POM/Smtp的授权码
mailTitle: 邮件发送的标题
mailContent: 邮件发送的正文
mailFile: D:\\Chrome_download\\发送邮件的附件.pdf #附件格式不受限制,但是多大的附件没有试过。
将参数进行读取到类中:
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
/**
* @ program: extis-second
* @ description: 发送邮件配置模拟发送邮件参数
* @ author: wanglianzeng
* @ create: 2021-08-06 16:46
**/
@Configuration
@Component
@Data
public class SendMailConfig {
@Value("${sendMail.config.mailFrom}")
private String mailFrom;
@Value("${sendMail.config.mailTo}")
private String mailTo;
@Value("${sendMail.config.mailHost}")
private String mailHost;
@Value("${sendMail.config.mailPort}")
private Integer mailPort;
@Value("${sendMail.config.mailPass}")
private String mailPass;
@Value("${sendMail.config.mailTitle}")
private String mailTitle;
@Value("${sendMail.config.mailContent}")
private String mailContent;
@Value("${sendMail.config.mailFile}")
private String mailFile;
}
进行发送邮件模块
//引入发送邮件配置
private final SendMailConfig sendMailConfig;
public SendEmailServiceImpl(SendMailConfig sendMailConfig) {
this.sendMailConfig = sendMailConfig;
}
/***
* @author wanglianzeng
* @description 开发过程中一般发送邮件的参数是进行加密传参的,还有传参的费控检验,这里不进行模拟;并且返回类型大多数是以枚举的格式进行封装的。
* @date 2021/8/15 13:19
* @return java.lang.String
**/
@Override
public String sendMail(){
//采用异步发送,如果涉及一对多发送邮件,有时间的或者有兴趣的同学可以研究一下并行异步CompletableFuture.supplyAsync()
ThreadUtil.execute(()->{
MailAccount mailAccount = creatMailAccount();
//读取附件,一般发送的附件也是通过传参
File file = FileUtil.file(sendMailConfig.getMailFile());
try {
//参数分别为:组装的发送邮件信息 邮件接收人邮箱 邮件的主题 邮件的正文 是否是页面 附件
String result = MailUtil.send(mailAccount, sendMailConfig.getMailTo(),
sendMailConfig.getMailTitle(), sendMailConfig.getMailContent(), true, file);
log.info("发送一件的结果是result=[{}]",result);
return result;
}catch (Exception e){
if (e instanceof MailException) {
final Throwable cause = e.getCause();
if (cause instanceof SendFailedException) {
log.error("收件人地址无效,请确认收件人");
}
}
}
return "发送异常";
});
}
/***
* @author wanglianzeng
* @description 发送邮件承载体
* @date 2021/8/15 13:50
* @return cn.hutool.extra.mail.MailAccount
**/
private MailAccount creatMailAccount() {
MailAccount mailAccount = new MailAccount();
mailAccount.setPass(sendMailConfig.getMailPass());
mailAccount.setFrom("test<"+sendMailConfig.getMailFrom()+">");
//发送邮件是否需要进行身份验证
mailAccount.setAuth(true);
mailAccount.setUser(sendMailConfig.getMailFrom());
mailAccount.setPort(sendMailConfig.getMailPort());
mailAccount.setHost(sendMailConfig.getMailHost());
return mailAccount;
}
发送邮件这里使用了工具类进行发送只供参考。实际开发中根据实际情况进行开发。