这两天学习的邮件原理和JavaMail开发。学习了才知道,原来邮件还可以这样发。
如图,我自己用自己的邮箱给自己发的邮件,但是没有发件人,什么都没有,但是邮件却有的。
一、首先学习邮件原理需要了解一些基础的知识。
SMTP协议
1.用户连上邮件服务器后,要想给它发送一封电子邮件,需要遵循一定的通迅规则,SMTP协议就是用于定义这种通讯规则的。
2.因而,通常我们也把处理用户smtp请求(邮件发送请求)的邮件服务器称之为SMTP服务器。(25)
附加:(SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
)
POP3协议
1.同样,用户若想从邮件服务器管理的电子邮箱中接收一封电子邮件的话,他连上邮件服务器后,也需要遵循一定的通迅格式,POP3协议用于定义这种通讯格式。
2.因而,通常我们也把处理用户pop3请求(邮件接收请求)的邮件服务器称之为POP3服务器。(110)
附加:(POP3(Post Office Protocol 3) POP适用于C/S结构的脱机模型的电子邮件协议,目前已发展到第三版,称POP3。它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。)
二、电子邮件的传输过程
(如图,为电子邮件传输的过程。
其中 为@sina向@sohu传送的邮件。------ 虚线为@sohu向@sina回复的邮件)
三、发送邮件的前提
1.需要在两个网站上各注册一个账号。
(例如:新浪和搜狐o0100@sohu.com o0100n@sina.cn)
2.获取smtp和pop3服务器的名称
sina
smtp.sina.com smtp服务器
pop.sina.com pop3服务器
sohu
smtp.sohu.com smtp服务器
pop3.sohu.com pop3服务器
3.编写base64编码程序对用户名和密码进行编码。
注意:base64是一种加密的编码程序,因为标准的base64编码不适合直接诶放在URL里,所以需要转换一下。
四、手工使用SMTP协议发送电子邮件
运行cmd命令,输入如下代码:
telnet smtp.sina.com
ehlo 主机名
auth login //经过base64编码后的用户名和密码
mail from:<o0100@sohu.com>
rcpt to:<o0100@sina.cn>
Data 在此写要发送的内容
“ . ” 点号代表邮件内容的结束
Quit 退出
以下是发送成功的代码,我用sohu向sina发送的邮件:
220 smtp.sohu.com ESMTP ready
ehlo fly
250-smtp.sohu.com
250-AUTH PLAIN LOGIN
250 STARTTLS
auth login
334 VXNlcm5hbWU6
经过base64翻译的用户名
334 UGFzc3dvcmQ6
经过base64翻译的密码
235 2.0.0 OK
…
根据如上代码,到最后就是发送一篇只有内容的邮件。
而RFC822文档规定发送邮件的格式:
ehlo 主机名
auth login 登录命令
mail from:发件者的邮件
rcpt to: 接受者邮件
data
from:发件者的邮件
to:接受者邮件
subject:主题
//空行
正文
五、 创建邮件—— MIME协议
1.MIME协议是对RFC822文档的升级和补充,它描述了如何生成一封复杂邮件。通常我们把MIME协议描述的邮件称之为MIME邮件,MIME协议描述的数据称之为MIME消息。
2.对于一封复杂邮件,如果包含了多个不同的数据,MIME协议规定了要使用分隔线对多段数据进行分隔,并使用Content-Type头字段对数据的类型、以及多个数据之间的关系进行描述。
六、MIME协议常用头字段
1.Content-Disposition头字段
Content-Disposition头字段用于指定邮件阅读程序处理数据内容的方式,有inline和attachment两种标准方式,inline表示直接处理,而attachment表示当作附件处理。如果将Content-Disposition设置为attachment,在其后还可以指定filename属性,
如下所示:
Content-Disposition: attachment; filename=“1.bmp”
上面的MIME头字段表示MIME消息体的内容为邮件附件,附件名“1.bmp”
2.Content-ID头字段
Content-ID头字段用于为“multipart/related”组合消息中的内嵌资源指定一个唯一标识号,在HTML格式的正文中可以使用这个唯一标识号来引用该内嵌资源。例如,假设将一个表示内嵌图片的MIME消息的Content-ID头字段设置为如下形式:
Content-ID: it315logo_gif
那么,在HTML正文中就需要使用如下HTML语句来引用该图片资源:
<img src="cid:it315logo_gif">
注意,在引用Content-ID头字段标识的内嵌资源时,要在资源的唯一标识号前面加上“cid:”,以说明要采用唯一标识号对资源进行引用。
六、 如何使用JavaMail API创建邮件
1.查看API类图
MimeMessage类表示整封邮件。
MimeBodyPart类表示邮件的一个MIME消息。
MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。
Javamail API的功能:
创建和解析邮件内容的API :
①Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。
②发送邮件的API:Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,如SMTP协议。
③接收邮件的API:Store类是接收邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,如POP3协议。
Session类
Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息支持。
七、 使用JavaMail发送一封简单的邮件:
package cn.csdn.javamail;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
public class MimeMail {
/** 利用javaMail发送一个简单邮件
* @throws MessagingException
* @throws AddressException
* @throws IOException
* @throws FileNotFoundException
*
*/
public static void main(String[] args) throws AddressException, MessagingException, FileNotFoundException, IOException{
//1、创建邮件
Properties props = new Properties(); //设置属性
//创建session
Session session = Session.getInstance(props);
MimeMessage message = new MimeMessage(session);
//2、设置邮件属性
message.setFrom(new InternetAddress("fly@fly.com"));
message.setRecipient(Message.RecipientType.TO, new InternetAddress("flying@fly.com"));
message.setSubject("。。。");
//3、正文
MimeBodyPart part = new MimeBodyPart();
part.setContent("xxxxxxxxxxxx", "text/html");
// content.setText("xxxxxxxx", "utf-8");
//4、描述关系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(part);
//设置
message.setContent(mm);
message.saveChanges();
message.writeTo(new FileOutputStream("D://1.eml"));
}
}
八、 为带图片的邮件,基本上差不多。
package cn.csdn.javamail;
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;
public class MimeImageMail {
public static void main(String[] args)throws Exception {
//1、创建邮件
MimeMessage message = new MimeMessage(Session.getInstance(new Properties()));
//2、设置邮件属性
message.setFrom(new InternetAddress("fly@fly.com"));
message.setRecipient(Message.RecipientType.TO, new InternetAddress("flying@fly.com"));
message.setSubject("给你发送一张图片..");
//3、创建正文
MimeBodyPart text = new MimeBodyPart();
text.setContent("你好,这是我发送的图片!!!******<br/><br/><img src='cid:xx.jpg'>xxxxxxxx", "text/html;charset=gb2312");
//4、创建一个图片
MimeBodyPart image = new MimeBodyPart();
image.setDataHandler(new DataHandler(new FileDataSource("src//f.jpg")));
image.setContentID("xx.jpg");
//创建描述关系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
//设置关系
mm.setSubType("related");
message.setContent(mm);
message.saveChanges();
message.writeTo(new FileOutputStream("D://2.eml"));
}
}
九、 是带附件的邮件
import java.io.FileInputStream;
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;
public class AttchMime {
public static void main(String[] args)throws Exception {
//1、创建邮件
MimeMessage message = new MimeMessage(Session.getInstance(new Properties()));
//2、设置邮件属性
message.setFrom(new InternetAddress("fly@fly.com"));
message.setRecipient(Message.RecipientType.TO, new InternetAddress("flying@fly.com"));
message.setSubject("给你发送一张图片..");
MimeBodyPart text= new MimeBodyPart();
text.setContent("你好,这是我发送的图片!!!******<br/><br/><img src='cid:xx.jpg'>xxxxxxxx", "text/html;charset=gb2312");
//编码可以是gb2312,也可以是utf-8
MimeBodyPart attch= new MimeBodyPart();
attch.setDataHandler(new DataHandler(new FileDataSource("src//1.mp3")));
attch.setFileName("1.mp3");
//4、描述关系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(attch);
mm.setSubType("mixed");
message.setContent(mm);
message.saveChanges();
message.writeTo(new FileOutputStream("d://3.eml"));
}
}
十、 创建世界上最发杂的邮件!!即为把以上三种都加在邮件里。
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.MessagingException;
import javax.mail.Session;
import javax.mail.internet.AddressException;
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;
/**
*
*
*
* @author 赵方元
*/
public class MailImageAndAttch {
public static void main(String[] args) throws Exception{
MimeMessage message=new MimeMessage(Session.getInstance(new Properties()));
//2、设置邮件的属性
message.setFrom(new InternetAddress("o0100@sina.cn"));
message.setRecipient(Message.RecipientType.TO, new InternetAddress("o0100@sohu.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"));
}
}
如果不加入 String filename = dh1.getName();
attch.setFileName(MimeUtility.encodeText(filename));
这段的话,会出现中文的乱码。