未经身份验证无法发送电子邮件

时间:2019-04-02 02:40:22

标签: java javamail

我编写了一个简单的Java程序,该程序使用Java Mail API发送电子邮件。

 public static void main(String[] args) {

        System.out.println("SimpleEmail Start");

        String smtpHostServer = "smtp.gmail.com";
        String emailID = "xxxxxx@hotmail.com";

        Properties props = System.getProperties();

        props.put("mail.smtp.host", smtpHostServer);
        props.put("mail.smtp.starttls.enable", "true");





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

        EmailUtil.sendEmail(session, emailID,"SimpleEmail Testing Subject", "SimpleEmail Testing Body");
    }

}

EmailUtil类:

public class EmailUtil {


    /**
     * Utility method to send simple HTML email
     * @param session
     * @param toEmail
     * @param subject
     * @param body
     */
    public static void sendEmail(Session session, String toEmail, String subject, String body){
        try
        {
            MimeMessage msg = new MimeMessage(session);
            //set message headers
            msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
            msg.addHeader("format", "flowed");
            msg.addHeader("Content-Transfer-Encoding", "8bit");

            msg.setFrom(new InternetAddress("no_reply@example.com", "NoReply-JD"));

            msg.setReplyTo(InternetAddress.parse("no_reply@example.com", false));

            msg.setSubject(subject, "UTF-8");

            msg.setText(body, "UTF-8");

            msg.setSentDate(new Date());

            msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
            System.out.println("Message is ready");
            Transport.send(msg);

            System.out.println("EMail Sent Successfully!!");
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }





}

使用此实现,据说我根本不需要任何密码,因此我尝试了一下,它告诉我:

com.sun.mail.smtp.SMTPSendFailedException: 530-5.5.1 Authentication Required

我从在线资源和阅读的内容中获得了这段代码,它应该能够在不进行身份验证的情况下发送。

所以我的问题是,我是否总是需要设置用户名和密码才能使用JAVA邮件发送邮件?

如果没有,我在做什么错了?

2 个答案:

答案 0 :(得分:2)

这取决于谁在运行服务器。

请参见https://support.google.com/a/answer/176600?hl=en&vid=0-974788924023-1554173451081;特别是标有“ Gmail SMTP服务器”(正在使用)的列。 Google明确表示您必须进行身份验证才能使用该服务器。不这样做会给您此错误消息。

答案 1 :(得分:1)

从前,您可以使用任何邮件服务器将电子邮件发送到所需的任何电子邮件地址。

然后出现垃圾邮件。垃圾邮件发送者还可以使用任何邮件服务器将电子邮件发送到任何电子邮件地址-作为邮件服务器操作员,您不希望垃圾邮件发送者使用您的服务器发送电子邮件(因为操作服务器会花费您的钱,因为您的邮件服务器可能会被列入黑名单垃圾邮件)。

所以今天大多数邮件服务器都要求您

  • 提供身份验证(用于将电子邮件发送到您想要的任何电子邮件地址)
  • 或仅允许将电子邮件发送到邮件服务器运营商托管的电子邮件地址

Google甚至有两个不同的邮件服务器:

  • 需要身份验证的人,可用于将电子邮件发送到所需的任何电子邮件地址(即位于smtp.gmail.com的服务器)
  • 不需要身份验证的邮件,只能用于向Gmail或G Suite用户(即服务器aspmx.l.google.com)发送电子邮件

可能是您的源可追溯到不需要身份验证的时间,或者源中的邮件服务器仅用于将邮件发送到托管在邮件服务器上的地址。

无论哪种方式-如果您想使用服务器smtp.gmail.com发送邮件到您必须进行身份验证的任何地址(或说服Google他们应该允许您-并且只有您-发送邮件没有身份验证的电子邮件,但随后:Google怎么知道尝试发送邮件的正是您?)