SpringBoot发送邮件遇Local address含空白/控制字符错误求助
jakarta.mail.internet.AddressException: Local address contains control or whitespace问题 我之前在项目里也碰到过一模一样的报错,结合你已经排查过的点,给你几个针对性的排查和解决方向:
检查发件人地址的显示名称(Display Name):
很多时候我们会给发件人设置显示名称,比如new InternetAddress("sender@xxx.com", "系统通知 "),如果名称里带了不可见的空白字符(比如全角空格、制表符、末尾的空格),或者复制粘贴时带了换行符,就会触发这个异常。你可以先尝试去掉显示名称,直接用纯邮箱地址构造发件人,比如helper.setFrom("sender@xxx.com"),看看能不能正常发送。排查配置文件里的默认发件人:
如果你在application.properties/application.yml里配置了spring.mail.username或者在EmailConfig里设置了JavaMailSenderImpl.setDefaultFrom(),一定要检查这些配置值有没有隐藏的空白。有时候编辑器会在末尾自动加空格,或者复制粘贴的内容带了不可见字符,建议手动重新输入一遍邮箱地址,不要用复制粘贴。打印并检查所有收件/抄送/密送地址:
哪怕你确认了地址没问题,也建议在代码里加日志输出实际要发送的地址列表,比如:import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static final Logger log = LoggerFactory.getLogger(EmailServiceImpl.class); // 在send方法前添加日志 log.info("待发送的收件人:{}", Arrays.toString(message.getRecipients(Message.RecipientType.TO))); log.info("待发送的抄送人:{}", Arrays.toString(message.getRecipients(Message.RecipientType.CC)));这样能直观看到有没有地址带了异常字符,比如某个地址是
"user@xxx.com "(末尾有空格),肉眼可能看不到,但日志会显示出来。构造最小测试用例排查:
在EmailServiceImpl里临时写一个最小的测试方法,绕开你原来的业务逻辑,直接构造最简单的邮件发送:@Override public void sendTestEmail() { try { MimeMessage message = emailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom("你的发件邮箱@gmail.com"); helper.setTo("测试收件邮箱@xxx.com"); helper.setSubject("测试邮件"); helper.setText("这是一封测试邮件"); emailSender.send(message); log.info("测试邮件发送成功"); } catch (MessagingException e) { log.error("测试邮件发送失败", e); } }如果这个测试方法能成功,说明问题出在你原来构造邮件的逻辑里,比如某个业务参数不小心被拼接到地址里,引入了异常字符。
检查Jakarta Mail依赖兼容性:
如果你的Spring Boot版本是3.x+,用的是Jakarta Mail而不是旧的Java Mail,要确保依赖没有冲突。检查你的pom.xml(或build.gradle),确保只有Spring Boot Starter Mail提供的Jakarta Mail依赖,不要额外引入javax.mail相关的依赖,避免类加载异常导致的地址解析错误。
内容的提问来源于stack exchange,提问作者thwang

