1 邮箱服务
1.1 邮箱服务器的基本概念
邮件的客户端:可以只安装在电脑上的也可以是网页形式的
邮件服务器:起到邮件的接受与推送的作用
邮件发送的协议:
协议:就是数据传输的约束
接受邮件的协议:POP3 IMAP
发送邮件的协议:SMTP
1.2 邮件的发送过程
1.3 邮箱服务器的安装
傻瓜式安装。
安装完成:
服务器设置:
添加账户(注册邮箱用户):
1.4 邮箱客户端的安装
正常安装:
在邮件客户端添加用户:
创建两个账户测试邮件服务
2 javaMail
2.1使用javaMail发送邮件
JavaMail就是一套API,没有特殊的概念。
直接案例:
添加javamail的jar
package com.igeek.mailtest;
import java.util.Properties;
import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.Message.RecipientType; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage;
import org.junit.Test;
public class MailTest { @Test public void testSendMail() throws Exception { // 使用properties类进行相关配置 Properties props = new Properties(); // 设置发送邮件的协议 props.setProperty("mail.transport.protocol", "SMTP"); // 设置发送邮件的服务器 props.setProperty("mail.host", "localhost"); // 设置进行用户验证 props.setProperty("mail.smtp.auth", "true"); // 创建验证器 Authenticator auth = new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { // return new PasswordAuthentication("tom", "123123"); } }; //根据上面的Properties的配置和验证器打开一个session Session session = Session.getInstance(props, auth); //创建message对象 Message message = new MimeMessage(session); //设置邮件标题 message.setSubject("tom发送给jerry的测试邮件"); //设置邮件内容(有多个API,可以满足多各种需求) message.setText("我就是测试邮件!!!"); //设置发送者地址 message.setFrom(new InternetAddress("tom@igeek.com")); //这只接受者地址 message.setRecipient(RecipientType.TO, new InternetAddress("jerry@igeek.com")); //发送 Transport.send(message); } } |
2.2将发送邮件的过程封装为工具类
public class MailUtil { //发送者的邮箱地址 private String fromAddress = "tom@igeek.com"; public void setFromAddress(String fromAddress) { this.fromAddress = fromAddress; } //发送者邮箱密码 private String fromPass = "123123"; public void setFromPass(String fromPass) { this.fromPass = fromPass; }
public void sendMaill(String title,String content,String toAddress) throws Exception { // 使用properties类进行相关配置 Properties props = new Properties(); // 设置发送邮件的协议 props.setProperty("mail.transport.protocol", "SMTP"); // 设置发送邮件的服务器 props.setProperty("mail.host", "localhost"); // 设置进行用户验证 props.setProperty("mail.smtp.auth", "true"); // 创建验证器 Authenticator auth = new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { String name = fromAddress.substring(0, fromAddress.indexOf("@")); return new PasswordAuthentication(name, fromPass); } }; //根据上面的Properties的配置和验证器打开一个session Session session = Session.getInstance(props, auth); //创建message对象 Message message = new MimeMessage(session); //设置邮件标题 message.setSubject(title); //设置邮件内容(有多个API,可以满足多各种需求) message.setText(content); //设置发送者地址 message.setFrom(new InternetAddress(fromAddress)); //这只接受者地址 message.setRecipient(RecipientType.TO, new InternetAddress(toAddress)); //发送 Transport.send(message); } }
|
2.3使用网易邮箱发送邮件
进入邮箱做相关的设置:
可以使用第三方独立授权码发送邮件:
@Test public void testSendMail1() throws Exception { // 使用properties类进行相关配置 Properties props = new Properties(); // 设置发送邮件的协议 props.setProperty("mail.transport.protocol", "SMTP"); // 设置发送邮件的服务器 props.setProperty("mail.host", "smtp.163.com"); // 设置进行用户验证 props.setProperty("mail.smtp.auth", "true"); // 创建验证器 Authenticator auth = new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { // return new PasswordAuthentication("15852508901@163.com", "igeek234567"); } }; //根据上面的Properties的配置和验证器打开一个session Session session = Session.getInstance(props, auth); //创建message对象 Message message = new MimeMessage(session); //设置邮件标题 message.setSubject("研发会议通知"); //设置邮件内容(有多个API,可以满足多各种需求) message.setContent("明天上午10点整大会议室开会,准备好会议资料。","text/plain;charset=utf-8"); //设置发送者地址 message.setFrom(new InternetAddress("158****8901@163.com")); //这只接受者地址 message.setRecipient(RecipientType.TO, new InternetAddress("27*****3@qq.com")); //发送 Transport.send(message); } |
2.4 邮箱验证业务
用户输入邮箱注册,服务器发送邮件给邮箱,在邮箱中点击链接再次请求服务器验证。
链接中必须携带唯一标识符。
[1]数据库
Igeek_user create table igeek_user( id int primary key auto_increment, Email varchar(20) not null, checked int default '0', code varchar(50) ); |
创建项目,添加相关配置
添加实体类:
public class IgeekUser { private int id; private String email; private int checked; private String code; } |
DAO
注册的方法
验证的方法
public class IgeekDAOImpl implements IIgeekDAO { private QueryRunner qr = new QueryRunner(JDBCUtils.getDateSource()); @Override public int reg(IgeekUser iu) { String sql = "insert into igeek_user(email,checked,code) values(?,default,?)"; try { return qr.update(sql,iu.getEmail(),iu.getCode()); } catch (SQLException e) { e.printStackTrace(); } return -1; } @Override public int checked(String code) { String sql = "update igee_user set checked = 1 where code = ?"; try { return qr.update(sql,code); } catch (SQLException e) { e.printStackTrace(); } return -1; }
} |
Service实现:
public class IgeeUserServiceImpl implements IIgeekUserService { private IIgeekDAO igeekDAO; public void setIgeekDAO(IIgeekDAO igeekDAO) { this.igeekDAO = igeekDAO; }
public int reg(IgeekUser iu) { //生成唯一标识符 String code = UUID.randomUUID().toString().replaceAll("-", ""); iu.setCode(code); return igeekDAO.reg(iu); }
@Override public int checked(String code) { return igeekDAO.checked(code); } } |
Service和dao的配置 beans.xml
<bean id="igeekUserDAO" class="com.igeek.dao.impl.IgeekDAOImpl"/>
<bean id="igeekUserService" class="com.igeek.service.impl.IgeeUserServiceImpl"> <property name="igeekDAO" ref="igeekUserDAO"/> </bean> |
Servlet开发:
@WebServlet("/igeekUser") public class IgeekUserServlet extends BaseServlet { private IIgeekUserService igeekUserService = (IIgeekUserService) BeansFactory.getBean("igeekUserService");
public void reg(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取请求参数 String email = request.getParameter("email"); IgeekUser user = new IgeekUser(); user.setEmail(email); igeekUserService.reg(user); response.setCharacterEncoding("utf-8"); response.getWriter().write("请进入邮箱验证"); }
public void check(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String code = request.getParameter("code"); int result = igeekUserService.checked(code); response.setCharacterEncoding("utf-8"); if(result == 1) { response.getWriter().write("验证通过"); }else { response.getWriter().write("验证失败"); } } } |
在service中添加发送邮件的程序:
public int reg(IgeekUser iu) { //生成唯一标识符 String code = UUID.randomUUID().toString().replaceAll("-", ""); iu.setCode(code); //发送验证的邮件 MailUtil mu = new MailUtil(); mu.setFromAddress("tom@igeek.com"); mu.setFromPass("123123"); StringBuffer sb = new StringBuffer(); sb.append("这里是邮箱验证,请点击"); sb.append("[<a href='http://127.0.0.1:8888/ day12_demo1/igeekUser?op=check&code="+code+"'></a>]进行验证"); sb.append("<br/>如果点击之后没有反应,请将下面的连接复制到浏览器中验证.<br/>"); sb.append("http://127.0.0.1:8888/ day12_demo1/igeekUser?op=check&code="+code); sb.append("祝您验证成功!"); try { mu.sendMaill("邮箱验证", sb.toString(), iu.getEmail()); } catch (Exception e) { e.printStackTrace(); }
return igeekDAO.reg(iu); } |
添加注册页面:
<body> <form action="igeekUser" method="post"> 邮箱:<input type="emial" name="email"/> <input type="submit" value="走你"/> </form> </body> |