发送邮件错误 501 - 服务器上而非本地系统上的参数或参数存在语法错误

Send Mail error 501 - Syntax error in parameters or arguments on server but not on local system

我们的 Wicket 6 Web 应用程序中有邮件功能。最近,我不得不将邮件服务器的凭据更改为新凭据。我在我的本地系统(OS Windows、Tomcat 7 网络服务器)上对其进行了测试,它运行良好。邮件已发送,我收到了。 当我在我们的 Web 服务器(OS:Debian)上应用相同的凭据时,我收到以下错误消息:501 - 参数或参数中的语法错误

我多次检查邮件地址,但似乎一切正常。因此,我猜测可能消息在服务器上以某种方式从 tomcat 7、apache 2 或主机(尽管我打电话给主机,他们告诉我他们的防火墙没有阻止任何传出信号) ).但是,使用旧凭据,邮件服务 运行 完全没问题。因此并非所有传出信号都被阻止。

我对此类服务器配置不是很有经验。谁能给我一个提示,我必须在哪里检查配置。感谢您的支持。

编辑

为了发送邮件,我们使用 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*/
}

执行发送方法时出现所述错误。

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>

我想通了。我从 https://community.hpe.com/t5/System-Administration/Error-sending-e-mails-from-Java-ehlo-problem/td-p/4145190

那里得到了答案

Simple Mail Transfer Protocol RFCs stipulate use of HELO and EHLO. Invalid usage of HELO/EHLO in the SMTP dialogue is your problem. Most Mail Transfer Agents (MTAs)perform DNS (A- and PTR- resource records) verification on the domain name given on the SMTP HELO and EHLO commands. This can violate RFC 2821, so email is usually not rejected by default. In other words, EHLO and HELO typically require FQDN. A client MUST issue HELO or EHLO before starting a mail transaction.

解决方案(参见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>