开篇语,是不是感觉这个功能都老掉牙了,网上一大推的文章,随便找个代码就是了,为什么我还要选择专门写一篇呢,因为我遇到了不一样的坑……

首先,不免俗套的把代码都贴上来,拿去执行吧,记住换上你的账号和授权密码,还有收件人邮箱。若是执行成功,不谢,后面不用看了,执行不成功再来看看后面的说的啥吧。

  1. package mail;
  2.  
  3. import java.util.Date;
  4. import java.util.Properties;
  5.  
  6. import javax.mail.Session;
  7. import javax.mail.Transport;
  8. import javax.mail.internet.InternetAddress;
  9. import javax.mail.internet.MimeMessage;
  10. import javax.mail.internet.MimeMessage.RecipientType;
  11.  
  12. import org.junit.Test;
  13.  
  14. public class MailTest {
  15.  
  16. public static final String SMTPSERVER = "smtp.163.com";
  17. public static final String SMTPPORT = "465";
  18. public static final String ACCOUT = "yu@163.com";
  19. // 该密码不是登陆密码,而是授权密码
  20. public static final String PWD = "123456";
  21.  
  22. @Test
  23. public void testSendEmail() throws Exception {
  24.  
  25. Properties props = getMailProperties();
  26.  
  27. // 根据邮件配置创建会话,注意session别导错包
  28. Session session = Session.getDefaultInstance(props);
  29. // 开启debug模式,可以看到更多详细的输入日志
  30. session.setDebug(true);
  31. //创建邮件
  32. MimeMessage message = createEmail(session);
  33. //获取传输通道
  34. Transport transport = session.getTransport();
  35. // 连接传输通道
  36. transport.connect(SMTPSERVER,ACCOUT, PWD);
  37. //发送邮件
  38. transport.sendMessage(message, message.getAllRecipients());
  39. transport.close();
  40.  
  41. }
  42.  
  43. /**
  44. * 设置邮件相关配置
  45. */
  46. private Properties getMailProperties() {
  47. // 创建邮件配置
  48. Properties props = new Properties();
  49. // 使用的协议(JavaMail规范要求)
  50. props.setProperty("mail.transport.protocol", "smtp");
  51. // 发件人的邮箱的 SMTP 服务器地址
  52. props.setProperty("mail.smtp.host", SMTPSERVER);
  53. // SMTP 服务器端口号,默认的端口号为 25 ,因为使用 SSL 连接方式,所以端口号为 465
  54. // 为什么使用 SSL,传输加密,更安全
  55. props.setProperty("mail.smtp.port", SMTPPORT);
  56. props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
  57. props.setProperty("mail.smtp.ssl.enable", "true");
  58. // 设置需要请求认证
  59. props.setProperty("mail.smtp.auth", "true");
  60. return props;
  61. }
  62.  
  63. /**
  64. * 创建邮件
  65. */
  66. public MimeMessage createEmail(Session session) throws Exception {
  67. // 根据会话创建邮件
  68. MimeMessage msg = new MimeMessage(session);
  69. // address 邮件地址, personal 邮件昵称, charset 编码方式
  70. InternetAddress fromAddress = new InternetAddress(ACCOUT,"Dear", "utf-8");
  71. // 设置发送邮件方
  72. msg.setFrom(fromAddress);
  73. InternetAddress receiveAddress = new InternetAddress("yu@qq.com", "test", "utf-8");
  74. // 设置邮件接收方
  75. msg.setRecipient(RecipientType.TO, receiveAddress);
  76. // 设置邮件标题
  77. msg.setSubject("测试标题", "utf-8");
  78. msg.setText("啥都不说,点赞吧!");
  79. // 设置显示的发件时间
  80. msg.setSentDate(new Date());
  81. // 保存设置
  82. msg.saveChanges();
  83. return msg;
  84. }
  85. }

我就是像大多数人一样,认为这个功能太简单,网上 copy 一个代码,搞定,可惜…… bug 让我痛不欲生。当我怀着激动的心情运行代码的时候,出现了这个

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

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

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

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

  1. 1 邮件服务器的 smtp 服务没有打开。         我已经打开了呀!
  2. 2 登陆账号和密码为账号和客户端授权密码。         我密码都换了几个了,就怕记错!
  3. 3 设置认证并开启 SSL 加密         必须开启了
  4. 4 可能 JDK 的版本过高,安全验证不通过。         仿佛看到了希望,遂 JDK 1.8 变成 1.7 bug 依旧……
  5. 5 163QQ 邮箱服务器本身频率和次数有限制。             我这一次都没成功好吧……
  6.  
  7. 6 有时候执行成功了,却不见邮件,请去垃圾箱中找一找……

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

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

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

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

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

然而,事情没有那么简单,我连上手机的数据之后发现网络不过是网段不一样而已,变成了 192.168.43.249 。我自认为没什么差别啊,搞不清楚…… 后面我又连上无线,看了一眼 IP 地址还是 192.168.100.108,一执行,终于出现了这个大多数人说的返回 -1 的 bug , 纳尼,我貌似还有点开心……

但是经过网络洗礼的我,怎么可能再次跌倒,管你三七二十一,再强行执行一波,果然,邮件发送成功 !

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

后记:这么看,同一个 IP 一会可以发出去,一会发不出去,我表示很不理解,遂心想,是不是网易对 IP 有限制呀,我咨询了一下客服,得到的结果是和 IP 没有关系,和账号有关,具体解释是一个账号每天允许发送 200-400 条。根据你的账号 level 来定。

可能客服没有骗我,确实和 IP 没有关系,那为什么我这一个 IP 一会可用一会不可用呢,我估计是因为我在局域网中吧,因为我的内网地址是 168.192.100.108 .这只是一个内网地址嘛,映射到外网不稳定也是有可能的,若是把这个功能放到自己的服务器上可能就会稳定一些。

全文完。

绝对良心的 Java 中发邮件功能的更多相关文章

  1. [置顶] Java中发邮件的6种方法

    1.官方标准JavaMail Sun(Oracle)官方标准,功能强大,用起来比较繁琐. 官方资料:http://www.oracle.com/technetwork/java/javamail/in ...

  2. Java中发邮件的6种方法

    1.官方标准JavaMail Sun(Oracle)官方标准,功能强大,用起来比较繁琐. 官方资料:http://www.oracle.com/technetwork/java/javamail/in ...

  3. Java实现发邮件功能---网易邮箱

    目录 Java实现发邮件功能 前言 开发环境 代码 效果 结束语 Java实现发邮件功能 前言 电子邮件的应用场景非常广泛,例如新用户加入,即时发送优惠清单.通过邮件找回密码.监听后台程序,出现异常自 ...

  4. 手动搭建apache james邮件服务器,实现邮件功能

    最近一直在搞邮件这块,本来我们邮件发送是用的腾讯免费的企业邮箱,邮件功能没有问题,但是由于邮件的限制,如下: 这些限制导致我们的部分客户是收不到邮件的,哪怕付费,这样的固定频率限制也是无法解决的,可以 ...

  5. Java 实现邮件的发送

                                             Java 实现邮件的发送 开发邮箱发送功能必须看邮箱方面的资料 改一些东西  (我的是qq 邮箱哟   开通 POP3 ...

  6. 【Java EE 学习 21 下】【 使用易宝支付接口实现java网上支付功能】

    一.网上支付分为两种情况,一种方法是使用直接和银行的支付接口,另外一种方法是使用第三方支付平台和银行对接完成支付. 1.直接和银行对接. 2.使用第三方支付平台 3.常见的第三方支付平台 二.使用易宝 ...

  7. SQLSERVER监控复制并使用数据库邮件功能发告警邮件

    SQLSERVER监控复制并使用数据库邮件功能发告警邮件 最近熬出病来了,都说IT行业伤不起,不说了,说回今天的正题 正题 上个月月底的时候因为要搬迁机房,需要将一个数据信息数据库先搬到我们的机房,然 ...

  8. Java发邮件:Java Mail与Apache Mail

    作者:Vinkn 来自http://www.cnblogs.com/Vinkn/ 一.邮件简介 一封邮件由很多信息构成,主要的信息如下,其他的暂时不考虑,例如抄送等: 1.收件人:收件人的邮箱地址,例 ...

  9. Gmail邮件功能那么强大,GMail被封,在国内怎么用gmail收邮件?

    IT圈子里最热门的话题一定是:gmail被封,该怎么办?gmail由于强大的邮件功能,ITer一定是人手一个or多个,之前想要收发gmail使用imap或SMTP方式是可以在国内正常使用的,目前ima ...

随机推荐

  1. 2014年最佳的10款 PHP 开发框架

    PHP去年发生了翻天覆地的变化.似乎每个人都有一个想法一个好的框架应该是什么样子,但话又说回来,没有多少面积制品类型的框架或框架的最终实际使用在不同的生产项目. 你知道哪个框架选择为您的生产计划吗?你 ...

  2. Ex1—vlookup

    VLOOKUP 的语法结构 整个计算机就相当于一门语言,首先我们就是要获取该函数的语法结构.以下是官网的语法结构 VLOOKUP(lookup_value, table_array, col_inde ...

  3. id=%d是什么意思呢?

    $branch=M('Branchs')->where("id=%d",session('branchid'))->find(); %d代表,逗号后面那个user[]的 ...

  4. 《廖雪峰Git教程》学习笔记

    原文链接 一.创建版本库 ①初始化一个Git仓库:git init ②添加文件到Git仓库:1.git add<file> ;  2.git commit 二.时光机穿梭 ①查看工作区状态 ...

  5. 配置replica set的常见问题

    总有人问起配置ReplicaSet不成功,总结了一下基本上的可能性就几种,检查步骤如下: 假设三台机器的IP分别是 A: 192.168.1.2 a.test.com B:192.168.1.3 b. ...

  6. ubuntu网络连接:Ifupdown(eth0)的连接不能修改或删除

    今天其实遇到了三个问题,一个是ubuntu系统上的网络图标不见了,把网络图标弄出来以后有无法联网,联网成功却变成Ifupdown(eth0)的连接且不能修改或删除. 这里我只记录最后一个问题,前两个问 ...

  7. 脚本病毒分析扫描专题2-Powershell代码阅读扫盲

    4.2.PowerShell 为了保障木马样本的体积很小利于传播.攻击者会借助宏->WMI->Powershell的方式下载可执行文件恶意代码.最近也经常会遇见利用Powershell通过 ...

  8. Python标准库笔记(11) — Operator模块

    Operator--标准功能性操作符接口. 代码中使用迭代器时,有时必须要为一个简单表达式创建函数.有些情况这些函数可以用一个lambda函数实现,但是对于某些操作,根本没必要去写一个新的函数.因此o ...

  9. go 匿名函数和闭包

    匿名函数 1. 函数也是一种类型,因此可以定义作为一个函数类型的变量 package main import "fmt" // 函数作为参数 func add(a, b int) ...

  10. android开发中常用的快捷键

    Eclipse快捷键-方便查找,呵呵,记性不好 行注释/销注释 Ctrl+/  块注释/销注释/XML注释 Ctrl+Shift+/   Ctrl+Shift+\查找 查找替换 Ctrl+H  Ctr ...