当前位置: 首页 > news >正文

【SSH网上商城项目实战25】使用java email给用户发送邮件

转自:https://blog.csdn.net/eson_15/article/details/51475046  

当用户购买完商品后,我们应该向用户发送一封邮件,告诉他订单已生成之类的信息,邮箱地址是从用户的基本信息中获取,好了,首先我们来看一下java中发送邮件的方法。

 

1. java中发送email的方法

 

  在完善这个项目之前,先来回顾一下java中是如何发送邮件的,首先肯定需要发送邮件的jar包:mail.jar,导入到lib目录下,好了,下面我们先写一个普通的java程序来回顾一下java email的知识点:

 

 1 public class SendEmailDemo {
 2 
 3     public static void main(String[] args) throws Exception {
 4 
 5         //1. 登陆邮件客户端(创建会话session)
 6         Properties prop = new Properties();
 7         prop.setProperty("mail.transport.protocol", "smtp");    
 8         //创建了session会话
 9         Session session = Session.getDefaultInstance(prop);
10         //设置debug模式来调试发送信息
11         session.setDebug(true);
12         //创建一封邮件对象
13         Message message = new MimeMessage(session);
14         //写信
15         message.setSubject("欢迎访问我的CSDN博客主页!");
16         //正文内容
17         message.setContent("欢迎访问我的CSDN博客主页:http://blog.csdn.net/eson_15"
18                 + ",么么哒~", "text/html;charset=utf-8");
19         //附件人地址
20         message.setFrom(new InternetAddress("nishengwus@163.com"));
21         Transport transport = session.getTransport();
22         //链接邮件服务器的认证信息
23         transport.connect("smtp.163.com", "nishengwus", "xxxxx密码");
24         // 设置收件人地址,并发送邮件
25         transport.sendMessage(message, new InternetAddress[]{new InternetAddress("694076359@qq.com")});
26         transport.close();
27     }
28 }

 

  上面就是用java发送邮件的流程:创建会话–>封装邮件信息–>设置发件人地址–>设置收件人地址–>发送。

 

2. 封装发送邮件功能

 

 

  回顾了java发送邮件的方法后,我们将这个流程封装到一个工具类中,新建一个EmailUtilImpl实现类,完成后 抽取成EmailUtil接口,如下:

 1 //抽取后的EmailUtil接口
 2 public interface EmailUtil {
 3 
 4     public abstract void sendEmail(String emailAddress, String id);
 5 
 6 }
 7 
 8 //EmailUtilImpl实现类
 9 @Component("emailUtil")
10 public class EmailUtilImpl implements EmailUtil {
11     //参数接收顾客的邮箱地址和订单编号
12     @Override
13     public void sendEmail(String emailAddress, String id) {
14         // 1. 登陆邮件客户端(创建会话session)
15         Properties prop = new Properties();
16         Session session = null;
17         Message message = null;
18         Transport transport = null;
19         try {
20             prop.setProperty("mail.transport.protocol", "smtp");
21             // 创建了session会话
22             session = Session.getDefaultInstance(prop);
23             // 设置debug模式来调试发送信息
24             session.setDebug(true);
25             // 创建一封邮件对象
26             message = new MimeMessage(session);
27             // 写信
28             message.setSubject("网上商城订单反馈");
29             // 正文内容
30             message.setContent("顾客您好,欢迎您光顾网上商城,订单" + id + "已支付成功!", "text/html;charset=utf-8");
31             // 附件人地址
32             message.setFrom(new InternetAddress("soft03_test@sina.com"));           
33             transport = session.getTransport();
34             // 链接邮件服务器的认证信息
35             transport.connect("smtp.sina.com", "soft03_test", "soft03_test");
36 
37             // 设置收件人地址,并发送邮件
38             transport.sendMessage(message, new InternetAddress[] { new InternetAddress(emailAddress) });
39         } catch (Exception e) {
40             e.printStackTrace();
41             throw new RuntimeException(e);
42         } finally {         
43             try {
44                 transport.close();
45             } catch (MessagingException e) {
46                 e.printStackTrace();
47                 throw new RuntimeException(e);
48             }
49         }
50     }

3. 完善payAction

  完成了工具类的封装,接下来我们把该工具类放到BaseAction中,通过@Resource注解注入进来,供Action使用,下面我们完善前面的payAction中的backBank()方法,如下:

 

 1 @Controller("payAction")
 2 @Scope("prototype")
 3 public class PayAction extends BaseAction<Object> implements ParameterAware {
 4 
 5     //省略不相关的代码……
 6 
 7     public void backBank() {
 8         BackData backData = (BackData)model;
 9         System.out.println(model);
10         boolean isOK = payService.checkBackData(backData);
11         if(isOK) {
12             //1. 更新订单状态,参数是自己根据数据库中的情况传进去的,用来测试
13             forderService.updateStatusById(Integer.valueOf(201605006), 2);
14             //2. 根据user邮箱地址,发送邮件
15             String emailAddress = backData.getR8_MP().split(",")[0];
16             emailUtil.sendEmail(emailAddress, backData.getR6_Order());
17             //3. 发送手机短信,下一篇博客来介绍发送短信的功能
18             System.out.println("----success!!----");
19         } else {
20             System.out.println("----false!!!----");
21         }
22     }
23 }

 

  从易宝那边返回的信息中r6_Order参数中保存的是订单的编号,r8_MP参数中是用户的邮箱和电话,第一个是邮箱第二个是电话,用逗号隔开了,所以我们首先要获取用户的邮箱地址,然后再来发送邮件。好了,支付完成后给用户发送邮件的功能就完成了。

 

 

 


转载于:https://www.cnblogs.com/sharpest/p/9926555.html

相关文章:

  • extjs 之columntree 自定义分页工具条
  • javascript基础修炼(9)——MVVM中双向数据绑定的基本原理
  • python lambda的详细介绍
  • 字典变成有序字典
  • Vbs脚本编程简明教程之六
  • iptables的snat与dnat
  • 传Windows 7 正式版明年6月发布
  • 软件名称集合
  • 在Hyper-V下安装Centos Linux系统的网卡驱动问题
  • 数据库连接池问题 Max Pool Size
  • 0228_2012深圳试题_网络配置部分
  • WPFのclipToBounds与maskToBounds的区别
  • 大家多开发点uwp吧
  • 虚拟机网络设置
  • 如何让apache支持3gp下载
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • __proto__ 和 prototype的关系
  • 5、React组件事件详解
  • ES6--对象的扩展
  • go append函数以及写入
  • go语言学习初探(一)
  • Hexo+码云+git快速搭建免费的静态Blog
  • Javascript 原型链
  • react-native 安卓真机环境搭建
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • vue-router 实现分析
  • 构造函数(constructor)与原型链(prototype)关系
  • 开源地图数据可视化库——mapnik
  • 力扣(LeetCode)22
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 手写一个CommonJS打包工具(一)
  • 微信小程序--------语音识别(前端自己也能玩)
  • 项目管理碎碎念系列之一:干系人管理
  • 学习使用ExpressJS 4.0中的新Router
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • !!java web学习笔记(一到五)
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • (HAL库版)freeRTOS移植STMF103
  • (poj1.3.2)1791(构造法模拟)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (二)springcloud实战之config配置中心
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (强烈推荐)移动端音视频从零到上手(上)
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)EOS中账户、钱包和密钥的关系
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net framework4与其client profile版本的区别