三沣开发知识 购物 网址 游戏 小说 歌词 地图 快照 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 开发 租车 短信 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题
autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml
html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> Java -> JavaMail -> 正文阅读
 

[Java]JavaMail

JavaMail 一、邮件协议 
1 收发邮件
  发邮件大家都会吧!发邮件是从客户端把邮件发送到邮件服务器,收邮件是把邮件服务器的邮件下载到客户端。


  我们在163、126、QQ、sohu、sina等网站注册的Email账户,其实就是在邮件服务器中注册的。这些网站都有自己的邮件服务器。

2 邮件协议概述
与HTTP协议相同,收发邮件也是需要有传输协议的。 SMTP:(Simple Mail Transfer Protocol,简单邮件传输协议)发邮件协议; POP3:(Post Office Protocol Version 3,邮局协议第3版)收邮件协议; IMAP:(Internet Message Access Protocol,因特网消息访问协议)收发邮件协议。
3 理解邮件收发过程
  其实你可以把邮件服务器理解为邮局!如果你需要给朋友寄一封信,那么你需要把信放到邮筒中,这样你的信会“自动”到达邮局,邮局会把信邮到另一个省市的邮局中。然后这封信会被送到收信人的邮箱中。最终收信人需要自己经常查看邮箱是否有新的信件。
  其实每个邮件服务器都由SMTP服务器和POP3服务器构成,其中SMTP服务器负责发邮件的请求,而POP3负责收邮件的请求。

 

  当然,有时我们也会使用163的账号,向126的账号发送邮件。这时邮件是发送到126的邮件服务器,而对于163的邮件服务器是不会存储这封邮件的。

 

4 邮件服务器名称
smtp服务器的端口号为25,服务器名称为smtp.xxx.xxx。
pop3服务器的端口号为110,服务器名称为pop3.xxx.xxx。
例如:
163:smtp.163.com和pop3.163.com; 126:smtp.126.com和pop3.126.com; qq:smtp.qq.com和pop3.qq.com; sohu:smtp.sohu.com和pop3.sohu.com; sina:smtp.sina.com和pop3.sina.com。
二、telnet收发邮件
1 BASE64加密
  BASE64是一种加密算法,这种加密方式是可逆的!它的作用是使加密后的文本无法用肉眼识别。Java提供了sun.misc.BASE64Encoder这个类,用来对做Base64的加密和解密,在eclipse中根本使用不了这个类(需要设置)。

 1 package cn.itcast.base64;
 2 
 3 import org.junit.Test;
 4 import sun.misc.BASE64Decoder;
 5 import sun.misc.BASE64Encoder;
 6 import java.io.IOException;
 7 
 8 public class Dome1 {
 9     @Test
10     public void fun1() throws IOException {
11         //BASE64编码
12         String s = "Username";
13         BASE64Encoder encoder = new BASE64Encoder();
14         s = encoder.encode(s.getBytes("UTF-8"));
15         System.out.println(s);
16         //BASE64解码
17         BASE64Decoder decoder = new BASE64Decoder();
18         byte[] bytes = decoder.decodeBuffer(s);
19         System.out.println(new String(bytes,"utf-8"));
20     }
21 }

  使用apache commons组件中的codec包下的Base64这个类来完成BASE64加密和解密。

 1 import org.apache.commons.codec.binary.Base64;
 2 
 3 public class Base64Utils {
 4   public static String encode(String s) {
 5     return encode(s, "utf-8");
 6   }
 7 
 8   public static String decode(String s) {
 9     return decode(s, "utf-8");
10   }
11 
12   public static String encode(String s, String charset) {
13     try {
14       byte[] bytes = s.getBytes(charset);
15       bytes = Base64.encodeBase64(bytes);
16       return new String(bytes, charset);
17     } catch (Exception e) {
18       throw new RuntimeException(e);
19     }
20   }
21 
22   public static String decode(String s, String charset) {
23     try {
24       byte[] bytes = s.getBytes(charset);
25       bytes = Base64.decodeBase64(bytes);
26       return new String(bytes, charset);
27     } catch (Exception e) {
28       throw new RuntimeException(e);
29     }
30   }
31 }

2 telnet发邮件
  连接163的smtp服务器:  
$ telnet smtp.163.com 25

连接成功后需要如下步骤才能发送邮件:
  ①与服务器打招呼:ehlo你的名字


  ②发出登录请求:auth login
  


  ③输入加密后的邮箱名:(itcast_cxf@163.com)aXRjYXN0X2N4ZkAxNjMuY29t
  ④输入加密后的邮箱密码:(itcast)aXRjYXN0
  


  ⑤输入谁来发送邮件,即from:mail from:<itcast_cxf@163.com>


  ⑥输入把邮件发给谁,即to:rcpt to:<itcast_cxf@126.com>

  ⑦发送填写数据请求:data

  ⑧开始输入数据,数据包含:from、to、subject,以及邮件内容,如果输入结束后,以一个“.”为一行,表示输入结束:
from:<chengcheng@163.com>
to:<itcast_cxf@sina.com>
subject: 你好
hi,我是chengcheng。
.
  注意,在标题和邮件正文之间要有一个空行!当要退出时,一定要以一个“.”为单行,表示输入结束。
  ⑨最后一步:quit

3 telnet收邮件
telnet收邮件的步骤:
pop3无需使用Base64加密。
  收邮件连接的服务器是pop3.xxx.com,pop3协议的默认端口号是110。请注意!这与发邮件完全不同。如果你在163有邮箱账户,那么你想使用telnet收邮件,需要连接的服务器是pop3.163.com。
连接pop3服务器:telnet pop3.163.com 110
user命令:user 用户名,例如:user itcast_cxf@163.com; pass命令:pass 密码,例如:pass itcast; stat命令:stat命令用来查看邮箱中邮件的个数,所有邮件所占的空间; list命令:list命令用来查看所有邮件,或指定邮件的状态,例如:list 1是查看第一封邮件的大小,list是查看邮件列表,即列出所有邮件的编号,及大小; retr命令:查看指定邮件的内容,例如:retr 1#是查看第一封邮件的内容; dele命令:标记某邮件为删除,但不是马上删除,而是在退出时才会真正删除; quit命令:退出!如果在退出之前已经使用dele命令标记了某些邮件,那么会在退出是删除它们。


三、JavaMail
1 JavaMail概述
Java Mail是由SUN公司提供的专门针对邮件的API,主要Jar包:mail.jar、activation.jar。(jar包下载链接:http://www.oracle.com/technetwork/java/javamail/index.html)
2 JavaMail中主要类
java mail中主要类:javax.mail.Session、javax.mail.internet.MimeMessage、javax.mail.Transport。
Session:表示会话,即客户端与邮件服务器之间的会话!想获得会话需要给出账户和密码,当然还要给出服务器名称。在邮件服务中的Session对象,就相当于连接数据库时的Connection对象。
MimeMessage:表示邮件类,它是Message的子类。它包含邮件的主题(标题)、内容,收件人地址、发件人地址,还可以设置抄送和暗送,甚至还可以设置附件。
Transport:用来发送邮件。它是发送器!
3 JavaMail之Hello World
在使用telnet发邮件时,还需要自己来处理Base64编码的问题,但使用JavaMail就不必理会这些问题了,都由JavaMail来处理。
第一步:获得Session
Session session = Session.getInstance(Properties prop, Authenticator auth);
其中prop需要指定两个键值,一个是指定服务器主机名,另一个是指定是否需要认证!我们当然需要认证!
Properties prop = new Properties(); prop.setProperty(“mail.host”, “smtp.163.com”);//设置服务器主机名 prop.setProperty(“mail.smtp.auth”, “true”);//设置需要认证
  其中Authenticator是一个接口表示认证器,即校验客户端的身份。我们需要自己来实现这个接口,实现这个接口需要使用账户和密码。
Authenticator auth = new Authenticator() {
      public PasswordAuthentication getPasswordAuthentication () {
           return new PasswordAuthentication(“用户名”, “密码”);//用户名和密码
    }
};
  通过上面的准备,现在可以获取得Session对象了:
Session session = Session.getInstance(prop, auth);
第二步:创建MimeMessage对象
创建MimeMessage需要使用Session对象来创建:
MimeMessage msg = new MimeMessage(session);
然后需要设置发信人地址、收信人地址、主题,以及邮件正文。
msg.setFrom(new InternetAddress(“***@163.com”));//设置发信人 msg.addRecipients(RecipientType.TO, “***@qq.com,***@sina.com”);//设置多个收信人 msg.addRecipients(RecipientType.CC, “***@sohu.com,***@126.com”);//设置多个抄送 msg.addRecipients(RecipientType.BCC, ”***@hotmail.com”);//设置暗送 msg.setSubject(“这是一封测试邮件”);//设置主题(标题) msg.setContent(“当然是hello world!”, “text/plain;charset=utf-8”);//设置正文
 第三步:发送邮件
Transport.send(msg);//发送邮件
4、示例:

 1 package javamail;
 2 
 3 import org.junit.Test;
 4 import javax.mail.Authenticator;
 5 import javax.mail.PasswordAuthentication;
 6 import javax.mail.Session;
 7 import javax.mail.Transport;
 8 import javax.mail.internet.*;
 9 import java.io.File;
10 import java.util.Properties;
11 
12 public class Demo1 {
13     @Test
14     public void fun1() throws Exception{
15         //1、得到session
16         Properties props = new Properties();
17         props.setProperty("mail.host","smtp.163.com");//邮箱主机
18         props.setProperty("mail.smtp.auth","true");//设置邮箱验证
19 
20         javax.mail.Authenticator auth = new Authenticator() {
21             @Override
22             protected PasswordAuthentication getPasswordAuthentication() {
23                 return new PasswordAuthentication("****","*****");//用户名与密码
24             }
25         };
26         Session session = Session.getInstance(props,auth);
27 
28         //2、创建MimeMessage
29         MimeMessage msg = new MimeMessage(session);
30         msg.setFrom(new InternetAddress("*****@163.com"));//设置发件人
31         msg.setRecipients(MimeMessage.RecipientType.TO,"******@qq.com");//设置多个收件人
32 //        msg.setRecipients(MimeMessage.RecipientType.CC,"***@126.com");//设置抄送
33 //        msg.setRecipients(MimeMessage.RecipientType.BCC,"***@126.com");//设置暗送
34 
35         msg.setSubject("这是一封测试邮件");
36         msg.setContent("测试邮件","text/html;charset=utf-8");
37         //3、发邮件
38         Transport.send(msg);
39     }
40     /*
41     * 带附件邮件
42     * */
43     @Test
44     public void fun2() throws Exception{
45         //1、得到session
46         Properties props = new Properties();
47         props.setProperty("mail.host","smtp.163.com");
48         props.setProperty("mail.smtp.auth","true");
49 
50         javax.mail.Authenticator auth = new Authenticator() {
51             @Override
52             protected PasswordAuthentication getPasswordAuthentication() {
53                 return new PasswordAuthentication("gdwuguibin","1990926");
54             }
55         };
56         Session session = Session.getInstance(props,auth);
57 
58         //2、创建MimeMessage
59         MimeMessage msg = new MimeMessage(session);
60         msg.setFrom(new InternetAddress("gdwuguibin@163.com"));//设置发件人
61         msg.setRecipients(MimeMessage.RecipientType.TO,"1037345628@qq.com");//设置多个收件人
62 
63         msg.setSubject("这是一封带附件测试邮件");
64         /*
65         * 当发送包含附件的邮件时,邮件体就为多部件形式
66         * 1、创建一个多部件内容,MimeMultipart
67         *   MimeMultipart就是一个集合,用来装载多个主体部件
68         * 2、需要创建两个主体部件,一个是文本内容的,另一个是附件的
69         *   主体部件叫MimeBodyPart
70         * 3、把MimeMultipart设置给MimeMessage的内容
71         * */
72         MimeMultipart list = new MimeMultipart();//创建多部分主体
73         //创建MimeBodyPart
74         MimeBodyPart part1 = new MimeBodyPart();
75         //设置主体部件的内容
76         part1.setContent("这是一封带附件的测试邮件","text/html;charset=utf-8");
77         //把主体部件添加到集合中
78         list.addBodyPart(part1);
79         //创建MimeBodyPart
80         MimeBodyPart part2 = new MimeBodyPart();
81         part2.attachFile(new File("/Users/Mac/Downloads/img/2.jpg"));//设置附件的内容
82         part2.setFileName(MimeUtility.encodeText("海参.jpg"));//设置显示的文件名称,其中encodeText用来处理中文乱码问题
83         list.addBodyPart(part2);
84 
85         msg.setContent(list);//把它设置给邮件作为邮件的内容
86         //3、发邮件
87         Transport.send(msg);
88     }
89 }

 Java读取properties配置文件时,中文乱码解决方法:http://blog.csdn.net/u012743772/article/details/49153699
  Java 最新文章
初入山门,需记门规
java 操作本地数据库 mysql
spring boot 整合 mybatis
单表(SSM、SpringBoot、SpringCloud、Free
Mybatis框架中Mapper动态代理方式
IDEA报错:Error starting ApplicationCont
多订单多支付方式分配金额问题
从源码来理解slf4j的绑定,以及logback对配
ThreadLocal的使用及介绍
java基础知识(一)
上一篇文章      下一篇文章      查看所有文章
加:2017-10-13 23:22:32  更:2017-10-13 23:22:56 
 
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2017年12日历
2017-12-14 6:45:14
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库