我们的Wicket 6 Web应用程序中有一个邮件功能。最近,我不得不将邮件服务器的凭据更改为新的凭据。我在我的本地系统(OS Windows,Tomcat 7 Web服务器)上测试了它,它工作得非常好。邮件已发送,我收到了。 当我在我们的Web服务器(OS:Debian)上应用相同的凭据时,我收到以下错误消息:501 - 参数或参数中的语法错误
我多次检查邮件地址,但一切似乎都没问题。因此,我猜测可能在服务器上以某种方式阻止消息从tomcat 7,apache 2或hoster(虽然我打电话给主机并且他们告诉我他们的防火墙没有阻止任何传出信号)。但是,使用旧凭据,邮件服务运行正常。因此,并非所有传出信号都被阻止。
我对这种服务器配置不太熟悉。任何人都可以给我一个提示,我必须检查配置。感谢您的支持。
修改
为了发送邮件,我们使用spring框架的嵌入式javamail服务。代码如下所示:
public class PrMailSendServiceImpl implements IPrMailSenderService{
private JavaMailSenderImpl javaMailSenderService;
private String defaultEmailFrom = "a@b.com";
private String defaultEmailTo;
public void sendEmail(String toEmail, String mailSubject, String mailContent) throws MessagingException {
MimeMessage msg = javaMailSenderService.createMimeMessage();
MimeMessageHelper mime = new MimeMessageHelper(msg, true, "UTF-8");
mime.setText(mailContent, true);
mime.setSubject(mailSubject);
mime.setTo(toEmail);
mime.setFrom(defaultEmailFrom);
javaMailSenderService.send(msg);
}
/*getter and setter*/
}
执行send方法时会发生错误。
spring-context.xml文件包含以下配置:
<bean id="javaMailSenderService" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="mrvnet.kundenserver.de" />
<property name="port" value="25" />
<property name="username" value="my@mail.com" />
<property name="password" value="myPassword" />
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
</props>
</property>
</bean>
<bean id="mailSendService" class="de.virtualsolution.procon.service.impl.PrMailSendServiceImpl">
<property name="javaMailSenderService"><ref bean="javaMailSenderService" /></property>
<property name="defaultEmailFrom"><value>my@mailcom</value></property>
</bean>
答案 0 :(得分:0)
我弄明白了这个问题。我从https://community.hpe.com/t5/System-Administration/Error-sending-e-mails-from-Java-ehlo-problem/td-p/4145190
那里得到答案简单邮件传输协议RFC规定使用HELO和EHLO。 在SMTP对话框中使用HELO / EHLO无效是您的问题。 大多数邮件传输代理(MTA)执行DNS (A-和PTR-资源记录)验证 在SMTP HELO上给出的域名 和EHLO命令。这可能违反RFC 2821, 所以默认情况下通常不会拒绝电子邮件。 换句话说,通常是EHLO和HELO 需要FQDN。 客户必须先发布HELO或EHLO 开始邮件交易。
解决方案(请参阅Unable to send email using javamail api in linux)
在我们的服务器上,我们有几个子域。因此,当调用InetAddress.getLocalHost().getHostName()
时抛出异常。因此,要手动设置HELO所需的主机名,我在spring-context.xml中添加了行<prop key="mail.smtp.localhost">my.server.host.name</prop>
现在看起来像:
<bean id="javaMailSenderService" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="mrvnet.kundenserver.de" />
<property name="port" value="25" />
<property name="username" value="my@mail.com" />
<property name="password" value="myPassword" />
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.smtp.localhost">my.server.host.name</prop>
</props>
</property>
</bean>
<bean id="mailSendService" class="de.virtualsolution.procon.service.impl.PrMailSendServiceImpl">
<property name="javaMailSenderService"><ref bean="javaMailSenderService" /></property>
<property name="defaultEmailFrom"><value>my@mailcom</value></property>
</bean>