飞道的博客

javaMail邮件服务

219人阅读  评论(0)

邮箱服务器的基本概念

邮件的客户端:可以只安装在电脑上的也可以是网页形式的

邮件服务器:起到邮件的接受与推送的作用

邮件发送的协议:SMTP     (协议:就是数据传输的约束)

接受邮件的协议:POP3   IMAP     

邮件的发送过程

javaMail

JavaMail就是一套API,没有特殊的概念。

1.使用javaMail发送邮件

(1)导入jar包:   添加javamail的jar

(2)借助于本机安装的邮箱服务器

@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.将发送邮件的过程封装为工具类

 

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);
    }
}

3.使用网易邮箱发送邮件(从网易邮箱发送邮件到QQ邮箱)

(1)分别注册网易邮箱和QQ邮箱,开始网易和QQ邮箱进行相关的配置:

 

 

@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() {
                //你的163邮箱的账号和密码
                return new PasswordAuthentication("11111111111@163.com", "123456");
            }
        };
        //根据上面的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("15852508901@163.com"));
        //这只接受者地址
        message.setRecipient(RecipientType.TO, new InternetAddress("2780004063@qq.com"));
        //发送
        Transport.send(message);
    }

//发不出去,163邮箱服务器会默认这是一条垃圾邮件,不会发出去的

4.邮箱验证业务

业务:用户输入邮箱注册,服务器发送邮件给邮箱,在邮箱中点击链接再次请求服务器验证。链接中必须携带唯一标识符。

//大致过程(语文能力差,应该能读懂我的意思)  

用户在页面输入自己的邮箱,后台在servlet获取到用户的邮箱,传到service,在service层调用uuid为用户生成随机的唯一标识码,并且发送邮件给注册的这个邮箱,携带刚随机生成的唯一标识符,然后将这个用户的邮箱激活状态默认设置为0,这个注册的人的邮箱收到携带唯一标识码的邮件后,点击这个链接,后台servlet写一个根据用户的唯一标识符(code)修改用户邮箱的激活状态,这样这个用户的邮箱就激活了。

具体部分代码:(借助于本机安装的邮箱服务器

(1)数据库创建一个表,存储用户页面填写的信息:(必须包含字段用户邮箱,唯一标识符,邮箱状态)

create table igeek_user(

   id int primary key auto_increment,

   Email varchar(20) not null,

   checked int default '0',

   code varchar(50)

);

(2)在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;

}

 

}

(3)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);

}

(4)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("验证失败");

}

}

}

(5)可以写一个简单的测试页面进行测试:

<body>

<form action="igeekUser" method="post">

邮箱:<input type="emial" name="email"/>

<input type="submit" value="走你"/>

</form>

</body>

 

 


转载:https://blog.csdn.net/qq_39182939/article/details/104593929
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场