一、分析:
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>
<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>
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;}
@Overridepublic 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");
// 创建sessionSession session = Session.getDefaultInstance(p, new Authenticator() {@Overrideprotected 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();}}