首先建立数据库,我的数据库为:
CREATE TABLE user ( uid varchar(11) primary key , -- 账号 type int default 1, -- 类型, 1注册会员, 2广告方, 3管理员 name varchar(50) , -- 昵称 email varchar(50), -- 邮箱 password varchar(50), -- 密码 active char(1) default '0', -- 激活状态 coin int default 1000 -- 金币 );
其次在utils中创建MySendMailThread.java文件,代码内容为:
package utils; import java.security.GeneralSecurityException; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message.RecipientType; 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 com.sun.mail.util.MailSSLSocketFactory; import javaBean.User; 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.com", "**********"); // new PasswordAuthentication中第一个为发邮件的自己的QQ号,第二个为授权码(需要到QQ邮箱中获取) return pa; } }); session.setDebug(true);// 设置打开调试状态 try { // 声明一个Message对象(代表一封邮件),从session中创建 MimeMessage msg = new MimeMessage(session); // 邮件信息封装 // 1发件人 msg.setFrom(new InternetAddress("867679310@qq.com")); // 2收件人 msg.setRecipient(RecipientType.TO, new InternetAddress(user.getEmail())); // 3邮件内容:主题、内容 msg.setSubject(user.getName() + ",欢迎注册综合类信息网站账号,请点击链接激活账号"); // StringBuilder是线程不安全的,但是速度快,这里因为只会有这个线程来访问,所以可以用这个 StringBuilder sbd = new StringBuilder(); sbd.append(user.getName() + "<br/>欢迎!请确认此邮件地址以激活您的账号。<br/>"); sbd.append("<font color='red'><a href='http://127.0.0.1:8080/ActiveServlet?uid=" + user.getUid() + "' target='_blank'"); sbd.append(">立即激活</a></font><br/>"); sbd.append("或者点击下面链接:<br/>"); sbd.append("http://127.0.0.1:8080/ActiveServlet?uid=" + user.getUid() + "<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(); } } }
在UserServices的注册方法中调用util工具类中的MySendMailThread.java中的方法,代码如下:
public boolean regist( User user ){ new MySendMailThread( user ).run(); return userDao.insert( user ); }
最后在登录中的UserLoginServlet.java文件中添加如下判断,通过查询数据库中的Active字段是否置1来判断用户是否登录邮箱进行邮箱激活,代码为:
if(user.getActive().equals("0")){ String loginMsg="未使用邮箱激活账号,请打开您的邮箱激活!"; request.setAttribute("loginMsg",loginMsg); request.getRequestDispatcher("/login.jsp").forward(request,response); }