【Java】解决javax.mail发送附件,附件名变为att000.dat

您所在的位置:网站首页 java实现发送邮件功能 【Java】解决javax.mail发送附件,附件名变为att000.dat

【Java】解决javax.mail发送附件,附件名变为att000.dat

2023-06-18 17:12| 来源: 网络整理| 查看: 265

(今天开发的项目功能中,需要通过Email发送协议附件)

Java发送邮件代码实现

引入依赖

javax.mail mail 1.4.7 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 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 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 fileList = request.getFileBase64List(); if (CollectionUtils.isNotEmpty(request.getFileBase64List())) { fileList.forEach(item -> { for (Map.Entry 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())); 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3