博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《JavaWeb从入门到改行》注册时向指定邮箱发送邮件激活
阅读量:5126 次
发布时间:2019-06-13

本文共 11899 字,大约阅读时间需要 39 分钟。

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     */    @Test    public 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      */    @Test    public 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(){            @Override            protected PasswordAuthentication getPasswordAuthentication() {                // TODO Auto-generated method stub                return 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(下载: )  ,在本文附加的项目中,会把邮件相关的参数信息都放在配置文件中。 

/**     * 文本邮件     * 用小工具来简化邮件     * @throws MessagingException     * @throws IOException     */    @Test    public 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          *          点击这里完成激活     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.jsp100          * 3. 成功,保存成功信息到request域,转发msg.jsp101          */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 code12      * @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 form33     */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 code15      * @return16      */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.class),code);21 }catch(SQLException e){22 throw new RuntimeException(e);23 }24 }25 /**26 * 添加用户27 * @param form28 */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 uid42 * @param b43 */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://www.cnblogs.com/zyuqiang/p/7475363.html

你可能感兴趣的文章
利用expect实现自动化操作
查看>>
Golang tcp转发 remoteAddr错误
查看>>
文字超出两行 则显示。。。
查看>>
xv6/调度算法及并发程序设计
查看>>
宏函数和函数的区别
查看>>
android adb shell常用命令(四)
查看>>
vs2008配置winddk
查看>>
LR通过SiteScope监控mysql
查看>>
Mybaties配置一对多关系sql实例
查看>>
【UOJ 51】最接近神的人
查看>>
hdu 2222 Keywords Search(ac自动机)
查看>>
lightoj 1037 - Agent 47(状压dp)
查看>>
源码篇:Python 实战案例----银行系统
查看>>
免费的大数据学习资料,这一份就足够
查看>>
clientWidth、clientHeight、offsetWidth、offsetHeight以及scrollWidth、scrollHeight
查看>>
MySQL(一)
查看>>
企业级应用与互联网应用的区别
查看>>
Vue父子组件间的通信
查看>>
PHPCMS 模板的设置
查看>>
linux-2.6.38 input子系统(用输入子系统实现按键操作)
查看>>