javaMail 使用SMTP邮箱服务器发送邮件

本文介绍了使用JavaMail通过SMTP发送邮件的过程,特别针对Office365邮箱进行了详细说明,包括遇到的端口、加密方式等问题以及解决办法。

POP3/SMTP协议

smtp默认端口是:25

接收邮件服务器:pop.exmail.qq.com ,使用SSL,端口号995
发送邮件服务器:smtp.exmail.qq.com ,使用SSL,端口号465
海外用户可使用以下服务器
接收邮件服务器:hwpop.exmail.qq.com ,使用SSL,端口号995
发送邮件服务器:hwsmtp.exmail.qq.com ,使用SSL,端口号465
 
 

废话不多说,直接上代码

        if (useSSL == true) {
            String smtpPort = "465";
            props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
            props.setProperty("mail.smtp.host", smtphost);
            props.setProperty("mail.smtp.auth", "true");
            props.setProperty("mail.smtp.port", smtpPort);
            props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            props.setProperty("mail.smtp.socketFactory.fallback", "false");
            props.setProperty("mail.smtp.socketFactory.port", smtpPort);
            // props.put("mail.smtp.starttls.enable", "true");
            props.setProperty("mail.smtp.ssl.enable", "true");
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            props.put("mail.smtp.ssl.socketFactory", sf);
        } else {
            String smtpPort = "25";
            props.setProperty("mail.transport.protocol", "smtp");
            props.setProperty("mail.smtp.host", smtphost);
            props.setProperty("mail.smtp.auth", "true");
            props.setProperty("mail.smtp.port", smtpPort);
            props.setProperty("mail.smtp.socketFactory.fallback", "false");
            props.setProperty("mail.smtp.socketFactory.port", smtpPort);
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            props.put("mail.smtp.ssl.socketFactory", sf);
        }
        Authenticator authenticator = new Authenticator() {
            @Override
            protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(sendmail, sendpassword);
            }
        };
        Session session = Session.getDefaultInstance(props, authenticator);
        // 2. 根据配置创建会话对象, 用于和邮件服务器交互
        // Session session = Session.getDefaultInstance(props);
        session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log
        System.getProperties().setProperty("mail.mime.splitlongparameters", "false");

以上方法已经可以处理大部分的邮件发送业务了,但是今天遇到一个坑爹的问题,客户使用的是office365的邮箱,上面的方法用不了了,郁闷......

经过和客户确认,他们使用的office365邮箱,

端口是:587

SMTP服务器是:smtp.office365.com

加密方法是:STARTTLS

 

 

 

于是我就改了代码将上面的465端口全部改为了587,结果还是不行,连接超时

查看资料发现如果要使用365邮箱需要注释一些配置

//props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory")
// props.setProperty("mail.smtp.ssl.enable", "true");

 

按网上说的改了以后,信心满满的去测试,结果还是不行,报了下面的错误

javax.mail.AuthenticationFailedException: 535 5.7.3 Authentication unsuccessful [HK2PR0401CA0024.apcprd04.prod.outlook.com]

        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:366)
        at javax.mail.Service.connect(Service.java:246)
        at com.vamtoo.dsm.common.util.EmailUtil.testConnectBySmtp(EmailUtil.java:201)
        at com.vamtoo.dsm.controller.SysParamController.save(SysParamController.java:100)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

接着找原因,发现还要添加一个配置

props.put("mail.smtp.starttls.enable", "true");

添加完以后测试发现还是报错

com.sun.mail.smtp.SMTPSendFailedException: 451 5.7.3 STARTTLS is required to send mail.......

需要在ssl配置中再添加一个配置

props.put("mail.smtp.starttls.required", "true");

至此问题解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值