邮件原理与JavaMail开发

 这两天学习的邮件原理和JavaMail开发。学习了才知道,原来邮件还可以这样发。

如图,我自己用自己的邮箱给自己发的邮件,但是没有发件人,什么都没有,但是邮件却有的。

 

一、首先学习邮件原理需要了解一些基础的知识。

SMTP协议

1.用户连上邮件服务器后,要想给它发送一封电子邮件,需要遵循一定的通迅规则,SMTP协议就是用于定义这种通讯规则的。

2.因而,通常我们也把处理用户smtp请求(邮件发送请求)的邮件服务器称之为SMTP服务器。(25)

附加:(SMTPSimple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCPIP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把Email寄到收信人的服务器上了,整个过程只要几分钟。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.获取smtppop3服务器的名称

 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  退出

以下是发送成功的代码,我用sohusina发送的邮件:

 

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头字段用于指定邮件阅读程序处理数据内容的方式,有inlineattachment两种标准方式,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,它的实例对象代表一封电子邮件。

②发送邮件的APITransport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,如SMTP协议。

③接收邮件的APIStore类是接收邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,如POP3协议。

Session

Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session对象根据这些信息构建用于邮件收发的TransportStore对象,以及为客户端创建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));

这段的话,会出现中文的乱码。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值