1. 程式人生 > >javax.mail開發註冊郵箱驗證

javax.mail開發註冊郵箱驗證

一、匯入maven依賴

<dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
        </dependency>

二、建立郵件工具類

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.UnsupportedEncodingException;
import java.util.Properties;

public class EmailUtils {

    private static String host = "smtp.163.com";
    private static String username = "*****@163.com";
    private static String password = "*****";
    private static String protocol = "smtp";
    private static boolean debug = true;

    private EmailUtils(){}

    public static void sendEmail(String to, String code) throws MessagingException, UnsupportedEncodingException {
        //連線郵件伺服器的引數設定
        Properties properties = new Properties();
        //設定伺服器地址
        properties.setProperty("mail.smtp.host",host);
        //設定使用者認證方式
        properties.setProperty("mail.smtp.auth","true");
        //設定傳輸協議
        properties.setProperty("mail.transport.protocol", protocol);
        //建立連線物件,連線到郵箱伺服器
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });
        session.setDebug(debug);
        //建立郵件物件
        Message message = new MimeMessage(session);
        //設定發件人
        message.setFrom(new InternetAddress(username));
        //設定收件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress(to));
        message.setRecipient(Message.RecipientType.CC, new InternetAddress(username));
        //設定郵件主題
        message.setSubject("來自稀有無緣的啟用郵件");
        //設定圖片節點
        MimeBodyPart mimeBodyPart = new MimeBodyPart();
        mimeBodyPart.setContent("請注意您的資訊","text/html;charset=UTF-8");
        DataHandler dataHandler = new DataHandler(new FileDataSource("G:\\360downloads\\310684.jpg"));
        mimeBodyPart.setDataHandler(dataHandler);
        //設定圖片id以便在html中呼叫
        mimeBodyPart.setContentID("imgt");
        //設定文位元組點
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("<a href='http://webjob.free.ngrok.cc/user/jihuo?code=" + code + "'>點選此連結啟用您的賬號</a><img src='cid:imgt'>","text/html;charset=UTF-8");
        //設定附件
        MimeBodyPart fujian = new MimeBodyPart();
        DataHandler f = new DataHandler(new FileDataSource("G:\\360downloads\\303167.jpg"));
        fujian.setDataHandler(f);
        fujian.setFileName(MimeUtility.encodeText(f.getName()));
        MimeMultipart mimeMultipart = new MimeMultipart();
        //加入所有節點
        mimeMultipart.addBodyPart(mimeBodyPart);
        mimeMultipart.addBodyPart(text);
        mimeMultipart.addBodyPart(fujian);
        mimeMultipart.setSubType("mixed");
        message.setContent(mimeMultipart);
        //設定郵件正文
        //message.setContent("<p style='font-size: 34px'>請查收您的啟用碼資訊</p>","text/html;charset=UTF-8");
        Transport transport = session.getTransport("smtp");
        transport.connect();
        //傳送郵件
        transport.sendMessage(message,message.getAllRecipients());
        transport.close();
    }

三、建立使用者表

CREATE TABLE `user`(
	`id` INT(12) PRIMARY KEY,
	`username` VARCHAR(12),
	`password` VARCHAR(32),
	`email` VARCHAR(32),
	`code` VARCHAR(64)
);

四、建立使用者類

import java.io.Serializable;

public class User implements Serializable {

    public static final long serialVersionUID = 1L;

    private Integer id;
    private String username;
    private String password;
    private String email;
    private String code;

    public User(){}

    public User(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}

四、建立userDao

public interface UserDao {

    void insert(User user);

    User queryByCode(String code);

    void update(User user);

}

五、建立mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liuxing.dao.UserDao">
    <select id="queryByCode" resultType="com.liuxing.entity.User">
        select id, username,
        password, email, code
        from user
        where code = #{code}
    </select>

    <insert id="insert" useGeneratedKeys="true"
            keyColumn="id"  parameterType="com.liuxing.entity.User">
        insert into
        user(id,username,password,email,code)
        values
        (#{id},#{username},#{password},#{email},#{code})
    </insert>
    <update id="update" parameterType="com.liuxing.entity.User">
        update user
        <set>
            <if test="code!=null"> code=null</if>
        </set>
        where code=#{code}
    </update>

</mapper>

六、controller

@PostMapping(value = "/register")
    public @ResponseBody
    String register(User user) throws UnsupportedEncodingException, MessagingException {
        user.setId((int)System.currentTimeMillis());
        String code = UUID.randomUUID().toString().replace("-","");
        user.setCode(code);
        userDao.insert(user);
        EmailUtils.sendEmail(user.getEmail(), code);
        return "郵件傳送成功";
    }
    @GetMapping(value = "/jihuo")
    public String jihuo(String code){
        User user = userDao.queryByCode(code);
        if (user != null){
            userDao.update(user);
        }
        return "redirect:../th/index";
    }

七、前臺頁面

<form action="/user/register" method="post">
    <input type="text" name="username"/>
    <input type="password" name="password"/>
    <input type="email" name="email"/>
    <input type="submit" value="註冊"/>
</form>

使用者點選註冊進入到register方法中,生成隨機code,向資料庫庫新增使用者資訊。

使用者收到郵件後點擊郵件中的連結進入到jihuo方法中,根據傳過來的code的值在資料庫中查詢使用者資訊,如果查詢到則將資料庫中該使用者的code設定為null,即代表該使用者已經通過郵箱驗證。如果使用者在點選過程中code被篡改則認證失敗,上述例子只是簡單實現,實際開發中需要完善。