java邮箱激活

一、分析:

1:先从前端接收到一个邮箱帐号,由于鲁棒性的要求,在发送邮箱之前邮箱格式必须正确!!不然的话第一发送不了,第二会发生错误,出现异常。所以,先检验邮箱格式

2:然后配置发送端邮箱还有接收端邮箱,开通smtp/pop3接口服务,一般faileConnected异常通常就是因为这个才出现的。

3:在user表中设置一个激活码还有激活状态字段,之后会详细讲。

4:之后创建一个类专门负责发送邮件到接收端,那么其中的内容该怎么写呢?要发送什么内容,才能从接收端服务器访问到本地服务器,并且跳到Controller做处理呢?下面只是举个列子,只作为参考,

注意:最好用localhost,不要用ip地址,因为换个地方就会报异常,另外细心点的也可以看出我的Controller名字就叫做toActive

http://localhost:8080/sh/registuser/toActive?email="+user.getEmail()

5:这个Controller该怎么处理呢?经过邮件发送过来的超链接,有个参数叫user.getEmail(),作用是根据这个email来查询数据库,看有没有这个用户,如果存在,并且这个用户的激活状态为1,说明就已经激活过了,不用再次激活。如果激活状态为0,说明还未激活,修改激活状态为1。

二、代码以及效果

1:前端
1.1检验邮箱格式
1.1.1基本代码部分:
<div>
<span>邮箱地址<label>*</label></span>
<input type="text" id="email" name="email" οnblur="send()"/><span id="error"></span><br/> 
</div>
  
1.1.2ajax部分:
<script type="text/javascript">  
  f unction send() {
$.post("registuser/checkEmail",{"email":$("#email").val()},function(result){
if(result=="true") {  
               document.getElementById("error").innerHTML = "用户名已被注册或者格式不正确!";  
            } else {  
               document.getElementById("error").innerHTML = "用户名可以使用";  
           }
 });
}    
</script>
2:后端
2.1检验邮箱格式并且发送邮件
2.1.1:检验邮箱
public String regist(User u,@RequestParam("agpassword") String agpassword,HttpServletRequest request){
if(u.getPassword().equals(agpassword)&&u.getEmail()!=null){
String code=UUID.randomUUID().toString().replace("-","");
u.setAcode(code);
u.setActive(1);
String regix = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(\\.[a-zA-Z_0-9]{2,3})+";
//u.setAcode("qarguugnombhihci");
if(null==userService.listByEmail(u.getEmail())&&u.getEmail().matches(regix)){
userService.addUser(u);
MySendMailThread send = new MySendMailThread(u);
send.run();
HttpSession session = request.getSession();
session.setAttribute("rg",new Integer(2));
return "/registResult";
}else{
HttpSession session = request.getSession();
session.setAttribute("rg",new Integer(1));
return "/registResult";
}
}else{
HttpSession session = request.getSession();
session.setAttribute("rg",new Integer(3));
return "/registResult";
}
}

2.1.1:发送邮件的那个类,为了高效率,所以用了多线程技术
public class MySendMailThread extends Thread {
private User user = null;

public MySendMailThread(User user) {
this.user = user;
}

@Override
public void run() {

// 跟smtp服务器建立一个连接
Properties p = new Properties();
// 设置邮件服务器主机名
p.setProperty("mail.host", "smtp.qq.com");// 指定邮件服务器,默认端口 25
// 发送服务器需要身份验证
p.setProperty("mail.smtp.auth", "true");// 要采用指定用户名密码的方式去认证
// 发送邮件协议名称
p.setProperty("mail.transport.protocol", "smtp");

// 开启SSL加密,否则会失败
MailSSLSocketFactory sf = null;
try {
sf = new MailSSLSocketFactory();
} catch (GeneralSecurityException e1) {
e1.printStackTrace();
}
sf.setTrustAllHosts(true);
p.put("mail.smtp.ssl.enable", "true");
p.put("mail.smtp.ssl.socketFactory", sf);

// 开启debug调试,以便在控制台查看
// session.setDebug(true);也可以这样设置
// p.setProperty("mail.debug", "true");

// 创建session
Session session = Session.getDefaultInstance(p, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 用户名可以用QQ账号也可以用邮箱的别名
PasswordAuthentication pa = new PasswordAuthentication(
"发送端的邮箱名 ","授权码 ");
// 后面的字符是授权码,用qq密码不行!!
return pa;
}
});
try {
// 声明一个Message对象(代表一封邮件),从session中创建
MimeMessage msg = new MimeMessage(session);
// 邮件信息封装
// 1发件人
msg.setFrom(new InternetAddress("1249857183@qq.com"));
// 2收件人
msg.setRecipient(RecipientType.TO,new InternetAddress(user.getEmail()));
// 3邮件内容:主题、内容
msg.setSubject(user.getEmail() + ",欢迎注册购买雪橇账号,请点击链接激活账号");

// StringBuilder是线程不安全的,但是速度快,这里因为只会有这个线程来访问,所以可以用这个
StringBuilder sbd = new StringBuilder();
sbd.append(user.getEmail() + "<br/>欢迎!请确认此邮件地址以激活您的账号。<br/>");
sbd.append("<font color='red'><a href='http://localhost:8080/sh/registuser/toActive?email="
+user.getEmail()+ "'target='_blank'");
sbd.append(">立即激活</a></font><br/>");
sbd.append("或者点击下面链接:<br/>");
sbd.append("http://10.7.89.88:8080/sh/registuser/toActive?email="
+user.getEmail()+"'target='_blank'"+"<br/>");
sbd.append("这是一封自动发送的邮件;如果您并未要求但收到这封信件,您不需要进行任何操作。");
msg.setContent(sbd.toString(), "text/html;charset=utf-8");// 发html格式的文本
// 发送动作
Transport.send(msg);

System.out.println("给" + user.getEmail() + "发送邮件成功。");
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值