JavaMail 邮件发送,有意思的附件名乱码 → 客户端正常,web端乱码(java邮件发送带附件)

  本篇文章为你整理了JavaMail 邮件发送,有意思的附件名乱码 → 客户端正常,web端乱码(java邮件发送带附件)的详细内容,包含有javamail发送邮件带附件 java邮件发送带附件 java邮件发送失败怎么解决 java邮件附件加密 JavaMail 邮件发送,有意思的附件名乱码 → 客户端正常,web端乱码,希望能帮助你了解 JavaMail 邮件发送,有意思的附件名乱码 → 客户端正常,web端乱码。

   昨晚,媳妇很感伤的看着我

   媳妇:以后岁数大了,我要走你前面去了,你再找个老伴

   我:我不想找

   媳妇:你找一个,不用替我守着,以后你说你头疼发烧,也得有个给你端水递药的呀

   媳妇抹着眼泪:到老是个伴

   我:我想找个年轻的

   现在我左脸还有一个掌印,火辣辣的

   基于JavaMail 1.5.5,实现了邮件发送功能,也对接了一些客户,没出现什么问题

   代码如下

  

/**

 

   * 邮件发送

   * @param message 邮件内容

   * @param to 收件人邮箱

   * @param attachment 附件

  public static void sendEmail(String message, String to, File attachment) throws Exception {

   //设置邮件会话参数

   Properties props = new Properties();

   //邮箱的发送服务器地址

   props.setProperty("mail.smtp.host", MAIL_HOST);

   props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

   props.setProperty("mail.smtp.socketFactory.fallback", "false");

   props.put("mail.smtp.ssl.enable", "true");

   //邮箱发送服务器端口,这里设置为465端口

   props.setProperty("mail.smtp.port", "465");

   props.setProperty("mail.smtp.socketFactory.port", "465");

   props.put("mail.smtp.auth", "true");

   //获取到邮箱会话,利用匿名内部类的方式,将发送者邮箱用户名和密码授权给jvm

   Session session = Session.getDefaultInstance(props, new Authenticator() {

   @Override

   protected PasswordAuthentication getPasswordAuthentication() {

   return new PasswordAuthentication(MAIL_USER_NAME, MAIL_AUTH_CODE);

   // 开启调试,生产不开启

   session.setDebug(true);

   Multipart multipart = new MimeMultipart();

   BodyPart contentPart = new MimeBodyPart();

   //contentPart.setContent(message, "text/html;charset=UTF-8");

   contentPart.setText(message);

   multipart.addBodyPart(contentPart);

   if (attachment != null) {

   BodyPart attachmentBodyPart = new MimeBodyPart();

   DataSource source = new FileDataSource(attachment);

   attachmentBodyPart.setDataHandler(new DataHandler(source));

   //MimeUtility.encodeWord可以避免附件文件名乱码

   attachmentBodyPart.setFileName(MimeUtility.encodeWord(attachment.getName()));

   multipart.addBodyPart(attachmentBodyPart);

   //通过会话,得到一个邮件,用于发送

   Message msg = new MimeMessage(session);

   //设置发件人

   msg.setFrom(new InternetAddress(MAIL_USER_NAME));

   //设置收件人,to为收件人,cc为抄送,bcc为密送

   msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));

   // msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(to, false));

   // msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(to, false));

   msg.setSubject("我是主题");

   //设置邮件消息

   msg.setContent(multipart);

   //设置发送的日期

   msg.setSentDate(new Date());

   //调用Transport的send方法去发送邮件

   Transport.send(msg);

  }

 

  View Code

   附件名是做了编码处理的

   我们来看下接收情况

   Foxmail

   outlook windows 版本

   一切看似都很平静

  

   直到她们的出现,让我慌了神

   QQ邮箱(web 端)

   outlook web 版本

   此刻,我们的脑中应该有 2 个问题

   1、乱码该如何修复

   2、为什么客户端版(Foxmail、outlook windows版)接收正常,而 web版 却出现了乱码?

   这个上网一搜,很容易就能找到答案,加一个系统属性即可

   mail.mime.splitlongparameters默认值是true,表示编码后的附件名文件名长度超过60之后会进行多段拆分,每 60 个字符作为一个参数,最后不足 60 个字符的作为一个参数

   我们把mail.mime.splitlongparameters设置成false,再看下效果

   QQ 邮箱

   outlook web

   有人可能会有疑问了:你说 60 就 60,你说拆分就拆分?

   既然不信我,那我们从源码找答案

   源码解析

   设置附件名的时候,有这样一段代码

   注意第一个 if 中的条件,是有三个

   1、附件名编码后的长度

   2、mail.mime.splitlongparameters

   3、mail.mime.encodeparameters,默认值是true

   当三个条件都为true,才会以 60 字符为单位进行多段拆分

   你好_好久不见_别来无恙_20230306.txt编码后再拆分得到的结果是

   文件名被拆分成了三段,我可曾欺你们?

  为什么只有 web 版“乱码”

   此刻需要纠正下,web 版出现的附件名不是乱码,而是编码之后未能正确解码

   为什么未能正确解码?

   那是因为不支持RFC2231 style encoded parameters

   其实可能不只是 web 版不支持,可能还有其他的邮件客户端不支持,只是楼主未去尝试而已

   1、是要满足三个条件才会对附件名进行多段拆分,忘记了的往上翻一翻

   2、为什么要进行附件名的多段拆分? 呃呃呃...,由你们来回答

  以上就是JavaMail 邮件发送,有意思的附件名乱码 → 客户端正常,web端乱码(java邮件发送带附件)的详细内容,想要了解更多 JavaMail 邮件发送,有意思的附件名乱码 → 客户端正常,web端乱码的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: