1.配置
导入依赖以及在yml中写好邮箱的配置信息
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
mail:
host: smtp.exmail.qq.com //QQ 邮件服务器
username: 用户名
password: 密码
properties.mail.smtp.port: 465
from: 发件人邮箱
properties.mail.smtp.starttls.enable: true
properties.mail.smtp.starttls.required: true
properties.mail.smtp.ssl.enable: true
default-encoding: utf-8
2.获取自己的附件
这一步根据自己的业务代码获取需要发送邮件的附件文件,(流的格式)
ByteArrayOutputStream byteArrayOutputStream = fileUtilService.getFile(fileName);
//将获取的文件流转换为邮件service方法的参数ByteArrayInputStream格式
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
3.文件名参数拼接
//发送的文件名为:`附件名称-20220101.pdf`
Calendar calendar = Calendar.getInstance();
StringBuilder timeString = new StringBuilder();
timeString.append(“附件名称”);
timeString.append("-");
timeString.append(calendar.get(Calendar.YEAR));
timeString.append(calendar.get(Calendar.MONTH)+1);
timeString.append(calendar.get(Calendar.DATE));
timeString.append(".pdf");
4.调用emailService发送邮件的方法
// 参数分别为: 发送邮箱,邮件主题,邮件正文,邮件名称,附件流
Boolean isSuccess = emailService.sendAttachmentsMail(getEmail(), EMAIL_SUBJECT,
EMAIL_CONTENT_NAMEPREFIX + name + EMAIL_CONTENT,
timeString.toString(), byteArrayResource);
5.发送邮箱业务层代码Impl
@Service
@Log
public class EmailServiceImpl implements EmailService,EmailRpcService {
//静态代码块用于设置附件名编码和长度自动切割的问题,可以解决文件名后缀错误(***.bin)问题
static {
System.setProperty("mail.mime.splitlongparameters", "false");
System.setProperty("mail.mime.charset", "UTF-8");
}
@Autowired
private JavaMailSender javaMailSender;
//value注解读取yml文件的邮箱配置信息
@Value("${spring.mail.from}")
private String from;
@Value("${spring.mail.host}")
private String host;
@Value("${spring.mail.username}")
private String username;
@Value("${spring.mail.password}")
private String password;
@Value("${spring.mail.properties.mail.smtp.port}")
private String port;
@Override
public void sendSimpleMail(String to, String subject, String content) {
}
@Override
public void sendHtmlMail(String to, String subject, String content) {
}
@Override
public Boolean sendAttachmentsMail(String to, String subject, String content,String fileName ,ByteArrayResource byteArrayResource) {
log.info("==========================发送邮件==========================");
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper;
try {
messageHelper = new MimeMessageHelper(message,true,"utf-8");
messageHelper.setFrom(from);
messageHelper.setTo(to);
messageHelper.setSubject(subject);
messageHelper.setText(content,true);
filePath.substring(filePath.lastIndexOf(File.separator))
messageHelper.addAttachment(MimeUtility.encodeText(fileName,"utf-8","B"),byteArrayResource);
javaMailSender.send(message);
log.info("邮件发送成功!");
return true;
} catch (MessagingException e) {
log.info("发送失败:"+e);
return false;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
log.info("发送失败:"+e);
return false;
}
}
6.注意在emailService上的static静态代码块里的内容,这个是设置文件名编码和文件名分割内容的设置,挺必要的,因为我一开始写出来的时候,自己测试没有出现什么问题,当时也没有加这两行设置,但是测试人员测试的时候发现,文件名可能会因为文件名过长或者存在某些特殊字符使得最后邮件内附件的文件名不完全正确,后缀变成了乱码+.bin,造成文件打不开的原因。。。加上这两行配置代码后功能实现就正常了!