简单电子邮件客户端的设计与实现
目录
题 目: 简单电子邮件客户端的设计与实现… 1
一、 设计背景… 1
二、 设计内容及目的… 1
三、 设计环境… 2
四、 预备知识… 2
五、 设计思路… 6
六、 设计演示… 11
七、 具体代码… 20
八、 总结… 29
一、设计背景
电子邮件的应用非常广泛,是最重要的 Internet 服务之一,在我们日常工作 学习中扮演中重要角色。在网络社交中,经常使用邮件的方式来发送我们的信息。 某些时候,我们需要邮件“自动”发出:例如找回密码的时候,密码会发送到你 的安全邮箱中,例如游戏付费**的时候,会以邮箱的形式给你发送**码进行 **,再比如,当你的信用卡消费的时候,你绑定的服务邮箱就会收到账单提醒 邮件。本次课程设计将简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件 服务器发送邮件以及接收邮件
二、设计内容及目的
本次课程设计的主要任务是设计并实现一个简单的电子邮件客户端的设计 与实现,能完成电子邮件的收取,发送并撰写新邮件等功能。 本次课程设计的主要目的是熟悉 SMTP 和 POP3 协议的工作原理,掌握网络 编程方法。 通过本次课程设计可以编写程序代码生成一封带内嵌附件又带图片的复杂 邮件以及编写 java 邮件发送程序发送邮件。
三、设计环境
(一)计算机及操作系统:PC 机,Windows10
(二)语言:Java
(三)开发环境准备
- 提前在 qq 和 sohu 上注册一个免费的账号;
- 获取 smtp 和 pop3 服务器的名称;
- 获取 smtp 和 pop3 服务器授权码;
四、预备知识
(一)邮件服务器
在网上,要提供电子邮件功能,就必须有专门的电子邮件服务器。常见的提供邮 件服务器的网站有 qq/搜狐/新浪/163 等,这些都是面向公众的免费的电子邮件服 务器。
我们的邮件的收发,都是依靠邮件服务器来的。电子邮件的发送与接收类似于现 实中的寄信流程,寄信人把新给当地的邮局 A,当地的邮局通过运输,将信件寄 到收信人所在的地方,由收信人所在地的邮局 B 接收,然后由邮递员送给收件 人,这其实和我们发送电子邮件一样,先是发件人通过新浪的邮件服务器发送邮 件,如果收件人搜狐邮件服务器的,那么新浪邮件服务器将邮件发送给搜狐邮件 服务器,然后搜狐邮件服务器接收之后再给收件人。
1. 电子邮件主要提供以下功能:
(1) 接受用户投递的邮件;
(2) 将用户投递进来的邮件转发给目标邮件服务器;
(3) 接收其它邮件服务器转发来的邮件并把邮件存储到其管理的用户邮件中;
(4) 为前来读取邮件的用户提供读取服务;
2. 邮件服务器可以划分为两种类型:
(1) SMTP 服务器 SMTP 服务器用于替用户发送和接收外面发送给本地用户的邮件,它相当于我们 现实生活中的邮局的邮件接收部门(可以接收普通用户要投出的邮件和其它邮局 投递进来的邮件)。
(2) POP3/IMAP 服务器 POP3/IMAP 邮件服务器用于帮助用户读取 SMIP 服务器接收进来的该用户的邮 件,它相当于专门为前来取包裹的用户提供服务的部门。
(二)电子邮箱
每个电子邮件服务器之上都可以开设多个电子邮件,电子邮件也称之为 Email 地址,它类似现实生活中的通讯地址,用户可以通过这个地址接受别人发 来的电子邮件和向别人发送电子邮件。电子邮箱是用户在邮件服务器上申请的一 个账户。邮件服务器把接受到的邮件保存到为某个账户分配的邮箱空间中,用户 通过其申请的用户名和密码登录到邮件服务器上查收该地址已经收到的电子邮件。
(三)邮件客户端软件
邮件客户端软件负责与邮件服务器通讯,主要用于帮助用户将邮件发送给 SMTP 服务器从 POP3/IMAP 邮件服务器读取用户的电子邮件。邮件客户端软件通常集 邮件撰写、发送和接收功能于一体。
(四)邮件传输协议
协议就分为 SMTP 与 POP3/IMAP 协议,前者是用于收发邮件的协议,后者是用于 读取 SMTP 服务器中的邮件的协议。
-
SMTP 协议(简单邮件传输协议)
它定义了邮件客户端软件与 SMTP 服务器之间、以及两台 SMTP 服务器之间的 通讯规则。 -
POP3 协议(邮局协议)
它定义了邮件客户端软件与 POP3 服务器的通讯规则。 -
IMAP 协议(Internet 消息访问协议)
它是对 POP3 协议的一种扩展,定义了邮件客户端软件与 IMAP 服务器的通讯 规则
(五)Java Mail
JavaMail 是 Sun 公司为方便 Java 开发人员在应用程序中实现邮件发送和接收功 能而提供的一套标准开发包,它支持一些常用的邮件协议,如 SMTP、POP3、IMAP。 开发人员使用 JavaMail API 编写邮件处理软件时,需考虑邮件协议的底层实施 细节,只要调用 JavaMail 开发包中的 API 类就可以了。JavaMail 也提供了能够 创建出各种复杂 MIME 格式的邮件内容相关的 API。 JavaMail API 按其功能划分通常可分为如下三大类:
定义和收集会话信息的 API:Session 类
创建和解析邮件内容的 API:Message 类
发送邮件的 API:Transport 类
接收邮件的 API:Store 类
五、设计思路
(一)创建邮件
JavaMail API 使用 javax.mail.Message 类来表示一封邮件,Message 类是一个 抽象类,所以我们需要使用其子类 javax.mail.internet.MimeMessage 类来创建 Message 类 的 实 例 对 象 , 如 果 我 们 创 建 的 是 一 个 简 单 文 本 邮 件 , 那 么 MimeMessage 类就可以满足我们的需求了,但是如果需要创建一封包含内嵌资 源或者是带附件的复杂邮件,则需要使用到 JavaMail API 中的 MimeMessage、 javax.mail.internet.MimeBodyPart 和 javax.mail.internet.MimeMultipart 等类。
- MimeMessage 类表示整封邮件
- MimeBodyPart 类表示邮件的一个 MIME 消息
- MimeMultipart 类表示一个由多个 MIME 消息组合成的组合 MIME 消息
我们用下面所示的这种组合关系来创建一封带有附件,并且正文中带有内嵌 资源的邮件。
(二)发送邮件
-
从 Session 对象中获得实现了某种邮件发送协议的 Transport 对象;
-
使用 Session 对象创建 Message 对象,并调用 Message 对象的方法封装邮件 数据;
-
连接指定的 SMTP 服务器,调用 Transport 对象中的邮件发送方法 Message 对象中封装的邮件数据。
(三)接收邮件
- 从 Session 对象中获得实现了某种邮件发送协议的 Store 对象;
- 登录邮箱,连接上 POP3 或者 IMAP4 服务器;
- 调用 Store 的 getFolder 方法,获取邮箱中的某个邮件夹的 Folder 对象;
- 调用 Folder 对象中的 getMessage 或 getMessages 方法,获取邮件夹中的某一 封邮件或者是所有邮件,每一封的邮件以一个 Message 对象返回。
(四)发送与接收邮件总设计
- [email protected] 邮箱通过 smtp 协议连接到 Smtp 服务器,然后发送一封 邮件给腾讯的邮件服务器。
- 腾讯分析发现需要去搜狐的邮件服务器,通过 smtp 协议将邮件转投给搜狐 的 Smtp 服务器。
- 搜狐将接收到的邮件存储在搜狐的存储空间中。
- 搜狐邮箱通过 Pop3 协议连接到 Pop3 服务器收取邮件。
- Pop3 服务器将取出来的邮件送到 [email protected] 邮箱中。
六、设计演示
(一)发送简单纯文本邮件
1. 执行结果
2. 查看搜狐邮箱
(二)发送一封复杂的邮件
1. 生成一封既带图片又带附件的邮件
2. 查看生成邮件
3. 发送一封既带图片又带附件的邮件
4. 执行结果
5. 查看搜狐邮箱
(三)查看邮件
1. 执行结果
可以看到控制台输出的是邮件的原始内容,还未被解析,所以需要经过解析 才能阅读。
七、具体代码
(一)发送简单文本邮件
【我放个截图吧==不是wps会员 pdf转不成word了】
(二)生成复杂邮件
(三)发送复杂邮件
(四)查看邮件
八.总结
Javamail 邮件开发是学习 Java 语言后收获颇多的一个项目,在着手开始之 前,查阅了许多资料,尤其是是张孝祥老师的《java 邮件开发》给我带来很深的 感悟。有时觉得编程这件事情,很多时候就是听起来一个功能的实现好像很难, 但当你着手去实现,去研究他的实现过程的时候就会发现其实也没有想象中那么 难。
发送邮箱一般需要通过 SMTP 服务器,SMTP 相当于我们邮局会帮助我们把 邮件送到,新手使用邮箱进行测试必须将邮箱开通 SMTP/POP3,获取授权码, 这个授权码是在第三方客户端进行登陆会用到。
在初步发送一封简单文本邮件时出现了问题,qq 邮箱与搜狐邮箱并不能双 向进行邮件发送与接收,发现代码没有问题,双方的 SMPT/POP 都开了授权且 发送方的授权码正确,而后请教老师和同学并发现 jar 包出现了问题以及没有对 项目及时进行缓存。对出现的问题一一进行处理,在课程设计的最后,出现了一 个令我措手不及的问题,频繁使用第三方软件发送邮件,被搜狐的服务器进行暂 时拉黑,再次搜集资料请教同学,代码突然就可以执行了。
总的来说,这次的课程设计学到很多东西,javamail 中不同类的使用及方法, 提高了编程思维能力,同时学会思考问题,提出解决代码问题方案