JavaMail邮箱开发添加附件问题

问题

使用网易邮箱,qq邮箱,新浪邮箱,企业邮箱都是正常的,再使用139邮箱发送附件,发现邮件存到草稿箱或者是已发送文件夹的时候,附件为图片的时候可以解析出来,其他的文档类就无法解析,登录网页端查看附件,发现附件文件明不正确。
网页端附件状态
然后我以为文件明编码格式的问题,修改了 MimeUtility.decodeText() 文件名编码,使用UTF-8,GBK等还是一样,后面不转编码,直接发,发现网页端是正常显示了,但是客户端收到解析又解析不了,以为是解析的方式不对,又在解析上纠结了好久,之后在网页端发一条,发现解析是没有问题的,那么又回到了原点,添加附件方式有问题,最后在客户端发一条,再把收到的邮件打印出来跟网页端发送的邮件做对比发现缺少Content-Type类型定义。
log对比:

客户端发送的:
bodyPart.getContentType():application/octet-stream==mimtype:multipart/mixed; 
    	boundary="----=_Part_0_208183443.1610357486667"
网页端发送的:
bodyPart.getContentType():application/vnd.openxmlformats-officedocument.wordprocessingml.document; 
    	charset=utf-8; 
    	name="=?UTF-8?B?5omL5py65a6J5YWo5rWL6K+V5oql5ZGKLmRvY3g=?="==mimtype:multipart/mixed; 
    	boundary="----=_Part_52648_361362599.1610415676840"

发现bodyPart.getContentType()没有name这个字段,查找资料,原来需要添加BodyPart.addHeader(“Content-Type”,value)
参考:Java BodyPart.addHeader方法代码示例

再推荐一篇,写的很详细,代码也清晰易懂:javaMail邮件接收解析内容及附件 及删除邮件

本人使用的是MailKit框架开发,因为是人家基于JavaMail封装好的,使用起来很方便。
回到刚才的问题,直接贴上代码:

 //创建多重消息对象
 MimeMultipart multipart = new MimeMultipart();

 //文本内容
 if (draft.getText() != null) {
     MimeBodyPart textBodyPart = new MimeBodyPart();
     textBodyPart.setText(draft.getText(), "UTF-8");
     multipart.addBodyPart(textBodyPart);
 }
 //HTML内容
 if (draft.getHTML() != null) {
     MimeBodyPart htmlBodyPart = new MimeBodyPart();
     htmlBodyPart.setContent(draft.getHTML(), "text/html; charset=UTF-8");
     multipart.addBodyPart(htmlBodyPart);
 }
 //设置附件
 List<File> fileList = draft.getAttachmentList();

 for (File file : fileList) {
     MimeBodyPart attachmentBodyPart = new MimeBodyPart();
     DataSource source = new FileDataSource(file);

     String fileName = TextUtils.encodeText(source.getName());
     attachmentBodyPart.setFileName(fileName);
     attachmentBodyPart.setDataHandler(new DataHandler(source));
     attachmentBodyPart.setDisposition(Part.ATTACHMENT);
     String value = TextUtils.getMimeType(fileName)+"; name="+fileName;
     attachmentBodyPart.addHeader("Content-Type",value);

     multipart.addBodyPart(attachmentBodyPart);
     multipart.setSubType("mixed");
 }

 //设置消息对象
 message.setContent(multipart);

TextUtils文本编码转换

/**
* 文本编码转换
 */
static class TextUtils {

    static String encodeText(String s) {
        try {
            return MimeUtility.encodeText(s);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return s;
        }
    }

    static String decodeText(String s) {
        try {
            Log.e("===", "decodeText: "+s );
            return (s.startsWith("=?")) ? MimeUtility.decodeText(s) : s;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return s;
        }
    }

    static String getMimeType(String filename) {
        int begin = filename.lastIndexOf('.');
        String suffix = filename.substring(begin + 1);
        return MimeTypeMap
                .getSingleton()
                .getMimeTypeFromExtension(suffix);
    }

}

结束,在这里记录一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ぃ随风逍遥う

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值