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");`
因为当您在
指定 USERNAME
和 PASSWORD
时,库假设您要使用 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.
我一直在使用 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");`
因为当您在
指定USERNAME
和 PASSWORD
时,库假设您要使用 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.