JavaMail实现邮件的回复

JavaMail实现邮件的回复

使用JavaMail提供的库javax.mail.*来构造邮件的回复

实现简介

实现回复邮件,实际上就是实现邮件的发送,在邮件发送的基础上加上要回复邮件的信息,发送邮件的实现中存在一些坑,在后文中会有说明

构造一封邮件

首先是设置邮件的几个关键信息:from、to、cc、subject等等

Properties properties = new Properties();
properties.put("mail.host", "${邮件host}");
Session session = Session.getInstance(properties,null);//设置null代表不需要鉴权
final MimeMessage mimeMessage = new MimeMessage(session);
//设置发件人
mimeMessage.setFrom(new InternetAddress(${mail_from}));
//设置标题
mimeMessage.setSubject("${title}");
//设置收件人
mimeMessage.setRecipients(Message.Recipient.TO,${to_mail});

如果收件的邮箱对于收到的邮件header有其他要求,则按照要求添加header,如下所示:

mimeMessage.setHeader("IN-Reply-To", ${replyMessage});

构造邮件的subpart

JavaMail使用MimeMultipart这个类来构建邮件的subpart,如果要发送包含图片的html内容的邮件,需要将MimeMultipart设置为“relate”

String html = "${你构造的html内容}+${上一封邮件的html内容}";
MimeBodyPart mimeBodyPart = new MimeBodyPart();
mimeBodyPart.setContent(html, "text/html; charset=gb2312");
MimeMultipart mimeMultipart = new MimeMultipart("relate");
mimeMultipart.addBodyPart(mimeBodyPart);

接下来是将图片从要回复的邮件中导出并导入到MimeMultipart这个类里:

MimeMessageParser oldEmailParser;//从原有的邮件导出
Collection<String> cidCollections = oldEmailParser.getContentIds();
if(Objects.nonNull(cidCollections)){
  for (String cid : cidCollections){
    DataSource dataSource = oldEmailParser.findAttachmentByCid(cid);
    MimeBodyPart mimeBodyPart = new MimeBodyPart();
    bodyPart.setDataHandler(new DataHandler(dataSource));
    bodyPart.setHeader("Content-ID",cid);
    bodyPart.setHeader("Content-Type", dataSource.getContentType());
    bodyPart.setHeader("Content-Disposition", MimeBodyPart.INLINE);
    bodyPart.setFileName(dataSource.getName());
    mimeMultipart.addBodyPart(bodyPart);
  }
}

对于整合出来的MimeMultipart类,再转成字符串如下所示:

mimeMessage.setContent(mimeMultipart);
ByteArrayOutputStream mime = new ByteArrayOutputStream();
mimeMessage.writeTo(mime);
String mimeStr = mime.toString();

生成mimeMessage后,再发送邮件即可。

遇到的问题

如果此时将上述代码生成的邮件发送给gmail或者outlook,对于中国用户,可能会出现邮件图片不显示的问题:
你可以尝试在outlook邮箱中使用富文本框添加图片,其中一个图片的命名为中文,一个图片的命名为英文,使用上文中所涉及到的代码,gmail收到的邮件中有图片无法显示:生成有误的邮件
查看邮件的源码:
邮件附件源码
我们发现源码中的附件,中文名命名的附件并没有被正确的显示,合理猜测可能是文件编码解码时发生了错误,将添加附件的代码改成如下所示,ISO-8859-1标准用来表示所有的欧区文字,邮箱就能正常显示了:

MimeMessageParser oldEmailParser;//从原有的邮件导出
Collection<String> cidCollections = oldEmailParser.getContentIds();
if(Objects.nonNull(cidCollections)){
  for (String cid : cidCollections){
    DataSource dataSource = oldEmailParser.findAttachmentByCid(cid);
    MimeBodyPart mimeBodyPart = new MimeBodyPart();
    String dataSourceName = new String(dataSource.getName().getBytes(), "ISO-8859-1");
    bodyPart.setDataHandler(new DataHandler(dataSource));
    bodyPart.setHeader("Content-ID",cid);
    bodyPart.setHeader("Content-Type", dataSource.getContentType());
    bodyPart.setHeader("Content-Disposition", MimeBodyPart.INLINE);
    bodyPart.setFileName(dataSourceName);
    mimeMultipart.addBodyPart(bodyPart);
  }
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本程序是使用Javamail API和Jacob Office操作库编写的批量发送实名邀请函的Java程序。 1、不仅可以提供全功能的邮件发送功能: - 发送常规邮件邮件主题、发送地址、接收地址、邮件正文) - 邮件群发 - 支持抄送 - 支持附件的发送,可同时发送多个附件文件,附件的文件名可以为中文 - 支持秘送 - 支持已读回执 - 邮件服务器认证 - 等 2、还可以提供实名制的邮件批量发送: 邮件群发已经不是什么很了不起的功能了,但是实名制的邮件群发倒是迫切需要解决的事情, 特别是办公室工作人员需要发送实名制的邀请函,如果每发送一个电子邮件,都要打开附件(如果 附件是word的话,打开的速度又很慢,还容易死机)添加邀请人的姓名,并且还要在邮件的正文里 面再复制一次邀请人的姓名,我觉得如果让我干这个,还不如让我去死。 现在有了这个程序您只需要提供提供几个模板,配置好您的文件位置,所有的一切本程序可以 为您轻松搞定。人应该干人该干的事情,计算机应该干计算机该干的事情,人要是老干计算机干的事 情,不是人疯了就是世界末日来到了。 3、本程序是免费程序,虽然提供了非常实用的功能,但是本身还是有很多意想不到的bug,希望各 位可以多多提出意见,不吝赐教!如有任何问题请发邮箱[email protected],如果我 的网络没断的话我会在当天给您回复,谢谢您的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值