关于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. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  2. Atitit 项目语言的选择 java c#.net  php??

    Atitit 项目语言的选择 java c#.net  php?? 1.1. 编程语言与技术,应该使用开放式的目前流行的语言趋势1 1.2. 从个人职业生涯考虑,java优先1 1.3. 从项目实际来 ...

  3. C++中的const

    一,C++中const的基本知识 1.C++中const的基本概念 1.const是定义常量的关键字,表示只读,不可以修改. 2.const在定义常量的时候必须要初始化,否则报错,因为常量无法修改,只 ...

  4. ASP.NET MVC开发日常一:SessionID合理清除

    在MVC Web开发中临时存储数据一般会用到Session,Cookie,ViewBag,ViewData,TempData.每个的使用场景是不同,具体区别有空再补上. Session数据最敏感,最需 ...

  5. 七牛云:ckeditor JS SDK 结合 C#实现多图片上传。

    成功了,搞了2天.分享一下经验. 首先是把官方的那个例子下载下来,然后照如下的方式修改. 其中tempValue是一个全局变量. function savetoqiniu() { var upload ...

  6. 解构C#游戏框架uFrame兼谈游戏架构设计

    1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...

  7. await and async

    Most people have already heard about the new “async” and “await” functionality coming in Visual Stud ...

  8. windows下 安装 rabbitMQ 及操作常用命令

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rab ...

  9. Android 死锁和重入锁

    死锁的定义: 1.一般的死锁 一般的死锁是指多个线程的执行必须同时拥有多个资源,由于不同的线程需要的资源被不同的线程占用,最终导致僵持的状态,这就是一般死锁的定义. package com.cxt.t ...

  10. iOS 原生地图地理编码与反地理编码

    当我们要在App实现功能:输入地名,编码为经纬度,实现导航功能. 那么,我需要用到原生地图中的地理编码功能,而在Core Location中主要包含了定位.地理编码(包括反编码)功能. 在文件中导入 ...