使用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
其他-message.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
我使用这个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>
...
使用此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命令被拒绝:如果我从中删除 hostname = thecompany.net ,则需要完全限定的主机名使用 ssmtp other-smtp.conf 。我想我必须以某种方式提供主机名。我的计算机名称是 rat ,但似乎它想要 thecompany.net 。
任何和所有帮助表示赞赏!
答案 0 :(得分:3)
要添加以通过matt b完成之前的answer,javamail的正确选项为smtp.mail.localhost
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.localhost">thecompany.net</prop>
</props>
</property>
答案 1 :(得分:1)
您是否可以传递您需要使用javaMailProperties
属性中的SMTP服务器设置的额外属性(主机名)?
<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>
不完全确定JavaMail API中hostname
的正确密钥名称是什么。
答案 2 :(得分:1)
尝试添加具有正确值的属性“mail.smtp.localhost”( thecompany.net )。
答案 3 :(得分:0)
我认为在你的情况下它是一个地址解析问题。确保使用您已部署此代码的计算机上的给定名称访问邮件服务器。如果不只是在主机文件中添加一个条目。
答案 4 :(得分:0)
SMTPTransport mailFrom()按以下顺序设置发件人的地址:
SMTPMessage.getEnvelopeFrom()
mail.smtp.from property
From: header in the message
System username using the InternetAddress.getLocalAddress() method
您只需将from
中的媒体资源javaMailProperies
添加到您的电子邮件地址