【问题标题】:JavaMailSenderImpl doesn't use "mail.from" property from mail sessionJavaMailSenderImpl 不使用邮件会话中的“mail.from”属性
【发布时间】:2017-04-27 20:12:04
【问题描述】:

我想发送带有From 标头的邮件,但我不想在SimpleMailMessage 中设置From 标头。我想为javax.mail.Session(在context.xml 中定义)使用配置了mail.from 属性的默认值。

Java 的 MimeMessage#setFrom 方法支持该功能:

使用 InternetAddress.getLocalAddress 方法的值设置 RFC 822“From”标头字段。

但是JavaMailSenderImpl 不使用该属性。

Tomcat 的context.xml:

<Resource name="mail" type="javax.mail.Session" mail.debug="true"
        mail.smtp.host="mail.mycompany.com" mail.from="no-reply@mycompany.com"/>

春天的beans.xml:

<bean id="mailSession" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/mail" />
</bean>

<bean id="JavaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="session" ref="mailSession" />
</bean>

我的服务:

@Named
public class MailService {

    @Inject
    private JavaMailSender javaMailSender;

    public void send() {

        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo("customer@company.com");
        message.setSubject("Test");
        message.setText("Test message body");

        javaMailSender().send(message);
    }
}

日志:

DEBUG: JavaMail version 1.5.5
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle]}
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "mail.mycompany.com", port 25, isSSL false
220 mail.mycompany.com ESMTP ready.
DEBUG SMTP: connected to host "mail.mycompany.com", port: 25

EHLO dev.mycompany.com
250-mail.mycompany.com Hello dev.mycompany.com [x.x.x.x]
250-SIZE 41943040
250-8BITMIME
250-PIPELINING
250-STARTTLS
250 HELP
DEBUG SMTP: Found extension "SIZE", arg "41943040"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "HELP", arg ""
DEBUG SMTP: use8bit false
MAIL FROM:<no-reply@mycompany.com>
250 OK
RCPT TO:<customer.company.com>
250 Accepted
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   customer@company.com
DATA
354 Enter message, ending with "." on a line by itself
Date: Mon, 12 Dec 2016 21:45:10 +0100 (CET)
To: customer@company.com
Message-ID: <1838762963.0.1481575510043@mycompany.com>
Subject: Test
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Test message body
.
250 OK id=1cGXTB-0007La-35
DEBUG SMTP: message successfully delivered to mail server
QUIT
221 mail.mycompany.com closing connection

邮件没有From 标头。

我的代码有什么问题吗?为什么 Spring 不使用邮件会话中的 From 标头?

【问题讨论】:

  • 您好!您找到解决此问题的方法了吗?
  • @mohax 太久远了,记不得了。但是我没有写答案,所以我想,我没有找到办法。
  • 好的,谢谢。也许DKIM有问题。明天我将尝试按照here 的描述在电子邮件上签名并写下结果)

标签: java spring email


【解决方案1】:

来自这个链接:http://springframework-user.narkive.com/wbF105Ma/simplemailmessage-and-date-header

SimpleMailMessage 或多或少是 COS 和 JavaMail 的邮件发送功能的最小公分母。其实应该也可以用COS设置日期表头;只是在 COS MailMessage 类中没有明确的方法。因此,我们可能会在未来的版本中为 SimpleMailMessage 提供日期标头支持。

目前,您必须使用 JavaMailSender 接口和 JavaMail 的 MimeMessage 类。使用 Spring 提供的 MimeMessageHelper 类,以 SimpleMailMessage 样式的方式填充 MimeMessage 应该很容易。 (详见 MimeMessageHelper 的 javadoc。)当然,MimeMessage 更强大:它支持附件、文本编码等。

我搜索并找到了那些。你试试哪个:

1:

MimeMessage mimeMessage = //get message from wherever
mimeMessage.addHeader("From", "me@mail.com");

2:

MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8");
 message.setFrom("me@mail.com");

【讨论】:

  • 您的更新设置了邮件上的From 标头,这不是我想要的,我想使用邮件会话中配置的From 标头(不要使用值)。
  • @dur 好的。所以这段代码不起作用:JavaMailSenderImpl sender = new JavaMailSenderImpl();属性属性 = 新属性(); properties.put("发件人", "a@b.com"); sender.setJavaMailProperties(properties);
  • 它创建一个新会话而不是使用现有会话。会话在 JNDI 中,我的实现不知道属性。
  • @dur 我对 JNDI 了解不多,但是您无法从 JNDI 获取会话并设置属性并再次返回到 JNDI?
  • 我可以这样做,但它真的很丑。
猜你喜欢
  • 2018-11-28
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2015-10-21
  • 2014-04-20
  • 2013-08-04
相关资源
最近更新 更多