javax.mail開發註冊郵箱驗證
阿新 • • 發佈:2019-02-19
一、匯入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被篡改則認證失敗,上述例子只是簡單實現,實際開發中需要完善。