You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Spring MimeMessageHelper发邮件,解决Outlook不显示发件人名称问题

Outlook无法显示邮件发件人名称的修复方案

我用Spring的MimeMessageHelper和JavaMailSender发送邮件,需求是让收件人只看到发件人名称、不显示邮箱地址。这个功能在Yahoo、Gmail、Hotmail中都正常生效,但Outlook始终无法显示发件人名称,仅展示邮箱地址。当前使用的SMTP服务器为office365.com。

当前服务层代码

private final JavaMailSender emailSender;

@Value("${spring.mail.username}")
private String mailUsername;

@SneakyThrows
private void sendMailInner(String to, String subject, String body, String sender) {

    MimeMessage mimeMessage = emailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true,"utf-8");
    if(sender != null){
        helper.setFrom(mailUsername, sender);
    } else {
        helper.setFrom(mailUsername);
    }
    helper.setTo(new InternetAddress(to));
    helper.setSubject(subject);
    helper.setText(body, true);
    emailSender.send(mimeMessage);
}

应用配置

spring:
  mail:
    host: smtp.office365.com
    port: 587
    username: my app email
    password: ****
    properties:
      mail:
        transport:
          protocol: smtp
        smtp:
          auth: true
          starttls:
            enabled: true
        debug: true

问题原因

Outlook对邮件头的RFC规范解析比其他邮箱更严格,MimeMessageHelper的setFrom(String email, String name)重载方法生成的邮件头格式,在部分场景下无法被Outlook正确识别为带名称的发件人。

修复方法

直接构造InternetAddress对象,明确绑定发件人名称与邮箱地址,再传入setFrom方法,确保邮件头格式完全符合RFC标准:

修改后的核心代码片段:

if(sender != null){
    // 直接构造带名称的InternetAddress对象
    InternetAddress fromAddress = new InternetAddress(mailUsername, sender);
    helper.setFrom(fromAddress);
} else {
    helper.setFrom(mailUsername);
}

验证方式

保持配置中mail.debug: true开启状态,查看邮件发送日志里的From字段,正常格式应为 发件人名称 <your-app-email@domain.com>。若格式符合预期,Outlook即可正常解析并显示发件人名称。

内容的提问来源于stack exchange,提问作者Aleksandar Djordjevic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:55:22