这篇博客主要是记录一下,发送邮件时,发件人和收件人在数据库中怎样存储,才是最好的。

先说一下我认为的最佳存储方式:昵称(可省)+空格(可省)+"<"+邮箱号+">"+间隔符+昵称....

先说一下出现的问题:javax.mail.internet.AddressException: Local address contains control or whitespace in string "发件人@163.com"

这句话主要的意思就是说:地址异常,本地地址的字符串 包涵控制和空格!

问题出现的原因:邮件在回复时,前端会直接将发件人回填到收件人位置,不知道为何,从前端传到后台的字符串哪怕只是邮箱号,但是传入javamail的api时,还是会报这个错。但奇怪的是发件时,手动输入收件人邮箱号,却能正常发送。

问题思考:如果邮件是从QQ或者163等第三方收来的,你会发现,通过网上分享的代码进行解析,通常取到的格式是:昵称(可省)+空格(可省)+"<"+邮箱号+">"+间隔符+昵称....,这样当发件人/收件人被回填到页面,用户发送邮件的时候,控制台就会报javax.mail.internet.AddressException: Local address contains control or whitespace in string

解决方案:出现这种问题的解决方案就是,跟前端开发人员约定好将邮箱用尖括号括起来,然后在传给后端,这样,当我们发送邮件的时候,直接取发件人和收件人的邮箱进行操作即可,在数据库中存储时,还是将前台传过来的字符串直接存入数据库中即可,我们只需要把传入javamailAPI的参数做以上变化,保证邮件正常发送即可。

Message message = new MimeMessage(session);
if (to != null && !"".equals(to))//to为前台传过来的收件人字符串集合,多个收件人以“,”间隔message.addRecipients(Message.RecipientType.TO, InternetAddress.parse(MimeUtility.encodeText(RecieverUtil.formatAddressWithChinese(to))));
package com.xhl.leads.leadsmail.sendmail.util;import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;/*** 收件人util 格式化发件人或者收件人,防止里面带中文字符,而导致无法发送邮件* 例如:字符串“xxxx@gmail.com <<xxxx@gmail.com>>,xxx@163.com <xxx@163.com>,白云 * <xxx@qq.com>”* 得到的效果xxxx@gmail.com,xxx@163.com,xxx@qq.com* @author Administrator**/
@Component
public class RecieverUtil {/*** 获取收件人/发件人的邮箱--通过正则表达式获取尖括号内的邮箱字符串* 例如:字符串“xxxx@gmail.com <<xxxx@gmail.com>>,xxx@163.com <xxx@163.com>”* 得到的效果xxxx@gmail.com,xxx@163.com* @param address* @return*/public static String formatAddressWithChinese(String address) {String result = "";String regex = "\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+";// 匹配带尖括号的的emailPattern p = null;Matcher m = null;if(address != null && !"".equals(address)) {if(address.indexOf(",") != -1) {String[] add = address.split(",");if(add != null && add.length > 0) {for(String a :add) {if(a != null && !"".equals(a)) {if(a.indexOf("<") != -1 && a.indexOf(">") != -1) {a = a.substring(a.lastIndexOf("<") + 1,a.lastIndexOf(">")).trim();//获取最后一个“<”与第一个“>”之间的邮箱,防止出现错误数据,一个邮箱号被多个<>包含  例如:xinceshi@gmail.com <<xinceshi@gmail.com>>if(a.contains("@")) {result = result + a + ",";}}else {p = Pattern.compile(regex);m = p.matcher(a);while (m.find()) {result = result +  m.group() + ",";}}}}}}else {if(address.indexOf("<") != -1 && address.indexOf(">") != -1) {address = address.substring(address.lastIndexOf("<") + 1,address.lastIndexOf(">")).trim();if(address.contains("@")) {result = result + address + ",";}}else {p = Pattern.compile(regex);m = p.matcher(address);while (m.find()) {result = result +  m.group();}}}}if(result.lastIndexOf(",") != -1) {result = result.substring(0, result.lastIndexOf(",")).trim();}if(result.indexOf(";") != -1) {result = result.replaceAll(";", ",");}return result;}/*** 获取收件人、发件人邮箱---通过javamail的InternetAddress对象来获取* @param address* @return*/public static String formatAddressWithChineseByInternetAddress(String address) {String result = "";InternetAddress[] addressArray;try {addressArray = InternetAddress.parse(address);if(addressArray != null && addressArray.length > 0) {for(InternetAddress add:addressArray) {result = result + add.getAddress().trim() + ",";}}if(result.lastIndexOf(",") != -1)result = result.substring(0, result.lastIndexOf(",")).trim();} catch (AddressException e) {e.printStackTrace();}return result;}
}
 

有的博客说是IDN的问题,说出现的原因是:Java Mail不支持国际化域名,因此必须使用标准规则来使用IDNA规则来转义它们。用java.net.IDN.toASCII()来把收件人或者发件人进行转义,即:to = IDN.toASCII(to);但是我试了一下,不适用我的程序。

我用自己的想法避开了出现这种问题的情况,也算是一种解决方案吧~~

javamail发送/回复邮件报错: Local address contains control or whitespace in string相关推荐

  1. axios发送post报错404问题

    axios发送post报错404问题 第一次写前端,用axios发送http请求,发现报错,状态码为404找不到页面,前端代码如下 methods: {submitForm(formName) {th ...

  2. 运行fis3 server start --type smarty启动时,报错The “data“ argument must be of type string or an instance of

    运行fis3 server start --type smarty启动时突然,报错The "data" argument must be of type string or an ...

  3. mybatis 报错:Cause: java.lang.NumberFormatException: For input string: ““

    mybatis 报错:Cause: java.lang.NumberFormatException: For input string: "" 问题描述 我使用的mybatis版本 ...

  4. POST发送请求报错及解决方案(parameter must be a JSON array)

    目的:基于Facebook-API复制已创建的广告系列(Campaign Copies)并重命名!! 初始请求方式: 根据facebook官方给出的请求方式:curl -F curl -F 'acce ...

  5. 运行tomcat报错:Address localhost:1099 is already in use

    文章目录 1.报错展示: 2.报错原因: 3.解决方法: 1.报错展示: 报错语句:Address localhost:1099 is already in use 表示是1099端口已经被占用 2. ...

  6. 1.Hue 中运行oozie工作流执行spark 报错 local class incompatible

    一.问题 在hue中运行oozie工作流执行spark任务时,报错java.io.InvalidClassException: ; local class incompatible: stream c ...

  7. 杀掉某个进程!怎么查看pid,报错:Address already in use

    说在文前,菜鸟一个,如果有说的不对的,还请见谅,望能指出,让我这井底之蛙也能见见世面. 今天分享下一个比较常见的问题,端口被占用. 报错大致类型如下: 这里我是zookeeper开启的时候,报了Add ...

  8. python解决urllib发送请求报错:urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED].....>

    完整报错是:urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify f ...

  9. Postman发送请求报错【{ “timestamp“: “2022-09-30T07:12:17.782+00:00“, “status“: 400, “error“: “】

    原因是你没有在POSTMAN里面携带请求入参内容: 还有需要按照要求检查入参实体类属性对应上 和看控制台的打印信息即可解决. 例如: 2022-09-30 15:13:35.248 WARN 3948 ...

最新文章

  1. JUC 常用 4 大并发工具类
  2. 《使用CSLA 2019:CSLA .NET概述》原版和机译文档下载
  3. (转)Mac下MySql安装经历(含安装错误排查、卸载多种折腾)
  4. Google Cloud API 验证
  5. 科技人员在计算机前的肖像,基于计算机视觉的人脸肖像画生成研究
  6. hibernate关系映射(一对一)
  7. Flume1.5.0的安装、部署、简单应用(含伪分布式、与hadoop2.2.0、hbase0.96的案例)
  8. Python学习笔记之列表(四)
  9. SpringBoot 无法显示html文件 找不到html文件 如果显示html文件
  10. centos7子系统 win10_Win10下安装CentOS 7双系统详解
  11. php 增加数组下标_PHP数组排序更改下标KEY方法
  12. 卸载office 2003出现pro11.msi
  13. JVisualVM的使用实录
  14. fastadmin列表中,时间显示,格式设置
  15. 车管所免检测审车流程
  16. Apache安装与基本配置
  17. shell编程实例练习
  18. Mybatis <choose> <when> <otherwise>
  19. python 并行化 图像处理_Python数据预处理:使用Dask和Numba并行化加速
  20. 赛迪智库:汽车智能化垄断格局尚未形成,换道超车机会在哪?

热门文章

  1. 关于typedef和的一点分享
  2. 自动驾驶需要哪些关键技术?
  3. 微信开放平台分账功能实战(Java版)
  4. Window截图方法
  5. openvz使用手册
  6. 网上书城项目分析及前端页面
  7. 1062 最简分数 (C++)
  8. 华为手机信息不弹屏了为什么_华为手机短信不提醒如何解决?四种方法来帮你!...
  9. 蓝绿发布,红黑发布和灰度发布是什么
  10. 你需要的物流运输类报表,这里都有