关于Email服务你需要知道的知识点:

  概述:

    今天来介绍一下应用层的电子邮件服务,我们每天几乎都在用,电子邮件(email)服务也是一种基于C/S模式的服务,它采用的是一种"存储-转发"的服务,是一种异步通信方式的服务,可以进行非实时通信.

    整个电子邮件系统包括"用户代理"(UA)和"消息传输代理"(MTA)两大部分.

    用户代理(UA):为用户提供操作界面,位于客户端主机内.

    信息传输代理(MTA):负责消息的传输,即所谓的"电子邮局",一般位于邮件服务器中.

  常用的电子邮件协议:

    收发电子邮件,需要遵守一些标准,常见的电子邮件协议有以下三个:

      SMTP(简单邮件传输协议):提供电子邮件的发送服务.端口号25.

      POP3(邮局协议3):提供邮件接受的服务.端口号110;

      IMAP(互联网消息访问协议):一种功能更强大,也更复杂的邮件接收的协议.改进了一些POP3的不足.端口号143.

    SMTP只能基于文本进行传输,不能直接传输图片,视频等非文字的信息,但是配合一个叫做MIME的辅助协议可以将二进制编码后再通过SMTP进行传输.

  电子邮件消息格式:

            

      什么是抄送?

        假设A发邮件给了B,并且抄送给了C,那么B可以看到,"哦,A给我发邮件了,但同时也发给了C,这邮件被C围观了".

      什么是暗送?

        同样,A发邮件给了B,并且暗送给了C,则B看不到邮件发给了C,"哦,A只给我发了邮件".

SMTP协议:

  作用:

     当发送方计算机和支持SMTP的邮件服务器建立连接后,把电子邮件准确无误的发送到接收方的邮件服务器,如果跨多个网络,SMTP可以跨网接力式传输.

  SMTP传输的三个阶段:

    注意:下面的不是指建立TCP连接,3个阶段都是在TCP已建立好连接的基础上进行的.

          连接建立:TCP25号端口连接建立好以后,发件方调用SMTP客户端发送HELO命令,和自己的域名,向收件方表明身份,如果通过验证,收件方会返回"250 OK"的应答消息,这时就建立好了会话连接.

     邮件传输:此阶段发送方会使用多个命令,如用MAIL FROM指示发件人的邮箱地址,使用RCPT TO指示收件人的邮箱地址,此命令可以发送多次,如果服务器准备接受邮件则回复"250 OK",这时候,发送方就可以使用DATA命令发送邮件内容了,发送完毕后,服务器依然会返回"250 OK"表示一切顺利.

     连接释放:没有邮件传输时,发送方发送一条QUIT命令,请求关闭连接,服务器正常情况下会返回221的应答,表示接受关闭请求,释放本次连接.

    

POP3协议:

  作用:

    类比SMTP的作用,当接收方计算机与支持POP3协议的邮件服务器建立连接后,把存储在该服务器上的邮件准确无误的下载到收件方的主机.POP3是POP协议的第三个版本,解决了POP服务器上用户阅读了某邮件后即删除该邮件的不足.

  POP3传输的三个阶段:

    连接建立:建立好TCP110端口的连接后,进入身份验证阶段,收件方使用USER和PASS作为用户名和密码提供给服务器,完成身份验证.

    邮件接收:通过身份验证后,进入事务处理阶段,收件方可以发送POP3命令进行相应操作,邮件服务器会接受命令并作出响应.

    连接释放:操作完成,收件方发送QUIT命令,进入更新状态,服务器确认关闭连接,并更新邮件存储区.


 最后在简单介绍一下IMAP协议和MIME协议:

    IMAP,提供了更加全面的功能,允许用户像管理本地文件一样自由地组织自己的邮箱,提供邮件摘要功能使用户可有选择地下载邮件,还提供了邮箱共享的功能

    IMAP4能在三种模式下工作:离线模式、在线模式和断线模式.

    MIME是一种邮件扩展协议,通过对二进制文件进行编码,实现了以普通文本格式邮件传输任意数据的功能

JavaMail发送邮件  

  华丽的分割线之后,终于来到了我真正想写的部分,以前学JavaEE的时候,接触过javaMail发送邮件的功能,那时候对Email协议理解的很浅薄,很多知识点马马虎虎就过去了,看完了计算机网络的电子邮件协议,又回去重新复习了一下JavaMail的相关内容,这里做一个总结:

  使用javaMail需要导入的Jar包:

    1.mail.jar

    2.activation.jar

  javaMail中的核心类:

    Session:

      此session非彼session,这里是javaMail中的一个类,Session类定义了基本的邮件会话,如果你得到了Session,表示你已经和邮件服务器连上了,完成了第一步,连接建立的阶段,它的作用与JDBC的Connection有点相似.

      如何得到Session呢?

       通过查j2ee的文档,可以发现这样两个方法,1.Session.getInstance(Properties prop); 2.Session.getInstance(Properties prop, Authenticator auth);,该方法返回一个Session,但需要两个参数,先来看第一个参数Properties prop,这个参数需要指定两个键值对,第一个是指定服务器主机名,第二个是指定是否需要认证,可以这样得到:   

Properties prop = new Properties();
prop.setProperty(“mail.host”, “smtp.qq.com”);//设置服务器主机名
prop.setProperty(“mail.smtp.auth”, “true”);//设置需要认证

      第二个参数Authenticator是一个接口表示认证器,即校验客户端的身份。我们需要自己来实现这个接口,实现这个接口需要使用账户和密码。

    MimeMessage:

      是抽象类Message的实现类,表示一个邮件对象,可以调用它的set*()方法,设置发件人,收件人,主题,正文等等...

    InternetAddress:

       是抽象类Address的实现类,是一个邮件地址类,用来设置邮件的发件地址,收件地址,等.如Address address=new InternetAddress("839564994@qq.com");

    Transport:

      这个类实现了发送消息的协议,即SMTP,在发送消息时,使用该类的一个抽象方法send(Message msg);方法是多样的。当然,也可由Session获得相应协议对应的Transport实例。并通过传递用户名、密码、邮件服务器主机名等参数建立与邮件服务器的连接,并使用sendMessage()方法将信息发送,最后关闭连接.

  代码实现: 

     下面通过代码实现发送邮件的过程:

/**
* 第一种方式
* 使用Session.getInstance(Properties prop);
* @throws Exception
*/
@Test
public void sendMail1() throws Exception{
Properties prop=new Properties();
//指定一个默认的邮件服务器的主机名
prop.setProperty("mail.host", "smtp.163.com");
//设置smtp服务器需要进行验证
prop.setProperty("mail.smtp.auth", "true");
//指定一个默认的消息访问协议,Session的getTransport()返回实现此协议的Transport对象
prop.setProperty("mail.transport.protocol", "smtp");
//1.获取连接
Session session=Session.getInstance(prop);
//2.通过Session得到Transport对象,
Transport ts=session.getTransport();
//如果不设置上面的prop的第三个键值对,可以使用下面这种方式
//Transport ts=session.getTransport("smtp"); //3.登录邮件服务器,使用你的用户名和密码
ts.connect("smtp.163.com", "邮箱用户名", "密码"); //4.创建邮件内容Message
MimeMessage msg=new MimeMessage(session);
//设置发件人邮箱
msg.setFrom(new InternetAddress("15764233178@163.com"));
//指明收件人邮箱
msg.setRecipient(RecipientType.TO, new InternetAddress("839564994@qq.com"));
//指定邮件的标题
msg.setSubject("第一封简单邮件");
//邮件的文本内容
msg.setContent("你好啊!", "text/html;charset=UTF-8"); //发送
ts.sendMessage(msg, msg.getAllRecipients());
//关闭连接
ts.close();
}
/**
* 第二种方式
* 使用Session.getInstance(Properties prop, Authenticator auth);
*/
@Test
public void sendMail2() throws Exception{ /**
* 1.得到session
*/ // Properties是Session的属性对象,用于封装针对SMTP的一些常用属性
Properties props=new Properties();
//设置smtp服务器地址
props.setProperty("mail.host", "smtp.163.com");
//设置SMTP服务器是否需要用户认证,默认为false,设为true
props.setProperty("mail.smtp.auth", "true"); Authenticator auth=new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//注意:下面的登录用户名是@前边的内容,如果你的账号是haha@163.com,只需要输入haha
return new PasswordAuthentication("邮箱用户名", "密码");
}
}; Session session = Session.getInstance(props,auth);
/**
* 2.创建MimeMessage
*/
MimeMessage msg=new MimeMessage(session); //设置发件人
msg.setFrom(new InternetAddress("15764233178@163.com"));
//设置收件人
msg.setRecipients(RecipientType.TO,"839564994@qq.com");
//设置抄送
msg.setRecipients(RecipientType.CC,"2296634789@qq.com");
//设置主题
msg.setSubject("第二封简单邮件");
//设置内容
msg.setContent("我是邮件","text/html;charset=utf-8"); /**
* 3.发送
*/
Transport.send(msg); }

  以上只能完成文本的发送,如果想要发送图片,视频等多媒体的内容的话,就要考虑使用附件的方式.

  当发送包含附件的邮件时,邮件体就为多部件的形式.上面在发送文本时,setContent()方法直接设置了正文内容.发送带附件的邮件时,就需要设置正文内容为MimeMultiPart.

  MimeMultiPart是一个部件的集合类,那么什么是部件呢?就是MimeBodyPart.他们之间的关系是这样:

    

  发送附件的具体代码,也很简单,这里以附件是一张图片为例,只需要把上面代码中:

    //设置内容
msg.setContent("我是邮件","text/html;charset=utf-8");

修改成下面这样既可:

        MimeMultipart list=new MimeMultipart();

        //创建第一个MimebodtPart,为正文
MimeBodyPart part1=new MimeBodyPart();
part1.setContent("这是一封包含附件的垃圾邮箱","text/html;charset=utf-8"); list.addBodyPart(part1); //创建第二个MimebodtPart,为附件
MimeBodyPart part2=new MimeBodyPart();
//设置附件内容
part2.attachFile(new File("e:/照片/me.jpg"));
//设置显示的文件名 解决乱码问题
part2.setFileName(MimeUtility.encodeText("哎哟,不错哦.jpg"));
list.addBodyPart(part2); msg.setContent(list);

javaMail的相关知识点,这篇博文,讲得也很详细,可以参考一下:http://www.cnblogs.com/xdp-gacl/p/4216311.html

应用层之E-mail服务及javaMail邮件发送的知识总结的更多相关文章

  1. JavaMail邮件发送不成功的那些坑人情况及分析说明

    [我的Segmentfault原文]https://segmentfault.com/a/1190000008030346 前言   JavaMail的使用本身并不难,网上有不少案例,简单易懂,而且有 ...

  2. javamail邮件发送例子

    public class EmailTask{        // Session used by the javamail classes    private Session session;   ...

  3. Spring的javaMail邮件发送(带附件)

    项目中经常用到邮件功能,在这里简单的做一下笔记,方便日后温习. 首先需要在配置文件jdbc.properties添加: #------------ Mail ------------ mail.smt ...

  4. javamail邮件发送

    // 发送邮件 public static void send(String toEmail, String content) { Session session = getSession(); tr ...

  5. javaMail 邮件发送和接收示例,支持正文图片、html、附件(转)

    转自:https://blog.csdn.net/star_fly4/article/details/52037587 一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文 ...

  6. JavaMail 邮件发送

    jar包部署 /** * 通过SMTP进行邮件集成 */ public class CmpSendMail { // 邮件发送服务器主机 private final static String HOS ...

  7. 利用System.Net.Mail和多线程实现邮件发送

    对于邮件发送,一般来说,程序会响应超过1秒,这样对于用户体验来说,让用户等待的时间过长,而且发送的邮件越多时间就越长,所以这里我利用了线程的来处理邮件发送这种耗时的工作,废话不多说,直接上代码 pri ...

  8. java使用javax.mail进行免费的邮件发送

    1. 建议发送方使用阿里云邮箱https://mail.aliyun.com/,阿里云默认是开启个人邮箱pop3.smtp协议的,所以无需在阿里云邮箱里设置,pop3.smtp的密码默认邮箱登录密码, ...

  9. (转)JavaMail邮件发送-发送一个文本邮件和一些问题说明

    需要下载的JAR包: JavaMail:http://www.oracle.com/technetwork/java/javamail/index.html JAF:http://www.oracle ...

随机推荐

  1. 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...

  2. C#学习资源

    # 视频 C#程序设计 Cousera(推荐) # 文档 C#教程 MSDN Microsoft API 和参考目录

  3. iOS二维码生成、识别、扫描等

    二维码扫描 前言: 最近的项目中使用到了二维码,二维码这个模块功能也完成:觉得还是有必要总结一下用来做记录.好长时间没有写二维码了都忘记在差不多了,重新拾起来还是挻快的. 二维码使用场景: 生活中有很 ...

  4. Android笔记——Button点击事件几种写法

    Button点击事件:大概可以分为以下几种: 匿名内部类 定义内部类,实现OnClickListener接口 定义的构造方法 用Activity实现OnClickListener接口 指定Button ...

  5. lua 学习笔记(1)

    一.lua函数赋值与函数调用         在lua中函数名也是作为一种变量出现的,即函数和所有其他值一样都是匿名的,当要使用某个函数时,需要将该函数赋值给一个变量,这样在函数块的其他地方就可以通过 ...

  6. AFNetworking 3.0 源码解读(六)之 AFHTTPSessionManager

    AFHTTPSessionManager相对来说比较好理解,代码也比较短.但却是我们平时可能使用最多的类. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilit ...

  7. 【从零开始学BPM,Day3】自定义表单开发

    [课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第三天课程] 1.课程概要 Step 1 软件下载:H3 BP ...

  8. RTP与RTCP协议介绍(转载)

    RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制,同步.RTP中没有连接的概念,本身并不能为按序传输数据包提供可靠的保证,也不提供流量控制和拥塞控制,这些都由RTCP来负责完 ...

  9. NYOJ 998

    这道题是欧拉函数的使用,这里简要介绍下欧拉函数. 欧拉函数定义为:对于正整数n,欧拉函数是指不超过n且与n互质的正整数的个数. 欧拉函数的性质:1.设n = p1a1p2a2p3a3p4a4...pk ...

  10. Centos、Ubuntu 安装 Mono、Jexus

    Mono是.NET的跨平台实现 在众多关于语言的争论中,.NET一直被以不能跨平台而诟病,Mono改变了这一现状. 有人当心Mono会涉及版权啥的问题.高深的偶不懂,不过我觉得Unity3D都能用,为 ...