`
tigers20010
  • 浏览: 48601 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

2009-12-18传智播客——邮件原理与java mail开发 (传载)

阅读更多

 

如果大家对文章内容有不理解的地方,尽情留言或QQ(1357208561) 讨论。让大家共同进步。

                                                                                                                                                                                                                                                                                               ————tigers20010

 

 

 

 

 

 

 

今日是JAVAWEB最后一课,JAVAMAIL。E-mail在当今的日常生活中已经成为人们重要的通信方式之一,在WEB应用中E -mail被做为与用户通信的最重要方式。如今各大综合性网站都有提供自己的mail服务,企业或各其他专业性网站也有自己的内部mail服务器,天于为工作交流与合作。所以,学习E-mail技术是十分重要的!



         一、邮件传输协议:    

有使用过桌面邮件客户端的人都知道,关联一个邮件帐户,需要设置它的SMTP邮件发送服务器和POP3邮件接收服务器。



         SMTP和POP3协议到底是什么?(老方的图片):
[img][/img] 
        



1.        实线部分(lisi@sina.com向wangwu@sohu.com发送邮件):

使用邮件客户端(这里使用的是OutLook,也可以是网页邮件客户端或其他邮件客户端),使用SMTP协议向sina的邮件服务器发送邮件,服务器检测收件人的邮箱地址是sohu的邮件服务。所以,通过SMTP协议转发给sohu服务器,sohu服务器将邮件存储到存储设备中。

2.        wangwu@sohu.com,登陆邮件客户端。通过pop3协议,从POP3服务器接收自己帐户的邮件。POP3从邮件服务器中读取邮件发送给客户端。

3.        虚线部分(wangwu@sohu.com向lisi@sina.com发送邮件)

过程与上边的相同。



         二、使用windwos的控制台发送邮件(SMTP协议):

1.注册一个邮件帐户,比如:test@gmail.com。

2.在运行中输入“cmd”打开控制台程序。

3.输入:telnet smtp.google.com 25,回车。使用windows的telnet程序连接gmail的邮件发送服务器,SMTP的默认端口为25。

4.输入:auth login,回车。登陆。

5.输入:(test)用户名,必须是经过Base64编码后的文本。

6.输入:密码,必须是经过Base64编码后的文本。

7.输入:mail from:<test@gmail.com>,回车。邮件开自,这里是自己给自己发邮件,也可以是其他邮件。

8.输入:rcpt to:<test@gmail.com>,回车。邮件发送到。

9.输入:Data,回车。接下来要输入邮件内容。

10.输入:邮件内容,回车。

11.输入:.,回车。(空行中的点,代表内容结束)

12.输入:quit,回车。退出!

Ok,邮件发送成功!



三、使用windows控制台接收邮件(POP3协议):

         1.在运行中输入“cmd”打开控制台程序。

         2.输入:telnet pop3.gmail.com 110,回车。使用windows的telnet程序连接gmail的邮件接收服务器,POP3的默认端口为110。

         3.输入:user test,回车。这里的用户名不需要Base64编码。

         4.输入:pass密码,回车。这里的密码不需要Base64编码。

         5.输入:stat,回车。显示邮箱的状态:邮件的数量和总大小。

         6.输入:list,回车。索引列出各邮件,显示邮件的索引和大小。

         7输入:retr index,回车。这是最重要的一条命令,显示批定索引的邮件。

         8.输入:quit,回车。退出!

         OK,邮件接收成功!



         四、创建邮件RFC822文档:

n          RFC32文档规定了如何编写一封简单的邮件:

n          邮件头和邮件体,两者使用空行分隔。

n          邮件头:

u        From字段,此处可以随便填写,比如发送冒充邮件。也有一些邮件服务器为此进行了检查。

u        To字段

u        Subject字段,标题。

u        Cc、bcc字段,抄送和密送。

n          邮件体:邮件内容



上边的这些内容可以加在Data输入之前,进行设置。这样邮件就可以看到标题来自、以及抄送等内容。



Windows的OutLook邮件客户端,只能接收使用RFC822规范创建的邮件,否则查询邮件各项参数和内容都为空。





         五、创建邮件的MIME协议:

         1.MIME协议是对RFC822文档的升级和补充,它描述了如何生成一封复杂邮件。通常我们把MIME协议描述的邮件称之为MIME邮件,MIME协议描述的数据称之为MIME消息。



2.对于一封复杂邮件,如果包含了多个不同的数据,MIME协议规定了要使用容器对多段数据进行分隔,并使用Content-Type头字段对数据的类型、以及多个数据之间的关系进行描述。(查看outlook邮件源文件)



         MIME协议十分经典,WEB应用中使用的文件上传正是此协议!



         六、协议中的字段

1. Content-type字段:

数据类型 video:

以“主类型/子类型”的形式出现,主类型有text、image、audio、video、application、multipart、message等,分别表示文本、图片、音频、视频、应用程序、组合结构、消息等。每个主类型下面都有多个子类型,例如text主类型包含plain、html、xml、css等子类型。

数据的关系:

multipart/mixed、multipart/related、multipart/alternative



         2. Content-Disposition头字段:

Content-Disposition头字段用于指定邮件阅读程序处理数据内容的方式,有inline和attachment两种标准方式,inline表示直接处理,而attachment表示当作附件处理。如果将Content-Disposition设置为attachment,在其后还可以指定filename属性,如下所示:
         Content-Disposition: attachment; filename=“1.bmp”
上面的MIME头字段表示MIME消息体的内容为邮件附件,附件名“1.bmp”。



3.Content-ID头字段

Content-ID头字段用于为“multipart/related”组合消息中的内嵌资源指定一个唯一标识号,在HTML格式的正文中可以使用这个唯一标识号来引用该内嵌资源。例如,假设将一个表示内嵌图片的MIME消息的Content-ID头字段设置为如下形式:
         Content-ID: it315logo_gif
那么,在HTML正文中就需要使用如下HTML语句来引用该图片资源:
         <img src="cid:it315logo_gif">
注意,在引用Content-ID头字段标识的内嵌资源时,要在资源的唯一标识号前面加上“cid:”,以说明要采用唯一标识号对资源进行引用。



         七、发送最复杂邮件的程序

下面,我们来看一个发送最复杂的邮件程序(发送:文本内容、图片、附件):

import java.util.Properties;

import javax.activation.*;

import javax.mail.*;

import javax.mail.Message.RecipientType;

import javax.mail.internet.*;



public class MySmtp {



    public static void main(String[] args) throws Exception {     

       String host = "smtp.google.com";

       String from = "test@gmail.com";

       String username = "test";

       String password = "123456";

       // 设置邮件的参数,根据参数生成会话。

       Properties prop = new Properties();

       prop.setProperty("mail.host", host);

       prop.setProperty("mail.transport.protocol", "smtp");

       prop.setProperty("mail.smtp.auth", "true");

       Session session = Session.getDefaultInstance(prop);

       session.setDebug(true);

       // 获取邮件内容

       MimeMessage message = getMessage(from, from);

       // 连接服务器,发送邮件

       Transport ts = session.getTransport();

       ts.connect(username, password);

       ts.sendMessage(message, message.getAllRecipients());

       ts.close();      

      

    }

   

    // 此方法生成邮件的内容

    private static MimeMessage getMessage(String from, String recipient) throws Exception{

       MimeMessage message = new MimeMessage(Session

              .getDefaultInstance(new Properties()));

       message.setFrom(new InternetAddress(from));

       message.setRecipient(RecipientType.TO, new InternetAddress(

              recipient));

       message.setSubject("把这功能学会了,就能发世界上最难的邮件!");

      

       // 邮件中的文本内容

       MimeBodyPart mbpText = new MimeBodyPart();

       mbpText.setContent("我是邮件的内容,可以显示图片哦!<img src='cdi:test.jpg'>", "text/html;charset=UTF-8");

      

       // 邮件中的图片

       MimeBodyPart mbpImage = new MimeBodyPart();

       DataHandler dhImage = new DataHandler(new FileDataSource("C:/test.jpg"));

       mbpImage.setDataHandler(dhImage);

       mbpImage.setContentID("test.jpg");

      

       // 邮件中的附件

       MimeBodyPart mbpAttmen = new MimeBodyPart();

       DataHandler dhAttmen = new DataHandler(new FileDataSource("C:/test.txt"));

       mbpAttmen.setDataHandler(dhAttmen);

       // 邮件中在文本内容和附件路径会出现中文乱码,所以使用MimeUtility进行编码。

        mbpAttmen.setFileName(MimeUtility.encodeText(dhAttmen.getName()));

      

       // 将图片与文本内容放到一个单元里

       MimeMultipart mm1 = new MimeMultipart();

       mm1.addBodyPart(mbpText);

       mm1.addBodyPart(mbpImage);

       // 描述正文和图片的关系

       mm1.setSubType("related");

       // 返回需要将附加与文本和图片添加到一个单元里。

       // MimeMultipart不能添加MimeMultipart,但可以添加MimeBodyPart。

       MimeBodyPart text_img = new MimeBodyPart();

       text_img.setContent(mm1);

      

       // 将文本、图片与附件添加到一个单元里

       MimeMultipart mm2 = new MimeMultipart();

       mm2.addBodyPart(mbpAttmen);

       mm2.addBodyPart(text_img);

       mm2.setSubType("mixed");

      

       // 将内容添加到message中

       message.setContent(mm2);

       message.saveChanges();  

       return message;

    }

}




         参照上面的代码,来看一下相关API的关系图(老方的):



l          MimeMessage类表示整封邮件。

l          MimeBodyPart类表示邮件的一个MIME消息。

l          MimeMultipart类表示由多个MIME消息组合成的一个组合MIME消息。



六、三大功能类

JavaMail API按其功能划分通常可分为如下三大类:

l          创建和解析邮件内容:Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。

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

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

l          Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息支持。



Ok了!今天下午的时候终于抽出点时间大家一起合个影。今天也是方老师最后一天的课程,大家都十分喜欢他,祝他身体健康,工作愉快!

 

分享到:
评论

相关推荐

    传智播客——D盘全部教程下载目录

    - **学习内容**:掌握Java网络编程的基本原理和技术,了解Applet的应用场景和开发流程。 #### 3. Java IO流 - **资源**:《JAVA视频教程02_IO》 - **学习内容**:深入学习Java中的输入输出流技术,包括文件读写、...

    传智播客张孝祥java邮件开发_Java邮件开发源代码_16(完)

    张孝祥老师的课程“传智播客张孝祥java邮件开发”旨在教授如何利用Java进行邮件的发送和处理。在这个16节的完整课程中,你将深入学习Java Mail API以及相关的技术细节。 首先,我们来了解一下Java Mail API。...

    传智播客_张孝祥_Java邮件开发教程

    根据提供的文件信息,我们可以深入探讨有关“传智播客_张孝祥_Java邮件开发教程”的相关知识点。这里将重点介绍Java邮件开发的基础概念、应用场景以及实现方式。 ### Java邮件开发简介 Java邮件开发主要是利用Java...

    传智播客JAVA全套种子共20G

    《传智播客_贪吃蛇游戏开发java培训_视频教程》317M 《传智播客_王泽佑_JNI教程》173M 《传智播客_张孝祥_javascript教程》1.12G 《传智播客_张孝祥_java高级视频》797M 《传智播客_张孝祥_java基础教程》1.6G ...

    传智播客——JPA学习笔记

    传智播客——JPA学习笔记 网络上有一份pdf格式的《JPA学习笔记》,但是内容排版有点乱,而且有缺失的部分,小弟从原来的blog处拷贝出来,并加以排版,制作成了chm格式的,大家应该知道chm格式比较适合作为参考资料或...

    04_传智播客张孝祥java邮件开发_邮件协议总结与邮件服务器的工作原理

    Java邮件开发是一个重要的技术领域,尤其对于需要进行自动化通信或者数据传输的应用来说。在这个主题中,我们将深入探讨邮件协议的总结以及邮件服务器的工作原理。首先,让我们从基础开始,了解电子邮件系统的核心...

    传智播客张孝祥java邮件开发__在Web应用中增加邮件发送功能_14

    传智播客张孝祥java邮件开发\01_传智播客张孝祥java邮件开发_程价值与目标介绍

    WPF基础视频教程(第三季)-传智播客 杨中科

    WPF基础视频教程(第三季)-传智播客 杨中科 WPF基础视频教程(第三季)-传智播客 杨中科

    传智播客张孝祥java邮件开发_Java邮件开发源代码.rar

    总的来说,"传智播客张孝祥java邮件开发_Java邮件开发源代码"涵盖了JavaMail API的基本用法和高级特性,是学习和提升Java邮件开发技能的一个宝贵资源。通过研究这些源代码,开发者不仅可以了解如何发送邮件,还能...

    java基础课件(传智播客)

    java基础课件 源于传智播客 广泛传播

    传智播客张孝祥java邮件开发_Java邮件开发源代码

    这个资源“传智播客张孝祥java邮件开发_Java邮件开发源代码”显然是一份关于如何使用Java进行邮件发送的教程或课程材料,由知名教育机构传智播客的讲师张孝祥提供。下面我们将详细探讨Java邮件开发的相关知识点。 1...

    2017年-传智播客-张志君老师-SpringBoot视频教程

    2017年-传智播客-张志君老师-SpringBoot视频教程 网上找了好久才找到的

    传智播客Java培训毕向东Java基础pdf

    "传智播客Java培训毕向东Java基础pdf"是一份专为初学者设计的教程,旨在帮助学习者系统地掌握Java编程基础知识。这份教程可能由知名教育机构传智播客的讲师毕向东编写或授课,旨在提供高质量的教学资源。 Java的...

    传智播客精品就业班JAVA种子

    《传智播客_贪吃蛇游戏开发java培训_视频教程》317M 《传智播客_王泽佑_JNI教程》173M 《传智播客_张孝祥_javascript教程》1.12G 《传智播客_张孝祥_java高级视频》797M 《传智播客_张孝祥_java基础教程》1.6G ...

    《Java 基础入门(传智播客)》_高清中文版pdf 网盘链接

    根据提供的文件信息,我们可以推断出这是一本关于Java编程语言的基础入门教程,由传智播客出版。虽然具体的PDF内容未给出,但从标题、描述和部分可见内容来看,本书主要面向初学者,旨在帮助他们掌握Java编程的基本...

    传智播客-黑马32期Java视频

    【标题】"传智播客-黑马32期Java视频" 涉及的知识点主要集中在Java编程语言的学习上,这是由传智播客教育机构推出的系列教程,旨在帮助学员掌握Java开发技能。传智播客是知名的IT教育品牌,其“黑马程序员”系列课程...

    javaWeb传智播客网上书城项目源码(设计以及实现论文).zip

    javaWeb传智播客网上书城项目源码(设计以及实现论文).zipjavaWeb传智播客网上书城项目源码(设计以及实现论文).zipjavaWeb传智播客网上书城项目源码(设计以及实现论文).zipjavaWeb传智播客网上书城项目源码(设计以及...

    Java 基础入门(传智播客出品).pdf

    Java 基础入门,适合初学入门java的同学

    传智播客张孝祥java邮件开发_Java邮件开发源代码ppt

    在本课程中,传智播客的张孝祥讲师将深入讲解Java邮件开发的相关技术,包括使用JavaMail API和其他相关库来实现邮件功能。 JavaMail API是Java平台上的一个标准API,它提供了邮件处理的各种接口和类,包括创建、...

Global site tag (gtag.js) - Google Analytics