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

Cannot send email without authentication required

我写了一个简单的 Java 程序,它使用 Java 邮件 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 class:

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 邮件发送邮件?

如果不是,我做错了什么?

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

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

曾几何时,您可以使用任何邮件服务器将电子邮件发送到您想要的任何电子邮件地址。

然后是 垃圾邮件。垃圾邮件发送者还可以使用任何邮件服务器向任何电子邮件地址发送电子邮件 - 作为邮件服务器运营商,您不希望垃圾邮件发送者使用您的服务器发送电子邮件(因为操作服务器会花费您金钱,因为您的邮件服务器可能会因以下原因被列入黑名单垃圾邮件)。

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

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

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

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

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

无论哪种方式 - 如果您想使用服务器 smtp.gmail.com 向任何地址发送邮件,您 必须验证 (或说服 google 他们应该允许您 - 并且只有您 - 无需身份验证即可发送电子邮件,但是:google 如何知道正是您在尝试发送邮件?)