无法设置自定义发件人显示名求助(JDK17+Spring Boot3.1.10)
解决JDK17+Spring Boot3.1.10中邮件发件人显示名不生效的问题
问题根源
你当前使用mimeMessage.setSender(addressFrom)设置的是SMTP信封发件人,这个字段仅用于邮件传输路由,并非邮件客户端显示的发件人信息。包括Gmail在内的多数邮件客户端,会优先读取From邮件头的内容来展示发件人显示名,而非Sender字段。
修复步骤
1. 替换setSender为setFrom
将代码中的:
mimeMessage.setSender(addressFrom);
替换为:
mimeMessage.setFrom(addressFrom);
若需支持多头发件人,也可使用:
mimeMessage.addFrom(new Address[]{addressFrom});
2. 显式指定字符编码
为避免显示名因编码解析异常失效,建议创建InternetAddress时显式指定UTF-8编码:
InternetAddress addressFrom = new InternetAddress(from, displayNameFrom, "UTF-8");
3. 修正未定义变量问题
代码中if(email.getReplyTo() != null)的email变量未定义,会导致编译错误,建议注释该段代码或替换为实际业务变量。
4. 优化Gmail SMTP配置(可选)
端口465为SSL专属端口,无需启用starttls.enable,移除该配置项避免冲突:
// 移除该行配置 // props.put("mail.smtp.starttls.enable", "true");
修复后的核心代码片段
try{ Session session = Session.getDefaultInstance(props, new jakarta.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(from, password); } }); session.setDebug(true); Transport transport = session.getTransport(); // 显式指定UTF-8编码创建带显示名的发件人地址 InternetAddress addressFrom = new InternetAddress(from, displayNameFrom, "UTF-8"); MimeMessage mimeMessage = new MimeMessage(session); // 设置邮件头的发件人信息,供客户端显示 mimeMessage.setFrom(addressFrom); mimeMessage.setSubject(subject); mimeMessage.setContent(message+ "\r\n", "text/plain"); // 注释或修正replyTo相关代码 // if(/* 替换为实际业务变量 */ != null){ // mimeMessage.setReplyTo(new Address[]{new InternetAddress(/* 实际地址 */)}); // } mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(recipientAddress)); transport.connect(); Transport.send(mimeMessage); transport.close(); } catch(Exception e){ System.err.println(e); }
验证说明
修改后重新发送邮件,邮件客户端会读取From头中的显示名与邮箱地址,正常展示为「Admin Display Name admin.emailaddress@gmail.com」格式。
内容的提问来源于stack exchange,提问作者gva12
相关产品推荐
相关产品推荐

