Gmail 作为 JavaMail SMTP 服务器

Gmail as JavaMail SMTP server

我一直在使用 JavaMail API,以 Gmail 作为我的主机,并且对如何使用它发送电子邮件有一个大致的了解。但是有两行代码还是让我很困惑

message.setFrom(new InternetAddress(USERNAME));

API 表示这用于 "Set the "From" 这条消息中的"属性"。但是当我从代码中删除这一行并发送电子邮件时,电子邮件与该行存在时相比没有明显的变化。我假设这对 Gmail 来说是有目的的,以防止垃圾邮件,这让我想知道在使用 Gmail 作为主机时是否有必要这样做。

这也给我添麻烦

props.put("mail.smtp.auth", "true");

根据我收集到的信息,这表明主机是否需要 Gmail 需要的身份验证。然而,将其设置为 false 似乎无济于事,并且消息以与设置为 true 时相同的方式和时间发送。为什么会这样?

感谢您的帮助。如果有帮助,这是我的所有代码。

import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import java.util.Properties;
public class SendEmail
{
    private String msg;
    private String className;
    private final String USERNAME = "email@gmail.com";
    private final String PASSWORD = "password";
    private final String HOST = "smtp.gmail.com";
    public SendEmail(String email, String text, String title)
    {
        String to = email;
        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(USERNAME));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
            message.setSubject(title);
            message.setText(text);

            Transport.send(message, USERNAME, PASSWORD);
            msg = "Email Successfully Sent";
        }
        catch(Exception ex)
        {
            msg = ex.getClass().getName();
        }
    }
}

第一个,

message.setFrom(new InternetAddress(USERNAME));

正在使用 RFC 5321 - Section 3.3 Mail Transactions MAIL 命令(包括 FROM)。同样,mail.smtp.auth

中似乎是可选的
props.put("mail.smtp.auth", "true");`

因为当您在

指定 USERNAMEPASSWORD 时,库假设您要使用 mail.smtp.auth
Transport.send(message, USERNAME, PASSWORD);

Transport.send(Message, String, String) Javadoc 说(部分)

Use the specified user name and password to authenticate to the mail server.