Java mail 发送邮件

来源:互联网 发布:独立网络经纪人登录 编辑:程序博客网 时间:2024/05/22 06:25

近期需要实现一个邮件服务,于是研究了一下

用java实现邮件服务需要Java mail支持

Javamail 是Java EE的一个部分,没有放在SE里面,JavaMail封装了一系列API实现了邮件服务的相关协议,我们可以使用这样一些API来实现发送邮件和接受邮件的功能。

邮件协议

SMTP:用来发送邮件
POP3:用来接收邮件

国内提供邮件服务的机构,如qq,网易163, 126,等,默认是不开启smtp和pop3服务的,所以,你如果想要在第三方客户端,比如网易邮箱大师,微软的outlook,或者是foxmail等接收所有邮件,或者是我们用Javamail自己实现邮件服务,都需要你在提供邮件服务器的机构,在客户端手动开启smtp和pop3服务,并获取授权码,在第三方客户端和Javamail中所有的密码用的都是你的授权码(不是qq密码或者网易邮箱登录密码)

开启smtp/pop3服务

qq邮箱开启smtp/pop3服务

登录qq邮箱网页版,找到 设置-账户-往下面找

这里写图片描述

这里写图片描述

这个地方默认关闭,需要手动开启,一般我们使用的发送邮件协议都是smtp,邮件接收协议都是pop3。

在网易邮箱中开启smtp/pop3服务

1.登录

这里写图片描述

2.设置 – smtp/pop3

这里写图片描述

这里写图片描述

这里需要把得到的授权码记住,并且记下来网易提供的邮件服务器地址,其实大部分邮件服务器的地址都是有规律的,默认就是smtp.XXX.com,如果是qq,就是smtp.qq.com,126就是smtp.126.com

2 准备jar包

在Oracle上下载最新的java mail,一定要是最新的或比较新的,原因后面会说到。

3.开始开发

首先先说一下我们需要的几个对象

Session:定义了收发邮件的上下文环境
Message: 一个抽象类,描述了一个邮件模型
Properties:属性键值对,用来插入一些配置,比如服务器地址,端口号,加密,等。
Transport: 发送邮件。
Store: 接收邮件

4.具体方案

1) 新建Java类

public class MailUtils(){    public vois sendMail(){    //实现代码    }    public static void main(String args[]){        //测试主函数        MailUtils.sendMail();    }}

2) 我们需要新建一个属性对象

//声明属性对象Properties props = new Properties();//然后进行配置属性//声明连接协议为smtp协议//声明链接协议为smtp协议props.setProperty("mail.transport.protocol", "smtp");//声明链接主机为qq的smtp服务器:smtp.qq.com(如果是126就写126的)props.setProperty("mail.smtp.host", "smtp.qq.com");//声明端口号为465(这里因为使用ssl加密,所以一般为465,如果不使用ssl加密一般为25)props.put("mail.smtp.port", 465);//声明是否需要身份验证,需要props.setProperty("mail.smtp.auth", "true");//声明是否需要ssl加密,需要props.put("mail.smtp.ssl.enable", "true");//声明是否需要在控制台打印调试信息,需要props.setProperty("mail.debug", "true");

以上就是基本配置,声明需要ssl加密一方面是因为ssl加密后传输安全性更高,另一方面这是qq邮箱强制要求,必须使用ssl加密。

3) 然后,还需要一步配置

try {    //生成ssl证书,这里会抛出一个异常    //这个类在比较旧的Java mail的jar包中是没有的,所以前面说要下载比较新的    MailSSLSocketFactory sf = new MailSSLSocketFactory();    sf.setTrustAllHosts(true);    props.put("mail.smtp.ssl.socketFactory", sf);} catch (GeneralSecurityException e) {    e.printStackTrace();}

4) 以上就是基本的属性配置,然后,我们需要创建一个会话对象

Session session = Session.getInstance(props, new Authenticator() {    //getInstance有多个重载,这里使用需要密码验证的,密码验证虽不是必须的,    //但是一般提供邮件服务的机构都会要求,除非是你本地的邮件服务器自己配置    @Override    protected PasswordAuthentication getPasswordAuthentication() {        return new PasswordAuthentication("发送邮件的邮箱地址", "授权码");    }});

5) 现在有了环境,之后就是创建邮件对象,并发送了

//message是一个抽象类,一般使用mimeMessage这个子类Message message = new MimeMessage(session);try {    //设置发件人    message.setFrom(new InternetAddress("发送邮件的邮箱地址"));//设置收件人,其实这里不设置也是可以发送的,但是没有收件人的邮件显然没有意义这里使用的是互联网地址,所以不能直接传字符串需要new一个InternetAdress对象。另外,这里使用了RecipientType,to表示收件人,co表示抄送人,bo表示密送人    message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人的邮箱地址"));    //设置邮件主题    message.setSubject("Java mail 发送");    //设置邮件正文,这里发送的是普通文本,也可以发送html    message.setText("邮件正文!!!!");//像这样发送一封html邮件里面需要第一个参数是具体的html字符串,第二个设置格式为“text/html”编码为utf-8 //message.setContent("<h1>来自store网站的激活链接请点击以下链接:</h1><br>" + "<h3><a href='http://localhost:8080/JavaMail/ActiveServlet?code=" + code + "'>点此激活</a></h3>", "text/html;charset=UTF-8");    //创建发送对象    Transport transport = session.getTransport();    //连接smtp服务器,需要服务器地址,用户名,和授权码    transport.connect("smtp.qq.com", "954464727@qq.com", "urgndyovsgoobdde");    //发送邮件。。。    transport.send(message);    //关闭连接,不是必须,但是用完关闭是一个好习惯    transport.close();} catch (MessagingException e) {    e.printStackTrace();}

5.注意事项

1)所有的密码都是授权码,不是登录密码
2)qq邮箱很烦人的就是,我们这样实现的邮件发送会被默认送到垃圾箱,所以收件箱是没有的
3)邮件可以不写收件人,但是没有意义。
4)导包的时候别导错包

By DoubleJan
2017.8.20

原创粉丝点击