import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class JavaMail {
private static final String SMTP_SERVER = "smtp.example.com";
private static final String USERNAME = "";
private static final String PASSWORD = "";
private static final String EMAIL_FROM = "from@example.com";
private static final String EMAIL_TO = "to@example.com";
private static final String EMAIL_SUBJECT = "Test Send Email";
private static final String EMAIL_TEXT = "Hello World";
public static void main(String[] args) {
Properties prop = System.getProperties();
prop.put("mail.smtp.host", SMTP_SERVER);
prop.put("mail.smtp.auth", "true");
prop.put("mail.smtp.port", "587");
prop.put("mail.smtp.starttls.enable", "true");
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(EMAIL_FROM));
message.setRecipients(
Message.RecipientType.TO, InternetAddress.parse(EMAIL_TO));
message.setSubject(EMAIL_SUBJECT);
message.setText(EMAIL_TEXT);
Transport.send(message);
System.out.println("Mail successfully sent");
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
在这段代码中,SMTP_SERVER
是 SMTP 服务器地址,USERNAME
和 PASSWORD
是邮件发送方的账户信息。
下面来讲解一下我们常用的几个邮件发送端口25/465/587
- 端口25是用于SMTP(简单邮件传输协议)的原始标准端口,SMTP协议是用于发送电子邮件的互联网标准。然而,因为它经常被用于发送垃圾邮件和执行网络攻击,许多互联网服务提供商(ISPs)和网络管理员已经开始阻止或限制对端口25的访问。需要注意的是,虽然端口25现在通常不用于客户端电子邮件提交,但它仍然广泛用于邮件服务器之间的电子邮件传输。这就是为什么在配置邮件服务器时,通常仍需要开放端口25。
- 端口465是SMTPS协议的端口,使用SSL/TLS协议进行安全连接。在这种方式中,客户端和服务器在建立连接时就开始进行加密,所有的数据在整个传输过程中都是加密的。
- 端口587 是SMTP协议的默认端口,使用STARTTLS协议进行安全连接。在这种方式中,客户端首先建立一个未加密的连接到SMTP服务器,然后使用STARTTLS命令切换到加密连接。如果服务器不支持STARTTLS命令,那么连接将保持未加密状态。
下面来讲解一下properties中各参数用法,注意这里需要配合具体的端口使用
使用465端口时,properties配置如下:
props.put("mail.smtps.host", "smtp.example.com"); //smtp主机地址
props.put("mail.smtps.port", "465"); //端口号
props.put("mail.smtps.auth", "true"); //允许身份验证
props.put("mail.smtps.ssl.enable", "true"); //启用ssl协议
并且在创建Transport的时候需要特别指明smtps协议类型
Transport transport = session.getTransport("smtps");
使用587端口时,properties配置如下:
props.put("mail.smtps.host", "smtp.example.com"); //smtp主机地址
props.put("mail.smtps.port", "587"); //端口号
props.put("mail.smtps.auth", "true"); //允许身份验证
props.put("mail.smtp.starttls.required", "true"); //允许使用starttls协议
props.put("mail.smtp.starttls.enable", "true"); //启用starttls协议
如果在调试过程中出现异常,或者方法执行了,没有报错也没有成功发送邮件,我们可以在properties中开启debug模式来帮助我们快速排查问题
props.put("mail.debug", "true");
这里举一个经常出现的问题:Got bad greeting from SMTP host: smtp.xxx.com, port: 587, response: [EOF]
这个错误的意思是与邮件服务连接错误,这时候我们可以通过telnet命名检查我们的服务器与对方服务的连接情况,如果telnet返回失败,则可尝试465端口。
今天的分享就到这里啦,祝大家编码愉快