您的位置 首页 java

绝对良心的 Java 中发邮件功能,感动到想哭

开篇语,是不是感觉这个功能都老掉牙了,网上一大推的文章,
随便找个代码就是了,为什么我还要选择专门写一篇呢,因为我遇到了不一样的坑……
 
 首先,不免俗套的把代码都贴上来,拿去执行吧,记住换上你的账号和密码,还有收件人邮箱。
若是执行成功,不谢,后面不用看了,执行不成功再来看看后面的说的啥吧。
 
package mail;
import java.util.Date;
import java.util.Properties;
import javax.mail. session ;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.Mime message ;
import javax.mail.internet.MimeMessage.RecipientType;
import org.junit.Test;
public class MailTest {
 public static final String SMTPSERVER = "smtp.163.com";
 public static final String SMTPPORT = "465";
 public static final String ACCOUT = "yu@163.com";
 // 该密码不是登陆密码,而是授权密码
 public static final String PWD = "123456";
 @Test
 public void testSendEmail() throws Exception {
 Properties props = getMailProperties();
 // 根据邮件配置创建会话,注意session别导错包
 Session session = Session.getDefaultInstance(props);
 // 开启debug模式,可以看到更多详细的输入日志
 session.setDebug(true);
 //创建邮件
 MimeMessage message = createEmail(session);
 //获取传输通道
 Transport transport = session.getTransport();
 // 连接传输通道
 transport.connect(SMTPSERVER,ACCOUT, PWD);
 //发送邮件
 transport. sendMessage (message, message.getAllRecipients());
 transport.close();
 }
 /**
 * 设置邮件相关配置
 */ private Properties getMailProperties() {
 // 创建邮件配置
 Properties props = new Properties();
 // 使用的协议( JavaMail 规范要求)
 props.setProperty("mail.transport.protocol", "smtp");
 // 发件人的邮箱的 SMTP 服务器地址
 props.setProperty("mail.smtp.host", SMTPSERVER);
 // SMTP 服务器端口号,默认的端口号为 25 ,因为使用  SSL  连接方式,所以端口号为 465
 // 为什么使用 SSL,传输加密,更安全
 props.setProperty("mail.smtp.port", SMTPPORT); 
 props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
 props.setProperty("mail.smtp.ssl.enable", "true");
 // 设置需要请求认证
 props.setProperty("mail.smtp.auth", "true");
 return props;
 }
 /**
 * 创建邮件
 */ public MimeMessage createEmail(Session session) throws Exception {
 // 根据会话创建邮件
 MimeMessage msg = new MimeMessage(session);
 // address 邮件地址, personal 邮件昵称, charset 编码方式
 InternetAddress fromAddress = new InternetAddress(ACCOUT,"Dear", "utf-8");
 // 设置发送邮件方
 msg.setFrom(fromAddress);
 InternetAddress receiveAddress = new InternetAddress("yu@qq.com", "test", "utf-8");
 // 设置邮件接收方
 msg.setRecipient(RecipientType.TO, receiveAddress);
 // 设置邮件标题
 msg.setSubject("测试标题", "utf-8");
 msg.setText("啥都不说,点赞吧!");
 // 设置显示的发件时间
 msg.setSentDate(new Date());
 // 保存设置
 msg.saveChanges();
 return msg;
 }
}
 
 我就是像大多数人一样,认为这个功能太简单,网上 copy 一个代码,搞定,可惜…… bug 让我痛不欲生。当我怀着激动的心情运行代码的时候,出现了这个
 
 

神马???为什么连接超时???我能正常访问网络啊,我连不上 163 的服务器??是不是 网易 对我有什么误解啊,好吧,翻过百度前几页,我找到了这样的答案,要在 163 邮箱中设置开启 smtp 的服务,有设置一个授权密码。操作的页面在这

这是基本操作好吧,我当然是已经设置好了也再一次验证了我的授权密码,然鹅,还是

怎么办,我心态有点崩啊,人人都说几分钟搞定的事我已经加班几个小时了,这是为什么!还是依旧的连接超时,为什么连不上呢?端口不对?网址不对?一而再再而三的确认了我使用的是 SSL 连接方式所以不能用默认的 SMTP 默认端口 25 ,端口没毛病啊!对了,我 ping 一下163服务器,看看行不行呗!一看,没毛病啊。凌乱了,真想就这样一直攻击 163 啊,让你连接超时。

还会有什么 bug 呢?再一次打开了百度,整理了这些建议……

1 邮件服务器的 smtp 服务没有打开

我已经打开了呀!

2 登陆账号和密码为账号和客户端授权密码

我密码都换了几个了,就怕记错!

3 设置认证并开启 SSL 加密

必须开启了

4 可能 JDK 的版本过高,安全验证不通过。

仿佛看到了希望,遂 JDK 由 1.8 变成 1.7 ,bug 依旧……

5 163,QQ 邮箱服务器本身频率和次数有限制。

我这一次都没成功好吧……

6 有时候执行成功了,却不见邮件,请去垃圾箱中找一找……

果不其然,搞了一晚上,还是没有解决这个难题……

我会轻易放弃嘛,不可能的!第二天继续搞,这时候忍不住了,不能再强行装逼了,问了问同事,同事说了一句,用自己的 wifi 测试!

妈的,顿时醒悟啊,公司的网络有限制啊!大环境需要FQ,小环境还需要自己开数据啊!果然,代码未动,一次通过,心中那个万千草泥马啊……

你以为到这里就结束了嘛,并没有!我回到家,心想这次可以美滋滋的测试我的功能了,结果,出现了这个

嗯,有进步啊,终于有报错信息了,跟着链接去 see 了一 see ,554 错误对应着什么,操作频繁之类的提醒,这次学乖了,我先去 ipconfig 看了一下自己的 IP ,在局域网内嘛,192.168.100.108 嗯,这个 IP 可能是用的人太多了,于是我又用手机数据测试一波,一次通过!爽

然而,事情没有那么简单,我连上手机的数据之后发现网络不过是网段不一样而已,变成了 192.168.43.249 。我自认为没什么差别啊,搞不清楚…… 后面我又连上无线,看了一眼 IP 地址还是 192.168.100.108,一执行,报错了,返回值是 -1 ,没有想太多,又执行了一次,发现又可以正常发送了……

所以,你和谁说理去呢,就这个功能而言,这是真的不稳定啊,我还看到好多同学说我代码一点都没动啊,为什么前几天还能执行,现在执行不了啊之类的。这真的挺让你难过的…… 要我说,基本面不出问题,那就是网络的原因了,请把目光放到网络上,而不只是代码上,OK ?

全文完。觉得·文章不错的同学可以关注我,第一时间学习行业最新技术,每天学一点,离成功就近一点。

作者: 余同学的开发之路

原文’

文章来源:智云一二三科技

文章标题:绝对良心的 Java 中发邮件功能,感动到想哭

文章地址:https://www.zhihuclub.com/173158.shtml

关于作者: 智云科技

热门文章

网站地图