开篇语, 是不是感觉这个功能都老掉牙了, 网上一大推的文章, 随便找个代码就是了, 为什么我还要选择专门写一篇呢, 因为我遇到了不一样的坑......
首先, 不免俗套的把代码都贴上来, 拿去执行吧, 记住换上你的账号和密码, 还有收件人邮箱. 若是执行成功, 不谢, 后面不用看了, 执行不成功再来看看后面的说的啥吧.
- 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.MimeMessage;
- 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 呢? 再一次打开了百度, 整理了这些建议......
邮件服务器的 smtp 服务没有打开. 我已经打开了呀!
登陆账号和密码为账号和客户端授权密码. 我密码都换了几个了, 就怕记错!
设置认证并开启 SSL 加密 必须开启了
可能 JDK 的版本过高, 安全验证不通过. 仿佛看到了希望, 遂 JDK 由 1.8 变成 1.7 ,bug 依旧......
163,QQ 邮箱服务器本身频率和次数有限制. 我这一次都没成功好吧......
有时候执行成功了, 却不见邮件, 请去垃圾箱中找一找......
果不其然, 搞了一晚上, 还是没有解决这个难题......
我会轻易放弃嘛, 不可能的! 第二天继续搞, 这时候忍不住了, 不能再强行装逼了, 问了问同事, 同事说了一句, 用自己的 Wi-Fi 测试!
妈的, 顿时醒悟啊, 公司的网络有限制啊! 大环境需要 FQ, 小环境还需要自己开数据啊! 果然, 代码未动, 一次通过, 心中那个万千草泥马啊......
你以为到这里就结束了嘛, 并没有! 我回到家, 心想这次可以美滋滋的测试我的功能了, 结果, 出现了这个
嗯, 有进步啊, 终于有报错信息了, 跟着链接去 see 了一 see ,554 错误对应着什么, 操作频繁之类的提醒, 这次学乖了, 我先去 ipconfig 看了一下自己的 IP , 在局域网内嘛, 192.168.100.108 嗯, 这个 IP 可能是用的人太多了, 于是我又用手机数据测试一波, 一次通过! 爽
然而, 事情没有那么简单, 我连上手机的数据之后发现网络不过是网段不一样而已, 变成了 192.168.43.249 . 我自认为没什么差别啊, 搞不清楚...... 后面我又连上无线, 看了一眼 IP 地址还是 192.168.100.108, 一执行, 报错了, 返回值是 -1 , 没有想太多, 又执行了一次, 发现又可以正常发送了......
所以, 你和谁说理去呢, 就这个功能而言, 这是真的不稳定啊, 我还看到好多同学说我代码一点都没动啊, 为什么前几天还能执行, 现在执行不了啊之类的. 这真的挺让你难过的...... 要我说, 基本面不出问题, 那就是网络的原因了, 请把目光放到网络上, 而不只是代码上, OK ?
全文完.
来源: https://www.cnblogs.com/YJK923/p/10089758.html