《JavaWeb从入门到改行》注册时向指定邮箱发送邮件激活

javaMail API

 javaMail是SUN公司提供的针对邮件的API 。 两个jar包  mail.jar 和 activation.jar

java mail中主要类:javax.mail.Session、javax.mail.internet.MimeMessage、javax.mail.Transport。

   Session           表示会话,即客户端与邮件服务器之间的会话!想获得会话需要给出账户和密码,当然还要给出服务器名称。在邮件服务中的Session对象,就相当于连接数据库时的Connection对象。
MimeMessage表示邮件类,它是Message的子类。它包含邮件的主题(标题)、内容,收件人地址、发件人地址,还可以设置抄送和暗送,甚至还可以设置附件。
Transport用来发送邮件。它是发送器!

 

 

 

第一步:获得Session

第二步:创建MimeMessage对象

第三步:发送邮件

javaMail 代码分析

 代码在web项目中没有任何问题,但是在java中用@Test做测试时会报错,

到下面路径中找到javaee.jar文件,把javax.mail删除!!!

D:\Program Files\MyEclipse\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\data\libraryset\EE_5   

需要注意:  如果出现如下报错信息:

javax.mail.AuthenticationFailedException: failed to connect

 基本上密码有问题,这个密码并不是邮箱帐号的私人密码,而是授权密码。 关于邮箱授权密码请自行百度。

/*** 文本邮件* @throws MessagingException* @throws javax.mail.MessagingException*/@Testpublic void fun() throws MessagingException, javax.mail.MessagingException{/** 1. 得到Session*     导包: java.util.properties;import javax.mail.Authenticator;import javax.mail.Session;*/Properties props = new Properties();props.setProperty("mail.host", "smtp.163.com");//设置服务器主机名props.setProperty("mail.smtp.auth", "true"); //设置需要认证//Authenticator是一个接口表示认证器,即校验客户端的身份。我们需要自己来实现这个接口,实现这个接口需要使用账户和密码。Authenticator auth = new Authenticator(){        protected PasswordAuthentication getPasswordAuthentication() {                return new PasswordAuthentication("zhaoyuqiang2017","z123456"); //用户名和密码
            }};Session session = Session.getInstance(props,auth);/** 2. 创建MimeMessage*     import javax.mail.internet.MimeMessage;*     RecipientType.TO正常*     RecipientType.CC抄送*     RecipientType.BCC暗送*/MimeMessage msg = new MimeMessage(session);msg.setFrom(new InternetAddress("zhaoyuqiang2017@163.com"));//设置发件人msg.setRecipients(RecipientType.TO, "425680992@qq.com");//设置收件人msg.setSubject("这是标题");//邮件标题msg.setContent("我爱你!","text/html;charset=utf-8");//设置邮件内容/** 3.发邮件*/Transport.send(msg);}

 

/*** 附件邮件* @throws AddressException* @throws MessagingException* @throws IOException */@Testpublic void fun1() throws AddressException, MessagingException, IOException{Properties props = new Properties();props.setProperty("mail.host", "smtp.163.com");props.setProperty("mail.smtp.auth", "true");Authenticator auth = new Authenticator(){@Overrideprotected PasswordAuthentication getPasswordAuthentication() {// TODO Auto-generated method stubreturn new PasswordAuthentication("zhaoyuqiang2017","z123456");}};Session session = Session.getInstance(props,auth);MimeMessage msg = new MimeMessage(session);msg.setFrom(new InternetAddress("zhaoyuqiang2017@163.com"));//设置发件人msg.setRecipients(RecipientType.TO, "425680992@qq.com");//设置收件人msg.setSubject("这是标题-有附件");//邮件标题/*** 有附件的内容*    邮件体为多部件形式*    *//** 1. 创建一个多部件的部件 MimeMultipart*   MimeMultipart就是一个集合,装载多个主体部件* 2. 创建两个主体部件MimeBodyPart,一个是文本part1*     3. 设置主体部件的内容*     4. 把主体部件加到list集合中* 5. 创建两个主体部件MimeBodyPart,一个是附件part2*     6. 设置附件的内容*     7. 设置显示的文件名称*     8. 把主体部件加到list集合中* 3. 把MimeMultipart设置给MimeMessage的内容         */MimeMultipart list = new MimeMultipart();MimeBodyPart part1 = new MimeBodyPart();part1.setContent("我爱你,","text/html;charset=utf-8");list.addBodyPart(part1);MimeBodyPart part2 = new MimeBodyPart();part2.attachFile(new File("D:/吉泽明步.jpg"));part2.setFileName(MimeUtility.encodeText("大美女.jpg"));//encodeText解决乱码
        list.addBodyPart(part2);msg.setContent(list);Transport.send(msg);}

为了简化代码,在实际操作中往往需要把重复代码进行封装,需要导入itcast-tools.jar(下载:https://files.cnblogs.com/files/zyuqiang/itcast-tool.rar )  ,在本文附加的项目中,会把邮件相关的参数信息都放在配置文件中。 

/*** 文本邮件* 用小工具来简化邮件* @throws MessagingException* @throws IOException*/@Testpublic void fun() throws MessagingException, IOException{/** 1. 得到Session*/Session session = MailUtils.createSession("smtp.163.com","zhaoyuqiang2017","z123456");/** 2. 创建邮件对象*/Mail mail = new Mail("zhaoyuqiang2017@163.com","425680992@qq.com","这个是标题-工具", "用工具爱你");/*** 添加附件*    2个附件*/AttachBean ab1 = new AttachBean(new File("D:/吉泽明步.jpg"), "美女.jpg");AttachBean ab2 = new AttachBean(new File("D:/吉泽明步.jpg"), "小美女.jpg");mail.addAttach(ab1);mail.addAttach(ab2);/** 3. 发送*/MailUtils.send(session, mail);        }   

 

 

项目案例_用户注册时发送邮件到指定邮箱,并且激活。

 说明:  用户注册,填入指定邮箱,系统会自动发送到指定邮箱一个超链接,让用户去指定邮箱点击一个超链接激活,激活后才可以正常登陆。

            本项目把邮件相关的参数信息都放在配置文件中。 

1 CREATE TABLE tb_user(
2   uid CHAR(32) PRIMARY KEY,/*主键*/
3   email VARCHAR(50) NOT NULL,/*邮箱*/
4   `code` CHAR(64) NOT NULL,/*激活码*/
5   state BOOLEAN/*用户状态,有两种是否激活*/
6 );
数据库

 只给出核心源码,全部项目(包括c3p0文件、邮件文件等)请下载该项目查看, 项目的运行,注意需要修改c3p0配置文件中数据库名称

  1 package cn.kmust.mail.web.servlet;
  2 
  3 
  4 import java.io.IOException;
  5 import java.text.MessageFormat;
  6 import java.util.Properties;
  7 
  8 
  9 import javax.mail.MessagingException;
 10 import javax.mail.Session;
 11 import javax.servlet.ServletException;
 12 import javax.servlet.http.HttpServletRequest;
 13 import javax.servlet.http.HttpServletResponse;
 14 
 15 import cn.itcast.commons.CommonUtils;
 16 import cn.itcast.mail.Mail;
 17 import cn.itcast.mail.MailUtils;
 18 import cn.itcast.servlet.BaseServlet;
 19 import cn.kmust.mail.domin.User;
 20 import cn.kmust.mail.exception.UserException;
 21 import cn.kmust.mail.service.UserService;
 22 
 23 public class UserServlet extends BaseServlet {
 24     private UserService userService = new UserService();
 25     /**
 26      * 注册
 27      *    邮件发送到指定邮箱
 28      * @param request
 29      * @param response
 30      * @return
 31      * @throws ServletException
 32      * @throws IOException
 33      */
 34     public  String regist(HttpServletRequest request, HttpServletResponse response)
 35             throws ServletException, IOException {
 36         
 37         User form = CommonUtils.toBean(request.getParameterMap(), User.class);
 38         /*
 39          * 补齐code
 40          */
 41         form.setCode(CommonUtils.uuid()+CommonUtils.uuid());
 42         /*
 43          * 调用service的注册功能
 44          */
 45             userService.regist(form);
 46         /*
 47          * 发送邮件,(包含"缺少收不到重发"功能)
 48          *    准备配置文件email_template.properties
 49          *    发送的邮件方信息放在配置文件中
 50          *       发送内容为一个超链接,超链接到该类的active方法
 51          *          <a href ="http://localhost:8080/项目名字/UserServlet?method=active&code={0}">点击这里完成激活    </a>
 52          *    获取配置文件的内容
 53          *    加载配置文件到props中
 54          *    获取主机、发送用户、授权密码、发送邮件、发件人、发件主题、发送内容
 55          *    得到Session
 56          *    创建邮件对象
 57          *    发邮件            
 58          */
 59             Properties props = new Properties();
 60             props.load(this.getClass().getClassLoader().
 61                     getResourceAsStream("email_template.properties"));
 62             String host = props.getProperty("host");
 63             String uname = props.getProperty("uname");
 64             String pwd = props.getProperty("pwd");
 65             String from = props.getProperty("from");
 66             String to = form.getEmail();
 67             String subject = props.getProperty("subject");
 68             String content = props.getProperty("content");
 69             content = MessageFormat.format(content, form.getCode());//替换{0}占位符
 70             
 71             Session session = MailUtils.createSession(host, uname, pwd);
 72             Mail mail = new Mail(from,to,subject,content);
 73             try {
 74                 MailUtils.send(session, mail);
 75             } catch (MessagingException e) {                        
 76             }
 77         /*
 78          * 保存成功信息到msg.jsp
 79          */
 80         request.setAttribute("msg", "恭喜您,注册成功!请马上到邮箱激活!");
 81         return "f:/msg.jsp";
 82     }
 83     /**
 84      * 激活功能
 85      * @功能 当用户点击邮件中的完成激活连接时,访问这个方法
 86      *      调用service的激活方法修改用户状态
 87      * @param request
 88      * @param response
 89      * @return
 90      * @throws ServletException
 91      * @throws IOException
 92      * @throws  
 93      */
 94     public String active(HttpServletRequest request, HttpServletResponse response)
 95             throws ServletException, IOException  {
 96         /*
 97          * 1. 获取参数激活码
 98          * 2. 调用service方法完成激活
 99          *      如果出现异常,保存异常信息到request域中,转发到msg.jsp
100          * 3. 成功,保存成功信息到request域,转发msg.jsp
101          */
102         String code = request.getParameter("code");
103         try {
104             userService.active(code);
105             request.setAttribute("msg", "恭喜,您激活成功!请登陆");
106         } catch (UserException e) {
107             request.setAttribute("msg", e.getMessage());            
108         }
109         return "f:/msg.jsp" ;                
110     }
111 
112 }
UserServlet
 1 package cn.kmust.mail.service;
 2 
 3 import cn.kmust.mail.dao.UserDao;
 4 import cn.kmust.mail.domin.User;
 5 import cn.kmust.mail.exception.UserException;
 6 
 7 public class UserService {
 8     private UserDao userDao = new UserDao();
 9     /**
10      *  激活功能
11      * @param code
12      * @throws UserException 
13      */
14    public void active(String code) throws UserException {
15        /*
16         * 1. 按激活码查询用户
17         * 2. user不存在,激活码错误
18         * 3. 校验用户状态,如果已激活,说明二次激活,抛出异常
19         * 4. 第一次激活,则修改用户状态为true,表明已经激活
20         */
21        User user = userDao.findByCode(code);
22        System.out.println("激活状态测试:"+user.isState());
23        if(user == null )
24            throw new UserException("激活码无效!");
25        if(user.isState())           
26            throw new UserException("您已经激活过了!");
27        userDao.updataState(user.getUid(),true);
28            
29    }
30    /**
31     * 注册功能
32     * @param form
33     */
34     public void regist(User form) {
35         userDao.add(form);        
36     }
37 }
UserService
 1 package cn.kmust.mail.dao;
 2 
 3 import java.sql.SQLException;
 4 import org.apache.commons.dbutils.QueryRunner;
 5 import org.apache.commons.dbutils.handlers.BeanHandler;
 6 
 7 import cn.itcast.jdbc.TxQueryRunner;
 8 import cn.kmust.mail.domin.User;
 9 
10 public class UserDao {
11     private QueryRunner qr = new TxQueryRunner();
12     /**
13      * 通过激活码查询用户
14      * @param code
15      * @return
16      */
17     public User findByCode(String code) {
18         try{
19             String sql = "select * from tb_user where code=?" ;
20             return qr.query(sql, new BeanHandler<User>(User.class),code);
21         }catch(SQLException e){
22             throw new RuntimeException(e);
23         }
24     }
25     /**
26      *  添加用户
27      * @param form
28      */
29     public void add(User user) {
30         try{
31             String sql = "insert into tb_user value(?,?,?,?)";
32             Object[] params ={user.getUid(),user.getEmail(),user.getCode(),user.isState()};
33             qr.update(sql,params);
34         }catch(SQLException e){
35             throw new RuntimeException(e);
36         }
37         
38     }
39     /**
40      * 成功激活后修改状态为已激活
41      * @param uid
42      * @param b
43      */
44     public void updataState(String uid, boolean state) {
45         try{
46             String sql = "update tb_user set state=? where uid=?";
47             qr.update(sql,state,uid);
48         }catch(SQLException e){
49             throw new RuntimeException(e);
50         }
51         
52     }
53 
54 }
UserDao

 

项目下载: https://files.cnblogs.com/files/zyuqiang/webMail.rar

 

转载于:https://www.cnblogs.com/zyuqiang/p/7475363.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP之报文

HTTP 报文 用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端&#xff08;客户端&#xff09;的 HTTP 报文叫做请求报文&#xff0c;响应端&#xff08;服务器端&#xff09;的叫做响应报文。HTTP 报文本身是由多行&#xff08;用 CRLF 作换行符&#xff09;数据构成的字符串文…

python 内置函数

一 print( ) flush的应用——模拟进度条 import time for i in range(1,101):time.sleep(0.1)print(\r{}%:{}.format(i,**i),end,flushTrue) #\r &#xff08;return&#xff09; 表示回车 \n &#xff08;new line&#xff09;表示换行&#xff0c;实际上是回车换…

Discuz!论坛实现帖子回复可见内容功能

自从Discuz&#xff01;升级到3.0以上的时候很多功能都被改版了&#xff0c;已不是2年前的设计&#xff0c;如果不是Discuz&#xff01;老用户还真不知道怎么玩它了。 博主以前经常逛论坛&#xff0c;但从来没有自己去做过一个论坛&#xff0c;相关的开源程序代码也不是怎么精通…

dropify,不错的图片上传预览插件

引言 传统的图片上传&#xff0c;很丑。点击选择之后&#xff0c;还无法预览。 有一种方案是传到服务器&#xff0c;然后返回地址&#xff0c;然后显示&#xff0c;比较麻烦。 用这个dropify&#xff0c;就可以解决之歌问题。 看效果 用法 1.引入文件,需要jquery支持。 <lin…

【知了堂学习笔记】MySQL数据库常用的SQL语句整理

一&#xff0c;常用、简单的SQL操作语句 1.数据库操作&#xff1a; 1&#xff09;创建数据库&#xff1a; create database database_name&#xff1b; 创建并设置字符编码 create database database_name character set utf8&#xff1b; 2&#xff09;删除数据库&#xff1a…

tomcat原理解析(一):一个简单的实现

一 概述 前段时间去面试&#xff0c;被人问到了tomcat实现原理。由于平时没怎么关注容器的实现细节&#xff0c;这个问题基本没回答上来。所以最近花了很多时间一直在网上找资料和看tomcat的源码来研究里面处理一个HTTP请求的流程。网上讲tomcat的帖子比较多&#xff0c;大多都…

手风琴案例jquery写法

今天我用jquary来写一下手风琴案例&#xff0c;这个案例在平时的项目中很经常会见到&#xff0c;要想实现效果用jquary来写其实很简单&#xff0c;其实一句话就是jquary的方法的调用。 首先我们先来分析一下手风琴案例实际实现的效果&#xff0c;就是点击当前的标题&#xff0c…

元组tuple

另一种有序列表叫元组&#xff1a;tuple。tuple和list非常类似&#xff0c;但是tuple一旦初始化就不能修改&#xff0c;比如同样是列出同学的名字&#xff1a; >>> classmates (Michael, Bob, Tracy)现在&#xff0c;classmates这个tuple不能变了&#xff0c;它也没有…

win7下的nginx小demo

一直大概知道nginx怎么玩,但是不看文档又蒙蔽.在这记录一下,以后好查看 下载tomcat,改index.jsp http://tomcat.apache.org/download-80.cgi tomcat9已经出来了,但是自己用了一次,闪退,换tomcat8,开启成功.(tomcat9这个原因有时间在琢磨) 修改tomcat的index.jsp 然后在index.js…

understand的安装

1.win7 64位下安装 1&#xff09;下载Understand.4.0.908.x64.rar。 2&#xff09;解压之&#xff0c;直接运行里面的Understand-4.0.908-Windows-64bit.exe。 3&#xff09;选择如下 之后&#xff0c;点击“Add Eval or SDL (RegCode)”&#xff0c;如下图&#xff1a; 4&…

条件、循环、函数定义 练习

a.五角星 import turtleturtle.color(yellow)turtle.begin_fill()for i in range(5): turtle.forward(100) turtle.right(144)turtle.end_fill() b.同心圆 import turtlefor i in range(5): turtle.up() turtle.goto(0,-20*(i1)) turtle.down() turtle.circle(20*(i1)) c.太阳花…

2015年上半年 软件设计师 上午试卷 综合知识-2

2015年上半年 软件设计师 上午试卷 综合知识-2 与算术表达式"&#xff08;a&#xff08;b-c&#xff09;&#xff09;*d" 对应的树是&#xff08;21&#xff09;。 答案&#xff1a; B 本题考查程序语言与数据结构基础知识。 对算术表达式"(a(b-c))*d"求…

Python web开发——自定义userprofile(用户描述)

1、新建一个APP 2、查看数据库中系统给我们提供的默认的users的字段含义 ID&#xff1a; 是主键&#xff0c;用户的ID passWord&#xff1a;密码 last_login : 最后一次登录的时间 is_superuser&#xff1a;是否是超级用户&#xff08;VIP&#xff09; username&#xff1a;用户…

Android之View绘制流程开胃菜---setContentView(...)详细分析

版权声明&#xff1a;本文出自汪磊的博客&#xff0c;转载请务必注明出处。 1 为什么要分析setContentView方法 作为安卓开发者相信大部分都有意或者无意看过如下图示&#xff1a;PhoneWindow,DecorView这些究竟都是些神马玩意&#xff1f;图示的层级关系是怎么来的&#xff1f…

排序算法之堆排序

一、什么是堆 如果一个完全二叉树的每个节点&#xff0c;都不大于它的子节点&#xff0c;就可以称之为堆。所谓完全二叉树&#xff0c;就是除了叶子节点以外&#xff0c;所有的其他节点&#xff0c;都有完整的左字树和右子树&#xff0c;除了最后一层的非叶子节点以外。 二、堆…

Codeforces Round #434 (Div. 2)【A、B、C、D】

Codeforces Round #434 (Div. 2) codeforces 858A. k-rounding【水】 题意&#xff1a;已知n和k&#xff0c;求n的最小倍数x&#xff0c;要求x后缀至少有k个0。 题解&#xff1a;答案就是10^k和n的最小公倍数。 1 #include<cstdio>2 #include<cstring>3 #include&l…

PLC与触摸屏练习

电机正反转 触摸屏 要用触摸屏进行仿真是不要忘了先启动梯形图测试 效果 1-2例 行程开关控制的自动循环 梯形图 触摸屏 下面只是用了四个开关&#xff0c;可以根据自己想要实现的按照梯形图添加 题目 梯形图 电动机星三角减压启动控制 题目及要求 触摸屏截图 运算 把显示的数值…

Django里面是文件静态化的方法

看Django官网的时候&#xff0c;由于自己的英语基础较差&#xff0c;而实现的谷歌翻译比较烂&#xff0c;只能看懂个大概。在文件静态化的时候&#xff0c;讲的比较繁琐一点&#xff0c;没怎么看懂&#xff0c;遂询问了一下其他人&#xff0c;明白了许多&#xff0c;但是细节需…

RabbitMQ 声明Queue时的参数们的Power

RabbitMQ 声明Queue时的参数们的Power 参数们的Power 在声明队列的时候会有很多的参数 public static QueueDeclareOk QueueDeclare(this IModel model, string queue "", bool durable false, bool exclusive true, bool autoDelete true, IDictionary<strin…

解决Firefox已阻止运行早期版本Adobe Flash

解决Firefox已阻止运行早期版本Adobe Flash 类别 [随笔分类]web 解决Firefox已阻止运行早期版本Adobe Flash 最近火狐浏览器不知抽什么风&#xff0c;每次打开总提示"Firefox已阻止(null)运行早期版本的Adobe Flash"。要命的是它提示的解决办法根本不管用&#xf…