javaMail多个收件人分号隔开的适配

JavaMail 默认仅识别逗号分隔的收件人,但实际中可能遇到分号隔开的情况导致报错。解决方法是创建自定义的 MyInternetAddress 类,修改关键方法以适配分号。同时在 MineMessage 中调整 getHeaderAddress 方法,传入自定义类,确保正确解析多个收件人。此问题的解决经过了多次尝试,避免了对邮件内容的大量处理和对核心类的直接继承。

javaMail多个收件人用分号隔开的适配问题

问题原因

问题原因不都概述,既然遇到这个问题肯定是因为接收到了习惯用分号间隔多个收件人的,但是呢,javamail默认是只识别逗号,所以就直接报错了。

解决方式

  1. 自定义InternetAddress ,很简单就是把系统的InternetAddress,所有内容都copy一份,类名换成自己定义的,比如:MyInternetAddress, 重点是里面的一个方法private static MyInternetAddress[] parse(String s, boolean strict, boolean parseHdr) throws AddressException {}
  2. 将这个方法里面逗号判断的内容复制一份,替换掉分号判断的内容。这样以后分号了就会走这个逻辑,从而实现逗号和分号的适配。当然这个地方改动可能会有风险吧。因为分号这个也有特定的功能,所以我们应该尽可能小范围的使用这个自定义的类,减少异常情况的发生。接下来是重点。
  3. 我这里是用的是MineMessage 类来接受上送的邮件内容和解析处理的。具体内容就是将head内容做了一个解析和映射,在后面获取接收人地址的是时候,就是从这个head里面获取的。根据To,Cc等标识获取对应的值。这里就是我们要做的另一个改动点。需要我们手动改一下getHeaderAddress的方法,将我们自定义的MyInternetAddress传入进去即可
//name 就是类型, To,Cc 等,直接传入就可获得对应的内容
private Address[] getAddressHeader(MimeMessage message, String name)
			throws MessagingException {
		String s = message.getHeader(name, ",");
		return (s == null) ? null : MyInternetAddress.parseHeader(s, true);
	}

这里获取到对应的多个收件人。后续的根据各自的逻辑进行。

总结

1,看似简单的处理过程,实则是经过了大量的尝试之后得到的一个方案。最开始想到的就是对字符串进行处理,但是接收到的内容整体量可能很大,处理还可能影响邮件体的文本,所以这个方案就不考虑了。然后考虑是继承MimeMessage,InternetAddress 等,但是某些类是内容是私有的,还有依赖着其它的类,不在一个包下无法获取到,也只能放弃了。只能自己实现一个InternetAddress , 代码全部复制,然后改动关键点。接下来就是想办法把自定义的接入进去。 看之前错误的发生地是在获取Address[]的时候报的错那就往前分析,分析自己用到的就是获取收件人地址而已,可以单独把那个方法拿出来,自己定义InternetAddress , ok,这时候解决方案已经很明朗了。
2,网上看了好多个博客,结果异常的相似,只是说自定义一个InternetAddress ,该里面的逻辑,后续的该如何处理没有说明,如何引入自定义的就得靠自己想办法了。
3,当有现成的方案可以帮自己解决问题的时候,我们就会选择最容易的那条路,而忽略的深入地思考。所以,珍惜遇到的每一个困难,那是成长的磨刀石。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值