(今天开发的项目功能中,需要通过Email发送协议附件)
Java发送邮件代码实现
引入依赖
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
public class EmailService {
private static final Logger logger = LoggerFactory.getLogger(EmailService.class);
private final transient Properties props = System.getProperties();
@Resource
private EmailClientProperties emailClientProperties;
public EmailSendResp sendMail(EmailSendReq request) {
EmailSendResp response = new EmailSendResp();
try {
Session session = this.initSession();
// 创建mime类型邮件
final MimeMessage message = new MimeMessage(session);
// 设置发信人
message.setFrom(new InternetAddress(emailClientProperties.getUserName()));
// 设置收件人
List<String> receiveEmailList = request.getReceiveEmailList();
int num = receiveEmailList.size();
InternetAddress[] addresses = new InternetAddress[num];
for (int i = 0; i < num; i++) {
logger.info("向:【{}】发送邮件:【{}】", receiveEmailList.get(i), request.getSubject());
addresses[i] = new InternetAddress(receiveEmailList.get(i));
}
message.setRecipients(MimeMessage.RecipientType.TO, addresses);
if (CollectionUtils.isNotEmpty(request.getCopyEmailList())) {
List<String> copyEmailList = request.getCopyEmailList();
int size = copyEmailList.size();
InternetAddress[] ccAddresses = new InternetAddress[size];
for (int i = 0; i < num; i++) {
logger.info("向:【{}】抄送邮件:【{}】", copyEmailList.get(i), request.getSubject());
ccAddresses[i] = new InternetAddress(copyEmailList.get(i));
}
message.setRecipients(MimeMessage.RecipientType.CC, ccAddresses);
}
// 设置主题
message.setSubject(request.getSubject(), "UTF-8");
// 设置邮件内容
Multipart multipart = new MimeMultipart();
//--设置文本内容
MimeBodyPart textPart = new MimeBodyPart();
textPart.setText(request.getContent());
multipart.addBodyPart(textPart);
//--设置附件
List<Map<String, String>> fileList = request.getFileBase64List();
if (CollectionUtils.isNotEmpty(request.getFileBase64List())) {
fileList.forEach(item -> {
for (Map.Entry<String, String> entry : item.entrySet()) {
try {
MimeBodyPart filePart = new MimeBodyPart();
byte[] bytes = Base64.getDecoder().decode(entry.getValue());
DataSource source = new ByteArrayDataSource(bytes, "application/octet-stream");
filePart.setDataHandler(new DataHandler(source));
filePart.setFileName(MimeUtility.encodeText(entry.getKey()));
multipart.addBodyPart(filePart);
} catch (MessagingException | UnsupportedEncodingException e) {
logger.error("邮件发送-附件设置异常", e);
throw new BizException("邮件服务异常");
}
}
});
}
message.setContent(multipart);
// 发送
Transport.send(message);
response.setCode(HttpStatus.SC_OK);
} catch (Exception e) {
logger.error("邮件发送异常", e);
response.setCode(HttpStatus.SC_INTERNAL_SERVER_ERROR);
String message = "邮件服务异常";
if (e instanceof BizException) {
message = e.getMessage();
}
response.setMessage(message);
}
return response;
}
private Session initSession() {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
if (YesOrNoEnum.YES.getCode().equals(emailClientProperties.getIsSsl())) {
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.smtp.host", emailClientProperties.getSmtpHostName());
props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.port", DataUtil.StringUtil(emailClientProperties.getSmtpPort()));
props.setProperty("mail.smtp.socketFactory.port", DataUtil.StringUtil(emailClientProperties.getSmtpPort()));
props.setProperty("mail.smtp.auth", "true");
} else {
props.put("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocol", "smtp");
props.put("mail.smtp.port", emailClientProperties.getSmtpPort());
props.put("mail.smtp.host", emailClientProperties.getSmtpHostName());
}
// 创建session
Session session = Session.getDefaultInstance(props, new Authenticator() {
//身份认证
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(emailClientProperties.getUserName(),
emailClientProperties.getPassword());
}
});
return session;
}
}
附件名变为att000.dat
解决方法,试过其他网友的设置系统属性,不好使。
通过AI找到解决方法:
设置文件名时,调用MimeUtility.encodeText()对文件名进行编码
filePart.setFileName(MimeUtility.encodeText(entry.getKey()));