Java邮件发送以及SMTP各端口的含义与用法

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 服务器地址,USERNAMEPASSWORD 是邮件发送方的账户信息。

下面来讲解一下我们常用的几个邮件发送端口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端口。

今天的分享就到这里啦,祝大家编码愉快

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值