4

我在使用 Spring 的MailSender接口和具体实现JavaMailSenderImpl通过 SMTP 发送邮件时遇到一些问题。我可以通过 GMail 发送邮件,但不能通过我们公司的 SMTP 服务器(Postfix)。

正确的配置

为了查看我的配置是否正确,我使用了出色的邮件发件人ssmtp。它是一个简单的实用程序(能够模拟 Sendmail),仅用于通过 SMTP 发送邮件。

下面是我用来发送邮件的两个命令。第一个用于 GMail,第二个用于我们公司的 SMTP 服务器。两封邮件都按原样到达,因此后面的配置文件是正确的。

$ ssmtp -C gmail-smtp.conf john.doe@gmail.com < gmail-message.txt 
$ ssmtp -C other-smtp.conf john.doe@thecompany.net < other-message.txt

下面列出了 ssmtp 配置文件和消息文件的内容。可以在以下位置查看配置文件的结构: http: //linux.die.net/man/5/ssmtp.conf

gmail-message.txt:

To: john.doe@gmail.com
From: john.doe@gmail.com
Subject: Sent using the SMTP-server of GMail

Some content.

gmail-smtp.conf:

mailhub=smtp.gmail.com:587
UseSTARTTLS=yes
AuthUser=john.doe@gmail.com
AuthPass=john_password

其他消息.txt:

To: john.doe@thecompany.net
From: john.doe@thecompany.net
Subject: Sent using the SMTP-server of TheCompany

Some content.

其他-smtp.conf:

# No username or password = no authentication
hostname=thecompany.net
mailhub=mail.thecompany.net:25

针对 GMail 的 MailSender 配置

我使用此 Spring MailSender 配置通过 GMail 成功发送邮件:

...
<bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" >
    <property name="host" value="smtp.gmail.com" />
    <property name="port" value="587" />
    <property name="username" value="john.doe@gmail.com" />
    <property name="password" value="john_password" />
    <property name="javaMailProperties">
    <props>
        <prop key="mail.smtp.starttls.enable">true</prop>
    </props>
    </property>
</bean>
...

问题(通过公司 SMTP 服务器发送)

使用此 MailSender 配置:

...
<bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" >
    <property name="host" value="mail.thecompany.net" />
    <property name="port" value="25" />
</bean>
...

我得到这个例外:

org.springframework.mail.MailSendException; nested exceptions (1) are:
Failed message 1: javax.mail.SendFailedException: Invalid Addresses;
nested exception is:
com.sun.mail.smtp.SMTPAddressFailedException: 504 5.5.2 <rat>: Helo command rejected: need fully-qualified hostname

at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:422)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:308)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:297)
... (The rest are methods I've created, which are irrelevant)    

得到504 5.5.2 : Helo command denied: need full-qualified hostname if I remove hostname= thecompany.net from other-smtp.conf using ssmtp。我想我必须以某种方式提供主机名。我的计算机名称是rat但它似乎想要thecompany.net

任何和所有的帮助表示赞赏!

4

5 回答 5

3

要添加以完成 matt b 的上一个答案,javamail 的正确选项是smtp.mail.localhost

<property name="javaMailProperties">
    <props>
        <prop key="mail.smtp.localhost">thecompany.net</prop>
    </props>
</property>
于 2011-06-22T12:31:02.263 回答
2

尝试使用正确的值 ( thecompany.net ) 添加属性“mail.smtp.localhost”。

于 2009-05-22T13:38:02.850 回答
1

您可以在属性中传递您需要使用 SMTP 服务器设置的额外属性(主机名)javaMailProperties吗?

<bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" >
    <property name="host" value="mail.thecompany.net" />
    <property name="port" value="25" />
    <!-- addition: -->
    <property name="javaMailProperties">
        <props>
            <prop key="hostname">thecompany.net</prop>
        </props>
    </property>
</bean>

不太确定hostnameJavaMail API 中正确的密钥名称是什么。

于 2009-05-12T20:03:28.803 回答
0

我认为在你的情况下这是一个地址解析问题。确保可以使用您部署此代码的机器上的给定名称访问邮件服务器。如果不只是在您的主机文件中添加一个条目。

于 2009-05-12T19:53:30.580 回答
0

SMTPTransport mailFrom() 按以下顺序设置发件人的地址:

SMTPMessage.getEnvelopeFrom()
mail.smtp.from property
From: header in the message
System username using the InternetAddress.getLocalAddress() method

您只需将属性添加fromjavaMailProperies您的电子邮件地址

于 2016-08-12T11:58:56.873 回答