邮件系统结构设计.docx
- 文档编号:30073993
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:19
- 大小:68.44KB
邮件系统结构设计.docx
《邮件系统结构设计.docx》由会员分享,可在线阅读,更多相关《邮件系统结构设计.docx(19页珍藏版)》请在冰豆网上搜索。
邮件系统结构设计
网络邮件系统
电子邮件作为Internet最为广泛的应用之一,在人们的工作和生活中扮演着重要的角色,应用的普及使电子邮件技术有了飞速的发展。
网络电子邮件系统在当今的互联网上比比皆是,不管是windows上的普及,还linux上的稳定可靠和低廉;不管是分布式系统,还是基于P2P,都离不开邮件系统的基本原理。
邮件传输原理
在Internet上将一段文本信息从一台计算机传送到另一台计算机上,可通过两种协议来完成,即SMTP(SimpleMailTransferProtocol,简单邮件传输协议)和POP3(PostOfficeProtocol,邮局协议3)。
SMTP是Internet协议集中的邮件标准。
在Internet上能够接收电子邮件的服务器都有SMTP。
电子邮件在发送前,发件方的SMTP服务器与接收方的SMTP服务器联系,确认接收方准备好了,则开始邮件传递;若没有准备好,发送服务器便会等待,并在一段时间后继续与接收方邮件服务器联系。
这种方式在Internet上称为“存储——转发”方式。
POP3可允许E-mail客户向某一SMTP服务器发送电子邮件,另外,也可以接收来自SMTP服务器的电子邮件。
换句话说,电子邮件在客户PC机与服务提供商之间的传递是通过P0P3来完成的,而电子邮件在Internet上的传递则是通过SMTP来实现。
如图所示:
注:
服务器A是发送邮件服务器(SMTP),服务器B是接收邮件服务器(POP3/IMAP)
1.电子邮件的发送和接收
电子邮件在Internet上发送和接收的原理可以很形象地用我们日常生活中邮寄包裹来形容:
当我们要寄一个包裹的时候,我们首先要找到任何一个有这项业务的邮局,在填写完收件人姓名、地址等等之后包裹就寄出而到了收件人所在地的邮局,那么对方取包裹的时候就必须去这个邮局才能取出。
同样的,当我们发送电子邮件的时候,这封邮件是由邮件发送服务器(任何一个都可以)发出,并根据收信人的地址判断对方的邮件接收服务器而将这封信发送到该服务器上,收信人要收取邮件也只能访问这个服务器才能够完成。
2.电子邮件地址的构成
电子邮件地址的格式是“USER@SERVER.COM”,由三部分组成。
第一部分“USER”代表用户信箱的帐号,对于同一个邮件接收服务器来说,这个帐号必须是唯一的;第二部分“@”是分隔符;第三部分“SERVER.COM”是用户信箱的邮件接收服务器域名,用以标志其所在的位置。
3.电子邮件的工作原理
电子邮件与普通邮件有类似的地方,发信者注明收件人的姓名与地址(即邮件地址),发送方服务器把邮件传到收件方服务器,收件方服务器再把邮件发到收件人的邮箱中。
更进一步的解释涉及到以下几个概念:
MUA--MailUserAgent,邮件用户代理,帮助用户读写邮件;
MTA--MailTransportAgent,邮件传输代理,负责把邮件由一个服务器传到另一个服务器或邮件投递代理;
MDA--MailDeliveryAgent,邮件投递代理,把邮件放到用户的邮箱里。
整个邮件传输过程如下:
目前使用的SMTP协议是存储转发协议,意味着它允许邮件通过一系列的服务器发送到最终目的地。
服务器在一个队列中存储到达的邮件,等待发送到下一个目的地。
下一个目的地可以是本地用户,或者是另一个邮件服务器。
如果下游的服务器暂时不可用,MTA就暂时在队列中保存信件,并在以后尝试发送。
关于邮件系统的其他一些技术,我们暂且不考虑。
如下所示:
邮件服务器提供了邮件系统的基本结构,包括邮件传输、邮件分发、邮件存储等功能,以确保邮件能够发送到Internet网络中的任意地方。
目前邮件服务器有两种不同的应用群体:
ISP提供商和企事业单位。
Web邮件技术,使邮件用户可以在任何地方使用浏览器登录邮件服务器收发邮件,而不用配置邮件客户端程序。
多域邮件服务是一台物理服务器为多个独立注册Internet域名的企业或单位提供电子邮件的服务,在逻辑上,这些企业和单位拥有自己独立的邮件服务器(企业邮局),也可以称为虚拟邮件服务器技术。
对于ISP提供商和企业集团公司来说,多域邮件服务器的支持能力是选择邮件服务器的一个重要考虑因素。
它可以方便地扩展其横向邮件服务能力。
使用Linux作为邮件服务器,可以与Sendmail、MySQL等开源软件共同使用,在满足用户需求的基础上降低了系统价格。
邮件服务器的安全防护,包括数据身份认证、传输加密、垃圾邮件过滤、邮件病毒过滤、安全审计等的多项安全技术。
身份认证主要指SMTP发信认证,此项功能对于邮件服务器是一个可选功能,主要目的是防止黑客利用自己的服务器攻击其他邮件服务器。
完善SMTP身份认证不仅可以制止黑客的恶劣行为,同时可以保证自己的邮件服务器的各种资源可以充分地应用到日常的邮件处理过程中,不会造成服务器的系统崩溃和资源浪费。
无论是POP3协议还是SMTP协议,由于其在设计之初的缺陷,全部使用明码进行消息的传递,因此很容易造成信息的泄漏。
可以通过两种方式提高系统的安全性:
链路加密和端对端加密。
链路加密是使用加密工具(软硬件工具)对传输的线路进行数据加密,需要网络设施的支持。
端对端加密是邮件客户端到邮件客户端的加密,是邮件服务器应当提供的功能,目前较为流行的方式是使用SSL/TLS进行传输加密。
垃圾邮件大多是一些带有商业性质的广告等宣传品。
据估计,仅仅商业性垃圾邮件一项,每封垃圾邮件所抵消的生产力成本就在1美元左右。
单是下载垃圾邮件所花费的上网费与电话费,每年就要花掉全球网民94亿美元。
此外,许多病毒以及身份证和信用卡盗用案例也与垃圾邮件有关。
因此,需要邮件服务器具有垃圾邮件处理的功能,抵御大部分垃圾邮件的攻击。
黑客攻击和病毒本来是两个相对独立的技术体系,但是随着网络的不断发展,网络工具与病毒越来越趋于融合,比如尼姆达病毒既是病毒,也是网络攻击的一种方式,而应用广泛的电子邮件,也成了病毒传播的主要方式之一。
目前,大多数邮件服务器都具有了基本的病毒防护的能力。
目前的邮件服务器,仅中文就有若干字符集,如GB-2312、Big5等等,虽然我们可以统一标准,但是,在实际的过程中,我们不可能统一所有的邮件客户端,因此我们只能要求邮件服务器支持多语言的环境。
由于目前许多邮件服务器处于电信托管等方式(服务器托管、服务器租用),不可能经常进行本地操作,因此目前邮件服务器均提供了远程邮件监控的功能。
可以通过Web方式,监控邮件服务器的工作状态,包括在线用户数、邮件处理数量和速度、存储空间使用率等,并且可以随时对出现的发信高峰和网络攻击进行远程处理。
电子邮件系统应该具备无限的扩展能力,Internet网络的一个特性是变化无常,需要应对随时而来的应用尖峰。
因此,需要电子邮件系统具有无限的可扩展能力,这个能力主要体现在邮件的处理能力和邮件的存储能力上。
为了能够使邮件的处理能力可以无限扩展,就需要引入集群和负载均衡技术,使应用平台可以在需要的时候无限扩充,满足长期或临时的业务需要。
对于2000万以上的邮件用户来说,每天发送的邮件量至少在几千万封,为了便于邮件存储,需要高性能的邮件存储解决方案,最为理想的应该是SAN技术在邮件服务器领域的应用。
常见邮件协议:
SMTP(SimpleMailTransferProtocol):
SMTP主要负责底层的邮件系统如何将邮件从一台机器传至另外一台机器。
POP(PostOfficeProtocol):
目前的版本为POP3,POP3是把邮件从电子邮箱中传输到本地计算机的协议。
IMAP(InternetMessageAccessProtocol):
目前的版本为IMAP4,是POP3的一种替代协议,提供了邮件检索和邮件处理的新功能,这样用户可以完全不必下载邮件正文就可以看到邮件的标题摘要,从邮件客户端软件就可以对服务器上的邮件和文件夹目录等进行操作。
IMAP协议增强了电子邮件的灵活性,同时也减少了垃圾邮件对本地系统的直接危害,同时相对节省了用户察看电子邮件的时间。
除此之外,IMAP协议可以记忆用户在脱机状态下对邮件的操作(例如移动邮件,删除邮件等)在下一次打开网络连接的时候会自动执行。
本系统主要从简单的邮件客户端来探讨一个邮件系统。
利用JavaMail来实现。
以下是关于JavaMail的一些基本知识:
JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。
它是Sun发布的用来处理email的API。
它可以方便地执行一些常用的邮件传输。
我们可以基于JavaMail开发出类似于MicrosoftOutlook的应用程序。
虽然JavaMail是Sun的API之一,但它目前还没有被加在标准的java开发工具包中(JavaDevelopmentKit),这就意味着你在使用前必须另外下载JavaMail文件。
除此以外,你还需要有Sun的JavaBeansActivationFramework(JAF)。
JavaBeansActivationFramework的运行很复杂,在这里简单的说就是JavaMail的运行必须得依赖于它的支持。
在Windows2000下使用需要指定这些文件的路径,在其它的操作系统上也类似。
JavaMail是可选包,因此如果需要使用的话你需要首先从下载。
目前最新版本是JavaMail1.4,使用JavaMail的时候需要JavabeanActivationFramework的支持,因此你也需要下载JAF。
安装JavaMail只是需要把他们加入到CLASSPATH中去,如果你不想修改CLASSPATH的话,可以直接把他们的jar包直接copy到JAVA_HOME/lib/ext下。
这样JavaMail就安装好了。
JavaMail包中用于处理电子邮件的核心类是:
Session,Message,Address,Authenticator,Transport,Store,Folder等。
Session定义了一个基本的邮件会话,它需要从Properties中读取类似于邮件服务器,用户名和密码等信息。
Javax.mail.Session:
Session类定义了一个基本邮件会话(session),是JavaMailAPI最高层入口类。
所有其它类都是经由这个session才得以生效。
Session对象用Java.util.Properties对象获取信息,如邮件服务器、用户名、密码及整个应用程序中共享的其它信息。
Javax.mail.Message:
一旦获得Session对象,就可以继续创建要发送的消息。
这由Message类来完成。
因为Message是个抽象类,必需用一个子类,多数情况下为Javax.mail.internet.MimeMessage。
MimeMessage是个能理解MIME类型和头的电子邮件消息,正如不同RFC中所定义的。
虽然在某些头部域非ASCII字符也能被译码,但Message头只能被限制为用US-ASCII字符。
Javax.mail.Address:
一旦您创建了Session和Message,并将内容填入消息后,就可以用Address确定信件地址了。
和Message一样,Address也是个抽象类。
您用的是Javax.mail.internet.InternetAddress类。
Javax.mail.Authenticator:
与J类一样,JavaMailAPI也可以利用Authenticator通过用户名和密码访问受保护的资源。
对于JavaMailAPI来说,这些资源就是邮件服务器。
JavaMailAuthenticator在Javax.mail包中,而且它和J中同名的类Authenticator不同。
两者并不共享同一个Authenticator,因为JavaMailAPI用于Java1.1,它没有J类别。
要使用Authenticator,先创建一个抽象类的子类,并从getPasswordAuthentication()方法中返回PasswordAuthentication实例。
创建完成后,您必需向session注册Authenticator。
然后,在需要认证的时候,就会通知Authenticator。
您可以弹出窗口,也可以从配置文件中(虽然没有加密是不安全的)读取用户名和密码,将它们作为PasswordAuthentication对象返回给调用程序。
Javax.mail.Transport:
消息发送的最后一部分是使用Transport类。
这个类用协议指定的语言发送消息(通常是SMTP)。
它是抽象类,它的工作方式与Session有些类似。
仅调用静态send()方法,就能使用类的缺省版本:
Transport.send(message);或者,读者也可以从针对自己的协议的会话中获得一个特定的实例,传递用户名和密码(如果不必要就不传),发送消息,然后关闭连接。
Javax.mail.Store:
Store类实现特定邮件协议上的读、写、监视、查找等操作。
通过Javax.mail.Store类可以访问Javax.mail.Folder类。
Javax.mail.Folder:
Folder类用于分级组织邮件,并提供照Javax.mail.Message格式访问email的能力。
具体用法大家可以查看JavaMailAPI。
简单示例:
packagefss.base;
importjava.util.*;
importjavax.mail.*;
importjavax.mail.internet.*;
importjava.util.Date;
importjavax.activation.*;
importjava.io.*;
publicclassMail
{
//把本程序所用变量进行定义。
具体在main中对它们赋植。
privateMimeMessagemimeMsg;//MIME邮件对象
privateSessionsession;//邮件会话对象
privatePropertiesprops;//系统属性
privatebooleanneedAuth=false;//smtp是否需要认证
privateStringusername="";//smtp认证用户名和密码
privateStringpassword="";
privateMultipartmp;//Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成//MimeMessage对象
publicMail(Stringsmtp)
{
setSmtpHost(smtp);
createMimeMessage();
}
publicvoidsetSmtpHost(StringhostName)
{
System.out.println("设置系统属性:
mail.smtp.host="+hostName);
if(props==null)
props=System.getProperties();//获得系统属性对象
props.put("mail.smtp.host",hostName);//设置SMTP主机
}
publicbooleancreateMimeMessage()
{
try{
System.out.println("准备获取邮件会话对象!
");
session=Session.getDefaultInstance(props,null);//获得邮件会话对象
}
catch(Exceptione)
{
System.err.println("获取邮件会话对象时发生错误!
"+e);
returnfalse;
}
System.out.println("准备创建MIME邮件对象!
");
try{
mimeMsg=newMimeMessage(session);//创建MIME邮件对象
mp=newMimeMultipart();//mp一个multipart对象
//Multipartisacontainerthatholdsmultiplebodyparts.
returntrue;
}
catch(Exceptione)
{
System.err.println("创建MIME邮件对象失败!
"+e);
returnfalse;
}
}
publicvoidsetNeedAuth(booleanneed){
System.out.println("设置smtp身份认证:
mail.smtp.auth="+need);
if(props==null)
props=System.getProperties();
if(need){
props.put("mail.smtp.auth","true");
}else{
props.put("mail.smtp.auth","false");
}
}
publicvoidsetNamePass(Stringname,Stringpass)
{
System.out.println("程序得到用户名与密码");
username=name;
password=pass;
}
publicbooleansetSubject(StringmailSubject){
System.out.println("设置邮件主题!
");
try{
mimeMsg.setSubject(mailSubject);
returntrue;
}
catch(Exceptione){
System.err.println("设置邮件主题发生错误!
");
returnfalse;
}
}
publicbooleansetBody(StringmailBody)
{
try
{
System.out.println("设置邮件体格式");
BodyPartbp=newMimeBodyPart();
bp.setContent(
"
+mailBody,"text/html;charset=GB2312");
mp.addBodyPart(bp);
returntrue;
}
catch(Exceptione)
{
System.err.println("设置邮件正文时发生错误!
"+e);
returnfalse;
}
}
publicbooleanaddFileAffix(Stringfilename){
System.out.println("增加邮件附件:
"+filename);
try{
BodyPartbp=newMimeBodyPart();
FileDataSourcefileds=newFileDataSource(filename);
bp.setDataHandler(newDataHandler(fileds));
bp.setFileName(fileds.getName());
mp.addBodyPart(bp);
returntrue;
}
catch(Exceptione){
System.err.println("增加邮件附件:
"+filename+"发生错误!
"+e);
returnfalse;
}
}
publicbooleansetFrom(Stringfrom){
System.out.println("设置发信人!
");
try{
mimeMsg.setFrom(newInternetAddress(from));//设置发信人
returntrue;
}
catch(Exceptione)
{
returnfalse;
}
}
publicbooleansetTo(Stringto)
{
System.out.println("设置收信人");
if(to==null)
returnfalse;
try
{
mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress
.parse(to));
returntrue;
}
catch(Exceptione)
{
returnfalse;
}
}
publicbooleansetCopyTo(Stringcopyto)
{
System.out.println("发送附件到");
if(copyto==null)
returnfalse;
try{
mimeMsg.setRecipients(Message.RecipientType.CC,
(Address[])InternetAddress.parse(copyto));
returntrue;
}
catch(Exceptione)
{
returnfalse;
}
}
publicbooleansendout()
{
try
{
mimeMsg.setContent(mp);
mimeMsg.saveChanges();
System.out.println("正在发送邮件....");
SessionmailSession=Session.getInstance(props,null);
Transporttransport=mailSession.getTransport("smtp");//?
?
?
transport.connect((String)props.get("mail.smtp.host"),username,
password);
transport.sendMessage(mimeMsg,mimeMsg
.getRecipients(Message.RecipientType.TO));
//transport.send(mimeMsg);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 邮件系统 结构设计