邮件发送的背景和重要性
在交付型项目中,消息提醒系统扮演着至关重要的角色,直接影响到甲方的验收标准。四大消息系统的实现是项目成功的关键,它们分别是:
-
邮件提醒:作为最传统且广泛使用的通知方式,邮件提醒能够有效传达重要信息,确保用户及时获取项目进展、关键事项和紧急通知。
-
短信提醒:短信的即时性和高打开率使其成为与用户沟通的重要工具,尤其在需要快速反馈时,短信提醒能够迅速传递信息。
-
社交媒体推送:通过社交媒体平台推送通知,可以增强用户的参与感和互动性,为用户提供更为便捷的信息获取方式,尤其适用于面向年轻用户群体的项目。
-
业务系统网页推送:网页推送是现代互联网项目中不可或缺的一部分,能够在用户使用系统时,实时推送重要消息和更新,提升用户体验。
邮件发送的基本概念
-
邮件的构成:
- 发件人:发送邮件的人的邮箱地址。
- 收件人:接收邮件的人的邮箱地址,支持多个收件人。
- 主题:邮件的标题,简洁明了地概括邮件内容。
- 正文:邮件的主要内容,可以是文本、HTML格式或附件。
-
常见邮件协议:
- SMTP(简单邮件传输协议):用于发送邮件的协议,负责将邮件从发件人服务器传递到收件人服务器。
- POP3(邮局协议版本3):用于从邮件服务器接收邮件的协议,通常将邮件下载到本地,删除服务器上的副本。
- IMAP(互联网消息访问协议):也用于接收邮件,但与POP3不同,它允许用户在邮件服务器上管理邮件,支持多设备同步。
选择邮件服务器
- QQ邮箱
- 163邮箱
个人理解总结
在开发中,常见的协议大多数符合OSI七层网络模型,并采用C/S架构(客户端/服务端)。在项目启动前,我们需要明确选择合适的客户端和服务端。这样,解题思路会变得更加清晰。
即使没有接触过相关内容,我们也可以选择一个例如JavaMail的客户端,并了解其使用的协议。这将帮助我们在筛选服务端时,锁定具体的实现方案。
以QQ邮箱为例,我们可以探讨如何实现邮件发送功能。通过明确使用的协议和架构,能够有效指导开发过程,确保项目的顺利推进。
项目实际需求及开发背景
我们正在开发一个商城系统,用户浏览商品,下单购买,支付成功之后,用户通过可开票订单列表选择某个订单申请开票,开票页面会要求用户填写发票购买方的抬头,以及接收邮件的地址,接收短信的手机号,填写完毕直接开票,开具成功之后短信提醒,同时将pdf文件发送到指定的邮箱。用户查看邮件时能看到一个相对美观的网页,因为邮件服务器提供商是不会为你的内容生成任何模板的,毕竟是免费使用的嘛。
到这里大概的功能点已经比较清晰了,大概的接口是修改发票状态接口,读取网络流的接口(第三方返回发票信息pdf的url),发短信接口,发邮件接口,修改订单表的接口(同一个订单不能重复开发票),发票状态修改之后需要发送邮件。
需要考虑到的点
邮箱地址不可达或者邮箱地址填写不正确,如果修改发票状态的接口和邮件接口都在一个方法中,事务也会是同一个,会因为发送邮件失败时的异常导致修改发票状态回滚,这会导致开票流程上bug,因为事务具备传播特性,会导致同一个线程中各个事务一起回滚。为了不让他回滚,我们需要控制事务的传播特性
控制事务传播特性的几种手段
1,使用spring的@Async注解执行异步任务
2,修改发邮件serivce方法的事务传播特性,@Transaction注解的属性可以指定事务传播特性
3,创建子线程来执行
因为我们项目的事务是使用拦截器根据方法名来设置事务隔离级别和传播特性的,我这里就不使用@Transaction注解演示了
发送邮件的交给调度器去做,我可以创建一个ExecutorService,让子线程去处理任务,默认情况下,子线程是获取不到主线程创建的事务管理器的,也就不会有事务传播了,解决完这几个问题点之后,着手开发。
以SpringBoot框架为例,实现一个QQ邮箱发邮件功能
如果没有接触过,会很懵,客户端其实就是一行行的代码,添加依赖可以直接去看,但是服务