Postfix返回无效地址; 454 <to@domain.com>:拒绝中继访问

时间:2016-12-08 17:32:31

标签: java javamail postfix-mta postfix

我使用预先配置的Postfix服务器并使用JavaMail与其进行交互。我正在尝试向可能请求它的任何外部域发送电子邮件通知。

以下是发送测试电子邮件的java方法:

public void TestEmail() {

    String to = "to@domain.com";

    String from = "noreply@hostdomain.com";
    final String username = "user";
    final String password = "password";

    String host = "xxx.xxx.xxx.xxx";

    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.host", host);
    props.put("mail.smtp.port", "587");

    Session session = Session.getInstance(props,
            new Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }
    });
    try {
        Message message = new MimeMessage(session);

        message.setFrom(new InternetAddress(from));

        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));

        message.setSubject("Test Email");

        message.setContent("This is a test email", "text/html");

        Transport.send(message);

        System.out.println("The test message was sent!");
    } catch (MessagingException e) {
        throw new RuntimeException(e);
    }

}

当我运行包含JavaMail代码的方法时,我得到了     generalError: javax.mail.SendFailedException: Invalid Addresses; nested exception is: com.sun.mail.smtp.SMTPAddressFailedException: 454 4.7.1 <to@domain.com>: Relay access denied

我能够使用
来测试来自Postfix服务器的外发邮件 echo "This is the body" | mail -s "This is the subject" to@domain.com
并确实收到了测试收件箱中的电子邮件。

我并不是100%确定Postfix服务器上的所有设置,但我怀疑这是问题所在,但我对它不熟悉并开始挖掘并改变所有事情都是不知不觉的。

修改 我从会话创建中删除了Authenticator()设置,并将Transport.send()替换为推荐的代码块

        Transport transport = session.getTransport("smtp");
        transport.connect(host, 587, username, password);
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();  

整套新代码是:

    String host = "xxx.xxx.xxx.xxx";

    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.host", host);
    props.put("mail.smtp.port", "587");

    Session session = Session.getInstance(props, null);

    try {
        Message message = new MimeMessage(session);

        message.setFrom(new InternetAddress(from));

        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));

        message.setSubject("Test Email");

        message.setContent("This is a test email", "text/html");

        Transport transport = session.getTransport("smtp");
        transport.connect(host, 587, username, password);
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();

        System.out.println("The test message was sent!");
    } catch (MessagingException e) {
        System.out.println("Error: " + e);
        e.printStackTrace();
        throw new RuntimeException(e);
    }

}

这已将我收到的错误消息更改为:Unrecognized SSL message, plaintext connection?

解决

解决方案:Java代码不是问题。 Postfix服务器未配置为接受来自非本地IP /主机的电子邮件。 IP已添加到mynetworks变量中的main.cf中。

1 个答案:

答案 0 :(得分:1)

This article有更多信息。

首先,按JavaMail FAQ中的描述删除身份验证器。这将确保它真正尝试向服务器进行身份验证。启用JavaMail session debugging以确保其正在验证。

请注意,您可以替换

    Transport transport = session.getTransport("smtp");
    transport.connect(host, 587, username, password);
    transport.sendMessage(message, message.getAllRecipients());
    transport.close();

    Transport.send(message, username, password);

您可以删除mail.smtp.auth设置,但保留其他属性。

确保您使用most current version of JavaMail

如果它仍然不起作用,上面的文章可能会提供一些关于如何更改Postfix配置的线索。