使用JavaMail发送的中文附件内容乱码

发布于 2022-09-03 13:37:52 字数 2364 浏览 21 评论 0

在使用javamail发送中文附件内容的时候,附件会乱码(不是附件名乱码);代码如下:

 public MimeMessage createFileAttachedMail(Session session, String fromAdd, String toAdd, String subject, String content, String fileObjectId, String fileSavePath) throws Exception {
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(fromAdd));
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(toAdd));
        message.setSubject(subject);
        // 邮件正文
        MimeBodyPart text  = new MimeBodyPart();
        text.setContent(content, MAIL_CONTENT_FORMAT_CHARSET);

        // 附件
        MimeBodyPart attach = new MimeBodyPart();
        DataHandler handler = new DataHandler(new FileDataSource(this.gridFSService.readFiles(fileObjectId)));
        attach.setDataHandler(handler);
        
        // 解决中文附件名乱码问题
        attach.setFileName(MimeUtility.encodeText(handler.getName()).replaceAll("\r", "").replaceAll("\n", ""));

        // 创建容器描述数据关系
        MimeMultipart mp = new MimeMultipart();
        mp.addBodyPart(text);
        mp.addBodyPart(attach);
        mp.setSubType("mixed");

        message.setContent(mp);
        message.saveChanges();
        //将创建的email写入到本地存储
        //message.writeTo(new FileOutputStream(fileSavePath));
        return message;
    }
    
    public File readFiles(String fileObjectId) {
        DB db = mongoOperations.getCollection(mongoOperations.getCollectionName(TextBook.class)).getDB();

        // query file saved in gridfs
        // by file name
        //GridFSDBFile gfsFile = new GridFS(db, "fs").findOne("application.properties");
        // by objectId
        GridFSDBFile gfsFile = new GridFS(db,"fs").findOne(new ObjectId(fileObjectId));
        try {
            File preparedAttachedFile = new File(gfsFile.getFilename());
            gfsFile.writeTo(preparedAttachedFile);
            return preparedAttachedFile;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

在readFile()方法中,

 gfsFile.writeTo(preparedAttachedFile);

输出的文件内容并没有乱码;应该是createFileAttachedMail()方法的:

 DataHandler handler = new DataHandler(new FileDataSource(this.gridFSService.readFiles(fileObjectId)));

这一句导致的乱码问题吧。是不是应该设置handler的mime类型?请问应该怎么解决呢?
谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文