JavaWEB小知识学习--Java Mail

本文主要使用java mail和spring mail两种方式来发送邮件教程,比较啰嗦,因为除了发邮件还写了其他工具类,不过很详细.

1.使用java mail发送邮件

首先把相关账号密码信息保存到一个properties中,读取注入到MailUtil工具类中,然后控制器中调用MailUtil里面的发送邮件方法,因为发邮件是一个耗时过程,所以放在一个线程里面运行.

1.1.读取配置文件

建立一个config.properties文件,写入如下配置(现在大多数邮箱都开启smtp都给你一个授权码,使用授权码验证,并且端口可能是465,比如qq的,这个要自己查看邮箱设置)

#mail配置
mail.host = smtp.163.com
mail.protocol = smtp
mail.port = 25
mail.user = 邮箱账号
mail.pwd = 授权码

写一个PropertiesUtil.java工具类读取这些配置

package cn.edu.aust.util;

import java.io.*;
import java.util.Properties;

/**
 * 读取properties文件的工具类
 */
public class PropertiesUtil {

    private static Properties properties;
    private static String url;
    static {
        url = System.getProperty("web.root") + "WEB-INF"+File.separator+"classes"+File.separator+"config.properties";
        properties = new Properties();
        try {
           InputStream in = new BufferedInputStream(new FileInputStream(url));
            properties.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 读取属性
     * @param key
     * @return
     */
    public static String getProperty(String key){
       return properties.getProperty(key);
    }

    /**
     * 设置属性
     * @param key
     * @param value
     */
    public static void setProperty(String key,String value) throws IOException {
        OutputStream out = new FileOutputStream(url);
        properties.setProperty(key,value);
        properties.store(out,"『comments』Update key:" + key);
    }
}

1.2MailUtil.java工具类

首先maven加入mail支持:

    <!-- mail支持 -->
    <dependency>
      <groupId>javax.mail</groupId>
      <artifactId>mail</artifactId>
      <version>1.4.7</version>
    </dependency>

发送邮件总体步骤:

  • 构造session
  • – 构造一个保存用户名密码的Authenticator类
  • – 读取配置,放入一个Properties实例中
  • 构造邮件
  • 发送邮件

    这里只写了发送普通文本文件

/**
 * 发送邮件的工具类
 */
public class MailUtil {

    private static String HOST;
    private static String PROTOCOL;
    private static String PORT;
    private static String USER;//发件人账号
    private static String PWD;//发件人密码

    static{
        HOST = PropertiesUtil.getProperty("mail.host");
        PROTOCOL = PropertiesUtil.getProperty("mail.protocol");
        PORT = PropertiesUtil.getProperty("mail.port");
        USER = PropertiesUtil.getProperty("mail.user");
        PWD = PropertiesUtil.getProperty("mail.pwd");
    }

    /**
     * 1.获取session
     * @return
     */
    public static Session getSession(){
        //1.1构造一个保存用户名密码的Authenticator类
        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USER,PWD);
            }
        };
        Properties props = new Properties();
        props.put("mail.smtp.host",HOST);
        props.put("mail.store.protocol",PROTOCOL);
        props.put("mail.smtp.port",PORT);
        props.put("mail.smtp.auth",true);
        return Session.getDefaultInstance(props,authenticator);
    }

    /**
     * 2.发送不带附件的邮件
     * @param toEmail
     * @param content
     */
    public static void send(String toEmail,String content) throws MessagingException {
        Session session = getSession();
        logger.debug("准备发送邮件给"+toEmail);
        //2.1构造message
        Message msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(USER));
        msg.setRecipient(Message.RecipientType.TO,new InternetAddress(toEmail));
        msg.setSubject("账号激活邮件");
        msg.setSentDate(new Date());
        msg.setContent(content,"text/html;charset=utf-8");
        //2.2发送邮件,因为发送比较慢,放入一个线程中
        Thread t = new Thread(()->{
            try {
                Transport.send(msg);
                logger.info("成功发送邮件"+toEmail);
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        });
        t.start();

    }

    private static Logger logger = Logger.getLogger(MailUtil.class);
}

这样一个发送简单文本的邮件方法就完成了.


2.Spring Mail

首先在spring配置文件中加入关于邮件服务器的配置

<!-- 加载邮件配置文件 -->
    <context:property-placeholder location="classpath:config.properties"/>
<!--邮件服务开始-->
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="${mail.host}" />
        <property name="port" value="${mail.port}"/>
        <property name="username" value="${mail.user}" />
        <property name="password" value="${mail.pwd}" />
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="javaMailProperties">
            <props>
                <prop key="mail.smtp.auth">true</prop>
                <prop key="mail.smtp.timeout">25000</prop>
            </props>
        </property>
    </bean>
    <!--用于异步执行发送邮件的线程池-->
    <bean id="mailTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="corePoolSize" value="10"/>
        <property name="maxPoolSize" value="30"/>
    </bean>
    <!--邮件服务结束-->

具体发送就很简单了,总体步骤和之前的差不多

@Controller
public class TestController {

    @Resource(name = "mailSender")
    private JavaMailSenderImpl sender;
    @Resource(name = "mailTaskExecutor")
    private TaskExecutor taskExecutor;
    /**
     * 发送普通文本操作
     * @return
     */
    @RequestMapping(value = "/test",method = RequestMethod.GET)
    public String toTest() throws MessagingException {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(sender.getUsername());
        message.setTo("[email protected]");
        message.setSubject("激活邮件");
        message.setText("hello world");
        taskExecutor.execute(()->{
            sender.send(message);
        });
        return "test";
    }
}

如果想要发送带有附件的,可以使用MimeMessage来进行包装

public static void send(String to,String subject,String text,
     String fileName,File file) throws MessagigException{
    //使用JavaMail的MimeMessage,支付更加复杂的邮件格式和内容
    MimeMessage msg = sender.createMimeMessage();

    //创建MimeMessageHelper对象,处理MimeMessage的辅助类
    MimeMessageHelper helper = new MimeMessageHelper(msg, true);
        //使用辅助类MimeMessage设定参数
    helper.setFrom(sender.getUsername());
    helper.setTo(to);
    helper.setSubject(subject);
    helper.setText(text,true);

    //加入附件
    if(file!=null)helper.addAttachment(fileName, file);

    //发送邮件
    sender.send(msg);
}

3.验证激活

网上找了一下,感觉下面的思路是最好的

//1.数据库加三个字段,state:(0:未激活,1:激活成功),ActiCode:(放激活码),token_exptime(过期时间,用来验证激活邮件是否过期)

//2.用户填写资料,点击注册,插入数据成功,state字段默认是0,同时生成一个ActiCode(用传过来的邮箱、密码、和当前时间加密形成)也存入数据库

//3.发送邮件。。。提示用户登录邮箱激活。。。邮件中带一个激活成功页的URL,URL里有两个参数(1,用户ID,2:激活码)

//4.用户登录邮箱点击链接,来到处理激活的业务逻辑页面或Servlet,得到URL中两个参数,以这两个参数为条件查询数据库里的数据,如果有,取当前时间和之前存入数据库的过期时间作比较,看是否过期,过期,删除数据库中该条记录,并转到失败页面,没过期,查看链接传过来的激活码与数据库字段激活码是否一致,不一致,同样删除数据库中该条记录,并跳转到激活失败界面,一致,则将字段state为1,激活成功,转到激活成功页。。。

4.忘记密码功能

来源于:http://www.jianshu.com/p/bc61e9192658

第一步:显示忘记密码页面

一个简单的表单页面,输入用户名和一个60秒刷新一次的验证码。

需要验证用户名是否存在,邮箱是否已填写。

60秒刷新的验证码防止恶意重置密码。

60秒刷新的验证码实现方式有很多,可以把时间信息存在session或cookie或Ehcache中。

第二步:发送邮件,缓存重置密码令牌。

生成一个5分钟内有效的令牌,将令牌和用户id映射保存在Ehcache中。

用令牌值组成重置邮件链接。

从数据库取出邮件地址并发送邮件。

第三步:重置密码

用户点击链接进入重置密码界面。

验证令牌值,并得到用户Id,定位到具体用户。

用户修改密码。

时间: 2024-10-28 13:11:40

JavaWEB小知识学习--Java Mail的相关文章

JavaWEB小知识学习--原生AJAX

AJAX的作用局部刷新,作为提升页面体验还是很重要的,不过大家都说对SEO不是很友好,一直使用jQuery封装的AJAX,没有了解过原生的是什么样子的,特此学习下,补充知识 1.原生AJAX的Get方式 页面中定义一个a标签.想要实现的效果点击a标签,能够请求服务器,弹出服务器返回的字段 <body> <a href="/ajaxTest">点击我!</a> </body> 对应的AJAX请求如下,注释步骤很详细的 //具体的函数可以参考

[Java面试三]JavaWeb基础知识总结.

1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静态web资源(如html 页面):指web页面中供人们浏览的数据始终是不变. • 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同. l 静态web资源开发技术 • Html l 常用动态web资源开发技术: • JSP/Servlet.ASP

java基础知识《JAVA 核心技术》学习笔记(一)

一:数据类型 (1)java整形: 类型                         存储要求 int                              4字节 short                          2字节 long                           8字节 byte                           1字节 (2)浮点类型 类型                         储存要求 float            

退休老码农提醒你!学习Java,这些知识要牢记,能让你少走弯路!

现在的java在编程界基础已经根深蒂固了,随之带来的影响就是有大量的岗位,大量的工作方向,虽然现在很多的新兴语言势头都非常的猛烈,但是这并不影响java依然体量最大的编程语言,而且丝毫也看不出这门语言有任何衰减的趋势,依然有大量的从业人员在java开源领域贡献着大量的代码,在新兴的领域java切入进来也是毫不费力.创一个小群,供大家学习交流聊天如果有对学java方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望大家对学java能够持之以恒java爱好群,如果你想要

Java基础小知识(一)

 序言:“不积跬步,无以至千里.不积小流,无以成江海.”每一个庞大的知识架构都是由无数个小知识点慢慢积累起来的,没有量变的积累,就没有质变上的飞跃,成功往往离不开积累. 今天就和大家分享一些我在学习JAVA过程中总结的一些小知识吧! ①JAVA语言规定标识符的命名规则: 标识符应以“字母”.“下划线”.“美元符号$” 开头,不能以“数字”开头: 标识符可以由“字母(A-Z,a-z)”.“下划线”.“美元符号$” 或“数字(0-9)”组成: Java标识符需要注意区分大小写,长度无限制:(类名首字

java 小知识

1.JDK就是Java Development Kit.是 Java 语言的软件开发工具包(SDK),简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境.基本上每个学java的 人都会先在机器上装一个JDK,那他都包含哪几部分呢?让我们看一下JDK的安装目录.在目录下面有六个文件夹.一个src类库源码压缩包.和其他几个声明文件.其中,真正在运 行java时起作用的是以下四个文件夹:bin.include.lib. jre.现在我们可以看出这样一个关系,JDK包含JRE

小码蚁java学习日记——起航篇

很久很久以前,大约公元2005年就知道知晓java. 一直都有过了解,但从未系统学习. 今天,就在今天,这是一个伟大的日子,伟大的12月18号,我终于坚定了利用工作之余学习java的决心,一个phper 就要变身了. 首先选个方向吧,其实这个好真麻烦,近水楼台先得月,还是写web吧. 好吧,今天就这么多! 以后还希望大家多多指点小的,助我在java的道路上越走越远.

【java基础知识总结】-特别针对零基础学习JAVA的初学者

JAVA基础知识总结,对于大多数想要学习JAVA编程语言的人员来说或者对于那些已经在学习路上的新手来说,掌握以下的JAVA基础知识,或许将更有利于你快速掌握好这门语言.以下是本人对JAVA基础知识做了一下小结,如有纰漏,还望大家不吝赐教. 1.对象的初始化 (1)非静态对象的初始化 在创建对象时,对象所在类的所有数据成员会首先进行初始化. 基本类型:int型,初始化为0. 如果为对象:这些对象会按顺序初始化. ※在所有类成员初始化完成之后,才调用本类的构造方法创建对象. 构造方法的作用就是初始化

学习Java语言的小技巧

最初接触到的计算机编程语言是C语言,再有了c语言的基础上,Java入门也变得简单多了.Java其实是一个地名,盛产咖啡,所以图标像咖啡一样,然而慢慢接触,你才能体会到Java的甘甜. Java的运行时在虚拟机上面的,也就是说Java相比于c语言直接接触硬件的操作安全的多,Java用虚拟内存访问数据,我编译Java用的是Eclipse这个软件,这个软件是完全免费的,初学者可以到官网去下载.当你安装好Eclipse的时候,是不能使用的,因为缺少运行环境,你还需要下载一个JDK,也就是给Java运行的