Java Mail

转载请注明出处: http://blog.csdn.net/qq\_26525215

本文源自**【大学之旅_谙忆的博客】**

JavaMail-API简介:

邮件客户端的主要任务是向邮件服务器发送邮件,以及接收来自邮件服务器的邮件。
Sun公司制定了一套API,它封装了邮件通信的各种协议。为Java开发者提供了收发电子邮件的公共接口。

需要的jar包

mail.jar和activation-1.1.0.jar链接:
https://github.com/chenhaoxiang/Java/tree/master/JavaMail

Javax.mail.Session:

Session -用于设置服务器,协议类型和密码等
表示会话,是JavaMailApi的最高层入口类。Session对像从Properties中获取信息,如IP、协议、用户名密码等。

Javax.mail.Message类,它的一个重要子类为MimeMessage.

Message类表示电子邮件的正文部分。
一封电子邮件包含以下内容:
地址信息、标题、日期、正文。

Java.mail.Address:收件人地址
表示邮件的地址。常用的子类为:javax.mail.internet.InternetAddress.

Javax.mail.Transport:负责发送邮件
指定邮件发送的协议。通常为SMTP.
它的静态方法send(Message)负责发送邮件。

MailSSLSocketFactory-负责SSL加密(如果有邮箱是用ssl加密传输的,就需要用到这个类,否则不需要-以前的老版本jar包中没有此类)

演示用QQ邮箱给网易126邮箱发邮件:

为什么要用QQ邮箱,那是因为QQ邮箱的发送用到了ssl加密,而且这里原本需要的密码,也需要用授权码才可以。

JavaMail发送邮件:前提是QQ邮箱里帐号设置要开启POP3/SMTP协议

发送没有附件的邮件

第一种方式:

1@Test//发送没有附件的邮件 2 public void send1() throws Exception{ 3 //跟smtp服务器建立一个连接 4 Properties p = new Properties(); 5 // 设置邮件服务器主机名 6 p.setProperty("mail.host", "smtp.qq.com");//指定邮件服务器,默认端口 25 7 // 发送服务器需要身份验证 8 p.setProperty("mail.smtp.auth", "true");//要采用指定用户名密码的方式去认证 9 // 发送邮件协议名称 10 p.setProperty("mail.transport.protocol", "smtp"); 11 12 // 开启SSL加密,否则会失败 13 MailSSLSocketFactory sf = new MailSSLSocketFactory(); 14 sf.setTrustAllHosts(true); 15 p.put("mail.smtp.ssl.enable", "true"); 16 p.put("mail.smtp.ssl.socketFactory", sf); 17 18 // 开启debug调试,以便在控制台查看 19 //session.setDebug(true);也可以这样设置 20 //p.setProperty("mail.debug", "true"); 21 22 // 创建session 23 Session session = Session.getDefaultInstance(p, new Authenticator() { 24 @Override 25 protected PasswordAuthentication getPasswordAuthentication() { 26 //用户名可以用QQ账号也可以用邮箱的别名 27 PasswordAuthentication pa = new PasswordAuthentication("chenhaoxiang0117", "jnj*********dab"); 28 // 后面的字符是授权码,用qq密码不行!! 29 return pa; 30 } 31 }); 32 33 session.setDebug(true);//设置打开调试状态 34 35 for (int i = 0; i <1; i++) { 36 37 38 //发送几封邮件 39 //声明一个Message对象(代表一封邮件),从session中创建 40 MimeMessage msg = new MimeMessage(session); 41 //邮件信息封装 42 //1发件人 43 msg.setFrom(new InternetAddress("*****@qq.com")); 44 //2收件人 45 msg.setRecipient(RecipientType.TO, new InternetAddress( 46 "******@126.com")); 47 //3邮件内容:主题、内容 48 msg.setSubject("这是我用Java发来的邮件QQ...."); 49 //msg.setContent("Hello, 今天没下雨!!!", "text/plain;charset=utf-8");//纯文本 50 msg.setContent( 51 "Hello <a href='http://www.baidu.com?id=ddd'>你好,快乐吗?<a/>", 52 "text/html;charset=utf-8");//发html格式的文本 53 //发送动作 54 Transport.send(msg); 55 } 56 }

第二种方式:

1public class sendqqMail { 2 3 4 5 6 public static void main(String[] args) throws Exception { 7 8 Properties prop = new Properties(); 9 // 开启debug调试,以便在控制台查看 10 prop.setProperty("mail.debug", "true"); 11 // 设置邮件服务器主机名 12 prop.setProperty("mail.host", "smtp.qq.com"); 13 // 发送服务器需要身份验证 14 prop.setProperty("mail.smtp.auth", "true"); 15 // 发送邮件协议名称 16 prop.setProperty("mail.transport.protocol", "smtp"); 17 18 // 开启SSL加密,否则会失败 19 MailSSLSocketFactory sf = new MailSSLSocketFactory(); 20 sf.setTrustAllHosts(true); 21 prop.put("mail.smtp.ssl.enable", "true"); 22 prop.put("mail.smtp.ssl.socketFactory", sf); 23 24 // 创建session 25 Session session = Session.getInstance(prop); 26 27 // 通过session得到transport对象 28 Transport ts = session.getTransport(); 29 // 连接邮件服务器:邮箱类型,帐号,授权码代替密码(更安全) 30 ts.connect("smtp.qq.com", "619***629", "jnjt***bdab"); 31 // 后面的字符是授权码,用qq密码失败了 32 33 // 创建邮件 34 Message message = createSimpleMail(session); 35 // 发送邮件 36 ts.sendMessage(message, message.getAllRecipients()); 37 ts.close(); 38 } 39 40 /** 41 * @Method: createSimpleMail 42 * @Description: 创建一封只包含文本的邮件 43 */ 44 public static MimeMessage createSimpleMail(Session session) 45 throws Exception { 46 // 创建邮件对象 47 MimeMessage message = new MimeMessage(session); 48 // 指明邮件的发件人 49 message.setFrom(new InternetAddress("61*****29@qq.com")); 50 // 指明邮件的收件人 51 message.setRecipient(Message.RecipientType.TO, new InternetAddress( 52 "*****@126.com")); 53 // 邮件的标题 54 message.setSubject("QQ邮件测试"); 55 // 邮件的文本内容 56 message.setContent("发送邮件成功!", "text/html;charset=UTF-8"); 57 // 返回创建好的邮件对象 58 return message; 59 } 60}

QQ邮箱生成授权码的位置:

126邮箱接收结果:

发送有附件的邮件

相对于没带附件的:用MimeBodyPart来构建体,向体中添加内容,附件。最后利用MimeMultipart —addBodyPart(body); 把体加入。

这里需要一个activation包。

1@Test//发送含附件的邮件 2 public void send2() throws Exception{ 3 //跟smtp服务器建立一个连接 4 Properties p = new Properties(); 5 // 开启debug调试,以便在控制台查看 6 p.setProperty("mail.debug", "true"); 7 p.setProperty("mail.host", "smtp.sina.com");//指定邮件服务器,默认端口 25 8 p.setProperty("mail.smtp.auth", "true");//要采用指定用户名密码的方式去认证 9 // 发送邮件协议名称 10 p.setProperty("mail.transport.protocol", "smtp"); 11 12 // 开启SSL加密,否则会失败 13 MailSSLSocketFactory sf = new MailSSLSocketFactory(); 14 sf.setTrustAllHosts(true); 15 p.put("mail.smtp.ssl.enable", "true"); 16 p.put("mail.smtp.ssl.socketFactory", sf); 17 18 // 创建session 19 Session session = Session.getInstance(p); 20 21 // 通过session得到transport对象 22 Transport ts = session.getTransport(); 23 24 // 连接邮件服务器:邮箱类型,帐号,授权码代替密码(更安全) 25 ts.connect("smtp.qq.com", "61*****29", "jnjt*******bdab"); 26 // 后面的字符是授权码,不能用qq密码 27 28 //声明一个Message对象(代表一封邮件),从session中创建 29 MimeMessage msg = new MimeMessage(session); 30 //邮件信息封装 31 //1发件人 32 msg.setFrom( new InternetAddress("61******29@qq.com") ); 33 //2收件人 34 msg.setRecipient(RecipientType.TO, new InternetAddress("ch*****ox@126.com") ); 35 //3邮件内容:主题、内容 36 msg.setSubject("这是我用Java发来的邮件--带附件的...."); 37 38 //添加附件部分 39 //邮件内容部分1---文本内容 40 MimeBodyPart body0 = new MimeBodyPart(); //邮件中的文字部分 41 body0.setContent("这是两张<font color='red'>图片</font>....","text/html;charset=utf-8"); 42 43 //邮件内容部分2---附件1 44 MimeBodyPart body1 = new MimeBodyPart(); //附件1 45 body1.setDataHandler( new DataHandler( new FileDataSource("./imgs/1.jpg")) );//./代表项目根目录下 46 47 body1.setFileName( MimeUtility.encodeText("中文1.jpg") );//中文附件名,解决乱码 48 49 //邮件内容部分3---附件2 50 MimeBodyPart body2 = new MimeBodyPart(); //附件2 51 body2.setDataHandler( new DataHandler( new FileDataSource("./imgs/2.jpg")) ); 52 body2.setFileName("2.jpg"); 53 54 //把上面的3部分组装在一起,设置到msg中 55 MimeMultipart mm = new MimeMultipart(); 56 mm.addBodyPart(body0); 57 mm.addBodyPart(body1); 58 mm.addBodyPart(body2); 59 msg.setContent(mm); 60 61 // 发送邮件 62 ts.sendMessage(msg,msg.getAllRecipients()); 63 ts.close(); 64 }

接收结果:

小知识点:

1.必须先启用QQ邮箱里POP3/STMP服务;然后生成授权码

2.导入mail.jar包和activation包
mail.jar和activation-1.1.0.jar链接:
https://github.com/chenhaoxiang/Java/tree/master/JavaMail

3.要在代码里加上开启SSL加密的代码(老版本的mail中没有MailSSLSocketFactory类)

4.密码不是QQ密码,而是授权码!

转载请注明出处: http://blog.csdn.net/qq\_26525215

本文源自**【大学之旅_谙忆的博客】**

本文同步分享在 博客“谙忆”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )