本篇文章为你整理了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。