邮件系统的背景
在日常工作,生活乃至休闲娱乐中,消息始终难以规避。到底是什么让她那么具有魔力,对我们起着不可言喻的作用,抑或让我们苦不堪言,接下来就让我们一起去揭开了她神秘的面纱,一窥究竟。
无论是一个系统的诞生,抑或一个功能的online,抑或一个需求的萌发,比较佛性的解释为:万事皆有因果。操着商业化的口音,我们称之为“业务”,归根结底,是业务的需求推动着这一切的运作。系统的运营方想要通过己方有限的资源去实现收益的最大化,无非通过一些手段让客户了解一些新的值得投入资金的活动,而这其中的手段莫过于:陌拜,电销,短信推广,应用及消息,系统级消息,邮件等主要手段。较时间花费,资金消耗,性价比等而言,邮件系统便脱颖而出。
复制代码
邮件系统的应用
对于一个没有在代码层级接触过邮件系统的人而言,这是一个陌生的课题,在一定意义上可能要从“三次握手”讲起。
情景题:两个人隔着一道门,互相看不到对象,而又想要聊天,请问应该怎样建立对话?
第一次握手:一个人对另外一个人说,hello?
第二次握手:另外一个人听到hello后,发出一个hello的声音进行回应;
第三次握手:前者听到hello后,双方确认online,开始交流。
以上便是TCP下的三次握手。
了解了以上的链接建立的过程,我们此时不难推断出邮件系统成为天选之人的原因:邮件我发给你了,就存在着达到目的的可能,即便没有被查看,开销也小,几乎无成本,没有丝毫损耗。接下来让我们了解下邮件发送中的三种协议后,一吐为快。
复制代码
什么是POP3、SMTP和IMAP?
1.POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件。
2.IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。与POP3不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。
3.SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。
复制代码
如何选择smtp端口
https://pepipost.com/blog/25-465-587-2525-choose-the-right-smtp-port/
复制代码
邮件系统中挖过的那些坑
这个世界的进步是由懒人推动的,因为他们对自我修养的要求甚高,无止境的追求“复用性”与简洁,能动手解决的问题从来不瞎吵吵,接下来是show time。
1、上述代码块虽然立足不同觉度实现了不同的功能,但洋洋洒洒的呈现出来显然不是一个有着高度自我追求的开发者应留下的痕迹;
2、上述臃肿代码产生的原因归根结底还是没有对需求进行预判,没有对字段进行预留;
3、上述代码没有将方法的抽取进行到底。
4、能动手解决的问题,拒绝瞎吵吵,来解决问题吧。
复制代码
邮件系统中的那些事
1、腾讯企业邮箱用着还是比较舒服的,拿着账号和密码,匹配上对应的服务器即可实现邮件的发送,过程很愉快;
2、与腾讯企业邮箱相比,QQ邮箱与163邮箱有着神同步的操作,首先你要去设置中开启SMTP服务,届时进行短信验证是必要的,最狗血的是它会当时给你展示授权码来当密码用,在程序中用这个授权码来代替密码,下面是喷它时间:授权码只展示一次。你当时没有用别的途径自己记下的话,你以后再用时会发现再也找不到这个授权码了,再也找不到了,只能重复着关闭SMTP服务,开启SMTP服务,发送短信,在页面上获取到代替密码的授权码。用过你就会知道什么是绝望。友情提示:此处会报认证失败错误(JavaMail javax.mail.AuthenticationFailedException);
3、下面再来说说比较神秘的EOF错误,满论坛的解决方案几乎一样,漫天的扯淡吓得我赶紧丢出了干货,邮件内容不能为空,通常是测试数据过于随意,甚至不写造成的,javax.mail.MessagingException: IOException while sending message 报错也是同样的原因,比较诡异的事同样的败笔居然可能会导致不同的报错信息,目前测试看来是使用的邮箱服务器不同,导致报错信息不同;
4、你可能在实际开发中会多种邮箱掺杂着进行书写或测试,其中邮件发送的服务器可能没有换成对应邮箱的服务器,此处应有认证失败报错(javax.mail.AuthenticationFailedException);
5、或许你很奇怪邮件程序本身没有报错,为没有在收件箱中却迟迟没有找到,其实程序给你的体现已经是最真实的了,原因肯定在于后者,没有找到是因为它可能由于是程序发抑或所发送的信息过于敏感抑或过于简单而被拦截到邮箱垃圾回收站里去了。而且邮件本身也没有提醒的,这一点也是很狗血的;
6、网络上关于JavaMail的code一抓一大把,在我看来那些只不过一个个的坑罢了,此处应该讲解下
Session session = Session.getInstance(properties,authenticator);
Session session = Session.getDefaultInstance(properties,authenticator);
这里存在的问题就是session的获取了,getDefaultInstance会去javaMail Session中获取defaultSession,所以当你用单一邮箱地址发送邮件是没有问题的,但是当你用多个邮箱地址去发送的时候问题就来了,你会发现它永远用的是你第一个邮箱地址发送出去邮件的,此处应该填坑一处,接下来是重头戏;
7、gmail邮件在国内(China)是难以进行测试的,因为无法连接到gmail的服务器,在你代码准确无误地情况下,此时再出现javax.mail.AuthenticationFailedException报错信息时,你可能短则几天长达数十天可能也无法解决这个问题,网上的千篇一律鞭策着我做一个有良知的开发人员,我们不只是代码的搬运工,坑总是被有追求的人给填的。此时你需要做的是登陆该邮箱地址,到其google账户中心去设置一番即可:登陆gmail邮箱 -> 点击右上角账户图标 -> 点击google账户 -> 点击登录和安全 -> 拉到最底部 允许不够安全的应用:已停用 —> 打开即可:允许不够安全的应用:已启用。
复制代码
工作总结
从最开始的为了邮件功能而做邮件功能开始,我们就疲于功能的开发,而忽略了一个优秀开发者应具备的基本素养,所以从最开始来说那就是个mistake。从一块马蹄铁到一个国家灭亡的寓言为人所知,然而历史总是惊人的相似。从一开始的没有进行数据结构的合理设计及预留,带来的结果是每次关于邮件的功能都像是从新开发,其中掺杂着就自己记忆力的过于自信,没有及时的记录下具体的解决方案,所产生的结果是每次继续开发起来都有新感觉。接下来我想谈一下作为一名开发者应具备的基本素养。
曾几何时我也想过从网上能找到有点含金量的东西搬过来给大家炖点鸡汤,可能是我没有找到吧,遂提笔挥毫。人法地,地法天,天法道,道法自然。这就阐明了万物皆有章可循,技术开发莫过于此。作为一名开发人员,时刻保持头脑的清醒,逻辑的清晰是必要的,因为任何人都无法预知自己在脑子一热时会做出什么样的事情,这就是那块马蹄铁。搞技术需要造轮子,这就可复用性,亦可谓前人栽树,后人乘凉,或许这就是那匹马。在阅读时没人愿意读一团糟的内容,尤其是在读到后面时发现书写者的思绪可能已经混乱了,这便是凝练了:方法的抽取见名知意,对象的封装点到为止,阅读者的阅读行云流水,书写者的一气呵成。团队开发是工作常态,说明文档的书写也是势在必行,这样能大大节约团队间协作的沟通成本。需求分析能力,项目设计方法和流程处理能力,复用设计和模块分解能力,整体项目的评估能力,团队组织管理能力,诸如此类不胜枚举,这是我们在职业生涯中应学习到的东西。至少能在哪天被嘲讽为“咸鱼”的时候,高傲的说出“至少我还咸”的话语。
如同“君子有所为,有所不为”,即有取名“有所为”,“吴所谓”,这才是人生。这里要讲的是在其位谋其政,我们不仅要有自身素养的卓越追求,更要有强烈的责任感。自己的一时疏忽可能为整个团队的效率大打折扣,甚至有更大的牺牲,这便是团队中的木桶效应。关于人生观论点自处不愿长篇大论,唯有愿意听的人闻此醍醐灌顶。
言归正传,邮件中出现的问题虽然当时解决时感觉到很棘手,现在再次来做时又有新感觉,其实问题就摆在我们的眼前,早早确信代码无误,运行着的程序报错连连,解决方案却迟迟拿不出来,如此鲜明的对比不禁让人痛惜。前者确信无误,后者端倪不明,线上问题层出不穷,推此及彼,我们需要做的只不过顺藤摸瓜罢了。
复制代码