本文总结如何通过java实现邮件接口的定时发送任务。
1、邮箱服务器地址和端口
以139邮箱为例,获取服务器地址和端口。139邮箱的路径:设置-常见设置-邮箱协议设置
2、客户端配置
工具:springboot2.4.3使用maven,使用java11
pom.xml引入mail第三方工具
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
application.yml配置
spring :
mail:
host: smtp.139.com
port: 465
password: XXXXX
username: 13XXXXXX@139.com
default-encoding: UTF-8
properties:
mail.smtp.auth: true
mail.smtp.socketFactory.fallback : true
mail.smtp.socketFactory.class : javax.net.ssl.SSLSocketFactory
mail.smtp.socketFactory.port : 465
mail.smtp.port : 465
3、发送邮件的util类
1)简单的文本
引入JavaMailSender,新建邮件发送util类,发送简单的文本邮件
import org.springframework.mail.javamail.JavaMailSender;
@Service
public class SendmailImpl{
@Autowired
private JavaMailSender mailSender;
@Value("${spring.mail.username}") //发送人的邮箱 比如13XXXXXX@139.com
private String from;
/**
* *发送简单的文本邮件
* @param title
* @param content
* @param email
*/
public void sendSimpleMail(String title,String content,String email) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);//发送人邮箱
message.setSubject(title);//标题
message.setTo(email);//对方邮箱
message.setText(content);//内容
mailSender.send(message);
}
}
2)多个收件人
引入一个MimeMessageHelper,增加多个收件人的功能支撑
/**
* *多个收件人
* @param title
* @param content
* @param email
* @throws MessagingException
*/
public void sendBatchMai(String title,String content,String[] email) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message,true);
helper.setFrom(from);
helper.setSubject(title);
helper.setText(content,true);
//多个收件人
List<InternetAddress> list = new ArrayList<InternetAddress>();// 不能使用string类型的类型,这样只能发送一个收件人
for(int i=0;i<email.length;i++) {
list.add(new InternetAddress(email[i]));
}
InternetAddress[] address = list.toArray(new InternetAddress[list.size()]);
message.setRecipients(Message.RecipientType.TO, address);
message = helper.getMimeMessage();
mailSender.send(message);
}
3)文件流发附件
运用装饰器(Decorator)模式,将InputStream接口转换为InputStreamSource接口。首先将InputStream转换byte[] ,再转换为ByteArrayResource,而ByteArrayResource的接口就是InputStreamSource。
/**
* 文件流发邮件
* @param title 邮件标题
* @param content 邮件内容
* @param to 收件人
* @param attachmentFilenameList 文件名的list列表
* @param inputStreamList 附件文件流的list列表
* @param copyto 抄送人
* @throws Exception
*/
public void sendMailStream(String title,String content,String[] to,String attachmentFilename,List<InputStream> inputStreamList) {
//true表示需要创建一个multipart message
MimeMessageHelper helper;
try {
MimeMessage message = mailSender.createMimeMessage();
helper = new MimeMessageHelper(message,true,"utf-8");
helper.setFrom(from);
helper.setSubject(title);
helper.setText(content,true);//启用html
helper.setTo(to);
//文件附件
if(attachmentFilename!=null) {
helper.addAttachment(attachmentFilename, new ByteArrayResource(IOUtils.toByteArray(inputStreamList.get(0))));
}
message = helper.getMimeMessage();
mailSender.send(message);
} catch (MessagingException e) {
// TODO Auto-generated catch block
// logger.error(e.getLocalizedMessage());
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
// logger.error(e.getLocalizedMessage());
e.printStackTrace();
}
}
4)全家桶
包括多个收件,附件以及文件内容的支持
/**
* *邮件发送全
* @param title 标题
* @param content 内容
* @param email 发件人地址
* @param file 附件
* @throws Exception
*/
public void sendMail(String title,String content,String[] email,List<File> attaches) throws Exception {
MimeMessage message = mailSender.createMimeMessage();
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message,true,"utf-8");
helper.setFrom(from);
helper.setSubject(title);
helper.setText(content,true);
//文件附件
if(attaches.size()>0) {
for(File file : attaches) {
helper.addAttachment(MimeUtility.encodeText(file.getName()), file);
}
}
//多个收件人
List<InternetAddress> list = new ArrayList<InternetAddress>();// 不能使用string类型的类型,这样只能发送一个收件人
for(int i=0;i<email.length;i++) {
list.add(new InternetAddress(email[i]));
}
InternetAddress[] address = list.toArray(new InternetAddress[list.size()]);
message.setRecipients(Message.RecipientType.TO, address);
message = helper.getMimeMessage();
mailSender.send(message);
}