帮你搞明白程序自动发邮件激活账号到底是怎么一回事

  1. 背景

    相信你一定有过使用邮件激活账号,或者通过邮件更改密码等如下图这样类似的经历了吧
    wd
    接下来我们通过注册账号时发送激活邮件这样的真实案例去搞明白这些程序的背后奥秘

  2. 预处理
    相信你有一定的网络技术的功底,那么你一定知道发送接收邮件也是需要协议去约束。POP3/IMAP是接收邮件的协议,SMTP是发送邮件协议。 打一个比方,有一天你给某期刊投稿。你使用qq邮箱给人发邮件,邮件把提交到qq邮箱的POP3服务器中,然后POP3服务器把你的邮件发送给网易POP3服务器中。很多人以为通过qq邮箱的POP3服务器应该发送给网易的SMTP服务器中,但是我们知道协议必须得一致,你可以理解像接口一样。然后网易POP3服务器把你的邮件提到SMTP服务器中,再由SMTP服务器发送到你个人邮箱中。以上是发送与接收邮件的简单流程
    我这里使用qq邮箱,在程序之前还需要把qq邮箱的POP3/IMAP服务打开,如下图。开启后,会给一个密钥,记好这个密钥,我们后面需要使用。
    在这里插入图片描述

  3. 总体设计
    当我们在注册一个账号,如下图,需要填写一些个人信息。点击注册,我们后台拿到这些数据,就在数据库增加一个user用户,在user用户我们需要设置一个Code状态码这样的字段。因为我们现在只是注册了账号,但是并没有激活账号,后续的功能必须得激活后使用。
    在这里插入图片描述
    数据库设计如下
    在这里插入图片描述
    注册完账号后,我们拿到注册时的邮箱,给该邮箱发送一个邮件,该邮件可以内置一个链接或者激活码,大同小异。点击链接,即可激活账号若是激活码则回填激活码,激活账号。
    在这里插入图片描述
    注意,我发现这个qq邮件不能内置超链接,可能处于保护吧。所以我这里是把链接直接写出来了
    点击了链接,其实是向服务器发送了一个请求,而该请求是将Code状态码改变,达到激活的目的
    在这里插入图片描述
    我们可以发现状态码由0转为1,即为账号激活

  4. 源码分析

发送邮件的工具,需要使用mail包
两个参数email是qq邮箱,emailMsg是邮件内容

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;

public class MailUtils {

	public static void sendMail(String email, String emailMsg)
			throws AddressException, MessagingException {
		// 1.创建一个程序与邮件服务器会话对象 Session

		Properties props = new Properties();
		props.setProperty("mail.transport.protocol", "SMTP");
		props.setProperty("mail.host", "smtp.qq.com");
		props.setProperty("mail.smtp.auth", "true");// 指定验证为true

		// 创建验证器
		Authenticator auth = new Authenticator() {
			public PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication("账号", "密钥");
			}
		};

		Session session = Session.getInstance(props, auth);

		// 2.创建一个Message,它相当于是邮件内容
		Message message = new MimeMessage(session);

		message.setFrom(new InternetAddress("xxxxxxxxxxxx@qq.com")); // 设置发送者

		message.setRecipient(RecipientType.TO, new InternetAddress(email)); // 设置发送方式与接收者

		message.setSubject("用户激活");
		// message.setText("这是一封激活邮件,请<a href='#'>点击</a>");

		message.setContent(emailMsg, "text/html;charset=utf-8");

		// 3.创建 Transport用于将邮件发送

		Transport.send(message);
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值