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
- Java Mail 发送邮件
- JAVA MAIL发送邮件
- Java Mail 发送邮件
- Java mail发送邮件
- java mail 发送邮件
- Java Mail发送邮件
- java mail邮件发送
- java mail 发送邮件
- Java mail发送邮件
- java mail发送邮件
- Java mail 发送邮件
- java mail发送邮件
- java mail 发送邮件
- java mail 发送邮件
- java mail 发送邮件
- Java mail发送邮件
- Java-Mail 发送邮件
- java mail发送邮件
- 【codevs 4543】普通平衡树
- Scala学习笔记——20170818
- python算法——字符串表达式的计算(转自:无限大地NLP_空木)
- [观点]
- MYSQL复制原理及其流程
- Java mail 发送邮件
- 数位dp 求l-r(10进制) 在k进制中有多少个回文数的模板
- solr第一天入门
- 希尔排序
- Guitar Pro中文版下载,你想要的,都在这啦
- 如何在fedora26安装chromium安装flash
- Hibernate框架深入
- 【[Offer收割]编程练习赛23 D】【最小生成树+set的启发式合并】观光旅行
- 【玉蟾宫】codevs 2491