常见电子邮件协议
SMTP (Simple Mail Transfer
Protocol,简单邮件传输协议)
POP(Post Office Protocol,邮局协议)
IMAP(Internet Message Access Protocol,Internet 消息访问协议)
MIME(Multipurpose Internet Mail Extensions,多用途Internet 邮件扩展标准)不是邮件传
输协议,它只定义了需要传输的消息、附件及其他类型数据的格式。
1)SMTP
SMTP(Simple Mail Transfer Protocal)称为简单邮件传输协议,目标是向用户提供高效、可靠
的邮件传输。
SMTP的一个重要特点是它能够在传送中接力传送邮件,即邮件可以通过不同网络上的主机接力式传
送。工作在两种情况下:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个
服务器。 SMTP是个请求/响应协议,它监听25号端口,用于接收用户的邮件请求,并与远端邮件服
务器建立SMTP连接。
2)POP
POP的全称是 Post Office Protocol ,即邮局协议,用于电子邮件的接收,它使用TCP的110端口
,现在常用的是第三版,所以简称为 POP3。
POP3采用Client/Server工作模式。当客户机需要服务时,客户端的软件(Outlook Express或
FoxMail)将与POP3服务器建立TCP连接,此后要经过POP3协议的三种工作状态,首先是认证过程,
确认客户机提供的用户名和密码,在认证通过后便转入处理状态,在此状态下用户可收取自己的邮
件或做邮件的删除,在完成响应的操作后客户机便发出quit命令,此后便进入更新状态,将做删除
标记的邮件从服务器端删除掉。到此为止整个POP过程完成。
3)MIME
MIME的英文全称是"Multipurpose Internet Email Extension" 多功能Internet 邮件扩充服务
,它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器
。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME
类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将MIME
标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。
4)Java Mail体系可以分为三层:
抽象层,Internet邮件实现层,协议实现层
5)Java Mail抽象层:该层定义了用于邮件处理功能的抽象类、接口和抽象方法,所有的邮件系统
都支持这些功能,它独立于供应商和协议消息。抽象层位于Java Mail 顶级包(即javax.mail)内
。
Internet 邮件实现层:该层实现了部分抽象层元素,它遵循Internet 标准―RFC822和MIME。
Internet 邮件实现层所定义的类和接口大多位于javax.mail.internet 包内。
协议实现层:该层由服务提供商实现对特定协议的支持,如SMTP、POP、IMAP 和NNTP。Sun 为开发
者提供了很完备的一组协议的支持。
6)Java Mail主要对象
核心Java Mail API 可以分为两部分,一部分由七个主要对象组成:Session、Message、Address
、Authenticator、Transport、Store 和Folder,利用这些对象可以完成包括发送消息、检索消
息、删除消息、认证、回复消息、转发消息、管理附件、处理基于HTML 文件格式的消息及搜索或
过滤邮件列表等任务
核心Java Mail API 的另一部分的主要接口和类包括Part、Message、Bodypart、Multipart、
MimePart、MimeMessage、MimiBodypart 和MimeMultipart,可以用这些类和接口完成电子邮件的
阅读、撰写等任务。
7)Java Mail API 的中文问题
如果开发者使用setSubject()方法直接设定中文的主题或者使用setText()方法直接指定中文内容
,那么在使用Outlook 等客户端软件查看邮件时客户有可能看到的将是一团乱码。
8)发送附件
发送附件非常像转发消息,程序开发人员需要建立各部分以组成完整消息,完成消息正文后,即开
始添加其他部件,其中每个 DataHandler 都代表附件,而不是转发消息情况下的共享处理程序。
如果从文件中读附件,附件的数据源是 FileDataSource。而如果从 URL 中读时,附件的数据源是
URLDataSource。一旦存在 DataSource,只要先把它传递给 DataHandler 构造器,最后再用
setDataHandler() 把它附加到 BodyPart。假定要保留附件的原始文件名,最终要做的是用
BodyPart 的 setFileName() 方法设置与附件相关的文件名。
9)接收附件
从邮件中获取附件比发送它们要困难,因为 MIME 没有简单的关于附件的概念。当消息包含附件时
,消息的内容是个 Multipart 对象。接着,开发者需要处理每个 Part,获取主要内容和附件。标
有从 part.getDisposition() 获得的 Part.ATTACHMENT 配置(disposition)的部件(Part)
无疑就是附件。但是,没有配置(及一个非文本 MIME 类型)和带 Part.INLINE 配置的部件也可
能是附件。当配置要么是 Part.ATTACHMENT,要么是 Part.INLINE 时,这个消息部件的内容就能
被保存。只要用 getFileName() 和 getInputStream() 就能分别得到原始文件名和输入流。
10)课堂笔记及相关记录
发送邮件
/** smtp手动发送邮件的前提:
*
* 第一个:提前注册免费账号
* mail from:redarmycsdn@sohu.com
* 密码:111111
*
* rcpt to:redarmycsdn@sina.com
* 密码:redarmycsdn
*
* 第二个:获取smtp和pop3服务器的名称
* sina
* smtp.sina.com smtp服务器
* pop.sina.com pop3服务器
* sohu
* smtp.sohu.com smtp服务器
* pop3.sohu.com pop3服务器
*
*编写base64编码程序对用户名和密码进行编码
*sina :redarmycsdn 111111 :cmVkYXJteWNzZG4= MTExMTEx
*sohu :redarmycsdn redarmycsdn:cmVkYXJteWNzZG4= cmVkYXJteWNzZG4=
*
*发送邮件:
* 语法:
*
*/
telnet smtp.sina.com
SMTP协议
ehlo redarmychen主机名
auth login
eWFuZ25pbmc(新浪)=(两次)//经过base64编码后的用户名和密码
mail from:<redarmycsdn@sohu.com>
rcpt to:<redarmycsdn@sina.com>
Data
内容
.号代表邮件内容的结束
quit
在Myclipse中镶嵌代码发送邮件
package cn.csdn.mail;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class SendMailBySocket {
public static void main(String[] args) throws UnknownHostException,
IOException {
//创建Socket对象
Socket sk = new Socket("smtp.sohu.com",25);
//输出流
OutputStream os = sk.getOutputStream();
//输入流 sk.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader
(sk.getInputStream()));
System.out.println(br.readLine());
os.write("ehlo redarmychen/r/n".getBytes());
System.out.println(br.readLine());
System.out.println(br.readLine());
System.out.println(br.readLine());
os.write("auth login/r/n".getBytes());
System.out.println(br.readLine());
os.write("cmVkYXJteWNzZG4=/r/n".getBytes());
System.out.println(br.readLine());
os.write("cmVkYXJteWNzZG4=/r/n".getBytes());
System.out.println(br.readLine());
os.write("mail from:<redarmycsdn@sohu.com>/r/n".getBytes());
System.out.println(br.readLine());
os.write("rcpt to:<redarmycsdn@sina.com>/r/n".getBytes());
System.out.println(br.readLine());
os.write("data/r/n".getBytes());
System.out.println(br.readLine());
os.write("YYYYYYYYYYYxxxxxxxxxxxyyyyyyy/r/n".getBytes());
os.write("./r/n".getBytes());
System.out.println(br.readLine());
os.write("quit/r/n".getBytes());
br.close();
os.close();
sk.close();
}
}
邮件发送,发送世界上最复杂的邮件
package cn.csdn.sendmail;
import java.io.FileOutputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
/*
* 创建世界最复杂的邮件 即有图片又有附近
* */
public class MailImageAndAttch {
public static void main(String[] args)throws Exception {
//1、创建邮件
MimeMessage message = new MimeMessage(Session.getInstance(new
Properties()));
//2、设置邮件的属性
message.setFrom(new InternetAddress("redarmycsdn@sina.com"));
message.setRecipient(Message.RecipientType.TO, new InternetAddress
("xx@sina.com"));
message.setSubject("世界上最复杂的邮件");
//3、设置正文
MimeBodyPart text = new MimeBodyPart();
text.setContent("xxxxxxx<br/><img
src='cid:xx.jpg'><br/>xxxxxx","text/html;charset=gb2312");
//4、设置图片
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("src//f.jpg"));
image.setDataHandler(dh);
image.setContentID("xx.jpg");
//5、设置附件
MimeBodyPart attch = new MimeBodyPart();
DataHandler dh1 = new DataHandler(new FileDataSource("src//大
笑.mp3"));
attch.setDataHandler(dh1);
String filename = dh1.getName();
attch.setFileName(MimeUtility.encodeText(filename));
//描述关系
//图片与正文的描述关系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType("related");
//图片与正文的 bodypart
MimeBodyPart part = new MimeBodyPart();
part.setContent(mm);
//附件与以上的bodypart关系
MimeMultipart m = new MimeMultipart();
m.addBodyPart(part);
m.addBodyPart(attch);
m.setSubType("mixed");
//把MIME消息设置到message中
message.setContent(m);
message.saveChanges();
message.writeTo(new FileOutputStream("d://66.eml"));
}
}