今天公司企业邮箱改成阿里云的了,导致程序报错。
后来在把公司的邮局地址改为 smtp换成 smtp.qiye.aliyun.com之后。
程序爆出如下错误:
Caused by: javax.mail.MessagingException: Could not connect to SMTP host: smtp.qiye.aliyun.com, port: 465, response: -1 at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1270) at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:370) at javax.mail.Service.connect(Service.java:275)
但是通过【三叔工具箱】的发邮件功能测试,发现配置没问题。
收到的邮件:
唯一的区别就是,以前走的25端口,现在改为了465端口。
从邮件测试得知,阿里邮局地址、端口、邮箱登录账号密码都没错。
此时唯一有问题的,就是我们的代码javamail没有走ssl协议。
于是在追加:
props.put("mail.smtp.starttls.enable", true); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.ssl.trust", smtpServer);
后错误变了:
Caused by: com.sun.mail.smtp.SMTPSendFailedException: 440 mail from account doesn't conform with authentication (Auth Account:BarCodeSupport@goodbabygroup.com|Mail Account:BarCodeSupport@qiye.aliyun.com) at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388) at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959) at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583)
这个是因为发邮件的和发件人必须是同一个(以前这个漏洞,可以伪造任何发件人)
于是我又追加了:
props.put("mail.smtp.user", userName); props.put("mail.smtp.from", userName);
代码变成:
props.put("mail.smtp.host", host); props.put("mail.smtp.port", port); props.put("mail.smtp.auth", "true"); //指定是否需要SMTP验证 props.put("mail.debug", "false"); props.put("mail.smtp.starttls.enable", true); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.ssl.trust", smtpServer); props.put("mail.smtp.user", userName); props.put("mail.smtp.from", userName); ma = new MailAuthenticator(userName, password);
终于发成功了