在本文中,我们将向您展示如何通过Gmail SMTP服务器发送电子邮件。
要使用Java发送电子邮件,我们需要JavaMail
pom.xml
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
1.通过TLS的Gmail SMTP
SMTP = smtp.gmail.com
Port = 587
SendEmailTLS.java
package com.mkyong;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class SendEmailTLS {
public static void main(String[] args) {
final String username = "username@gmail.com";
final String password = "password";
Properties prop = new Properties();
prop.put("mail.smtp.host", "smtp.gmail.com");
prop.put("mail.smtp.port", "587");
prop.put("mail.smtp.auth", "true");
prop.put("mail.smtp.starttls.enable", "true"); //TLS
Session session = Session.getInstance(prop,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("from@gmail.com"));
message.setRecipients(
Message.RecipientType.TO,
InternetAddress.parse("to_username_a@gmail.com, to_username_b@yahoo.com")
);
message.setSubject("Testing Gmail TLS");
message.setText("Dear Mail Crawler,"
+ "\n\n Please do not spam my email!");
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
2.通过SSL的Gmail
2.1逻辑相同,只是传递不同的属性值。
SMTP = smtp.gmail.com
Port = 465
SendEmailSSL.java
package com.mkyong;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class SendEmailSSL {
public static void main(String[] args) {
final String username = "username@gmail.com";
final String password = "password";
Properties prop = new Properties();
prop.put("mail.smtp.host", "smtp.gmail.com");
prop.put("mail.smtp.port", "465");
prop.put("mail.smtp.auth", "true");
prop.put("mail.smtp.socketFactory.port", "465");
prop.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
Session session = Session.getInstance(prop,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("from@gmail.com"));
message.setRecipients(
Message.RecipientType.TO,
InternetAddress.parse("to_username_a@gmail.com, to_username_b@yahoo.com")
);
message.setSubject("Testing Gmail SSL");
message.setText("Dear Mail Crawler,"
+ "\n\n Please do not spam my email!");
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
3.需要特定于应用程序的密码
3.1如果两步验证已启用。 我们将遇到以下错误消息:
Caused by: javax.mail.AuthenticationFailedException: 534-5.7.9 Application-specific password required. Learn more at
534 5.7.9 https://support.google.com/mail/?p=InvalidSecondFactor - gsmtp
at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:965)
at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:876)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:780)
at javax.mail.Service.connect(Service.java:388)
at javax.mail.Service.connect(Service.java:246)
at javax.mail.Service.connect(Service.java:195)
at javax.mail.Transport.send0(Transport.java:254)
at javax.mail.Transport.send(Transport.java:124)
at com.mkyong.calculator.SendEmail.main(SendEmail.java:41)
3.2 要解决此问题 ,请按照本指南创建应用密码
网址:https://support.google.com/accounts/answer/185833?p=InvalidSecondFactor
网址:https://myaccount.google.com/security
代码没有区别,只是放了新生成的应用程序密码。
SendEmail.java
package com.mkyong;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class SendEmail {
public static void main(String[] args) {
final String username = "username@gmail.com";
final String password = "puts your app password here"; // update here
// same code...
}
}
java.net.UnknownHostException:smtp.gmail.com
确保防火墙或代理服务器未阻止此smtp.gmail.com
参考文献
- 使用应用密码登录
- 从打印机,扫描仪或应用程序发送电子邮件
- Java邮件
- 使用POP读取其他电子邮件客户端上的Gmail邮件
- 如何从Maven下载JavaMail API
- Spring Boot –如何通过SMTP发送电子邮件
翻译自: https://mkyong.com/java/javamail-api-sending-email-via-gmail-smtp-example/