`
icyheart
  • 浏览: 766642 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

邮件传输原理及相关入门知识概述

阅读更多
在讨论email服务器以前,理解电子邮件的工作机制是非常重要的。在通常的情况下,一封电子邮件的发送需要经过用户代理,传输代理和投递代理等三个程序的参与。 

当用户发送一封电子邮件时,他并不能直接将信件发送到对方邮件地址指定的服务器上,而是必须首先试图去寻找一个信件传输代理,把邮件提交给它;信件传输代理得到了邮件后,首先将它保存在自身的缓冲队列中,然后,根据邮件的目标地址,信件传输代理程序查询到应对这个目标地址负责的邮件传输代理服务器,并且通过网络将邮件传送给它。对方的服务器接收到邮件之后,将其缓冲存储在本地,直到电子邮件的接收者察看自己的电子信箱。显然,邮件传输是从服务器到服务器的,而且每个用户必须拥有服务器上存储信息的空间(称为信箱)才能接受邮件。(发送邮件不受这个限制)。 

而投递代理则从信件传输代理取得信件传送至最终用户的邮箱。显然,最终用户只能看到用户投递代理。常见的投递代理包括procmail等。 

用户代理接受用户输入的各种指令,将用户的邮件传送至信件传输代理或者通过pop、Imap将信件从传输代理服务器处取到本机上。常见的用户代理有“foxmail”,“outlook express”等邮件客户程序。 

可以看到,一个邮件传输代理的主要工作是监视用户代理的请求,根据电子邮件的目标地址找出对应的邮件服务器,将信件在服务器之间传输并且将接收到的邮件缓冲或者提交给最终投递程序。 

有许多的程序可以作为信件传输代理,包括qmail、sendmail、postfix等等。 

无论什么产品,它们必须支持同样的规范,如传输信件的报文格式,监听的端口等等。一般来说,系统管理员并不需要了解信件传输的命令标准,用户代理会生成正确的命令。但是,了解一些相关信息是重要的。 

信件传输代理默认监听25号端口接受请求,当接受用户的请求时,它不需要了解用户的真实身份,或者说不需要身份验证。因此用户不需要提交用户口令就可以发出电子邮件,这意味着任何用户都可以冒充成另外一个用户发出假的电子邮件,这是电子邮件原始设计时导致的一个特点,无法消除。(关于这一点目前有一点说明。许多基于UNIX的系统运行indentd,可以记录客户机器上的用户的登录名字。不过,这个功能实际上用处不大,毕竟大部分人不会用UNIX/Linux作为他的个人机器)。 

当邮件服务器程序得到一封待发送的邮件时,它首先需要根据目标地址确定将信件投递给哪一个服务器,这是通过DNS服务实现的。例如,有一封邮件的目标地址是someone@yahoo.com,那么,sendmail首先确定这个地址是用户名(someone)+机器名(yahoo.com)的格式,然后,通过查询DNS来确定需要把信件投递给某个服务器。 

DNS数据中,与电子邮件相关的是MX记录,这可以在查询DNS时设置查询类型为mx来得到: 

[wanghy@mail ~]$ nslookup 

Default Server: www.linuxaid.com.cn 

Address: 202.99.11.120 

>set q=mx 

>yahoo.com 

Server: www.linuxaid.com.cn 

Address: 202.99.11.120 

Non-authoritative answer: 

yahoo.com preference = 0, mail exchanger = mx1.mail.yahoo.com 

yahoo.com preference = 1, mail exchanger = mx2.mail.yahoo.com 

mx1.mail.yahoo.com internet address = 128.11.68.225 

mx2.mail.yahoo.com internet address = 128.11.68.217 

显然,在DNS中说明yahoo.com有两个信件交换(MX)服务器,于是,sendmail试图将邮件发送给两者之一。一般来说,排在前面的的MX服务器的优先级别比较高,因此服务器将试图连接mx1.mail.yahoo.com的25端口,试图将信件报文转发给它。如果成功,你的smtp服务器的任务就完成了,在这以后的任务,将由mx1.mail.yahoo.com来完成。在一般的情况下,mx交换器会自动把信件内容转交给目标主机,不过,也存在这样的情况,目标主机(比如yahoo.com)可能并不存在,或者不执行smtp服务,而是由其mx交换器来执行信件的管理,这时候,最终的信件将保存在mx机器上,直到用户来察看它。 

可以简单地在DNS记录中用MX关键字设置信件交换,例如,在我们的设置中: 

$TTL 3600 
@ IN SOA linuxaid.com.cn. webmaster.linuxaid.com.cn. ( 
2001050902 ;Serial 
10800 ;Refresh after 3 hours 
3600 ;Retry hourly 
604800 ;Expire after 1 week 
10800 ;Time to live 
) 
IN NS ns.linuxaid.com.cn. 
IN A 202.99.11.120 
IN MX 10 mx.linuxaid.com.cn. 
IN MX 20 mx1.linuxaid.com.cn. 
ns IN A 202.99.11.120 
www IN A 202.99.11.120 
mx IN A 202.99.11.120 
mx1 IN A 202.99.11.121 
sales IN MX 10 sales-mail.linuxaid.com.cn. 

这里面定义了二个MX记录,MX记录的规则是“[机器名/域名] IN MX [优先级] [服务器]”。优先级是一个整数,数值越小优先级越高。第一个IN MX 10 mx.linuxaid.com.cn.,因为没有机器名,使用来自named.conf的缺省后缀,就是linuxaid.com.cn,这就是让所有some@linuxaid.com.cn的信件传送到mx.linuxaid.com.cn。IN MX 20 mx1.linuxaid.com.cn.的概念差不多,只是其优先数为20,也就是说只有当mx.linuxaid.com.cn拒绝接受(比如服务器忙或者当机)的时候,信件才会投递到mx1.linuxaid.com.cn。“sales IN MX 10 sales-mail.linuxaid.com.cn.”定义凡是someone@sales.linuxaid.com.cn的信件要发送到sales-mail.linuxaid.com.cn。 

MX记录可以使得整个子域内的用户使用同样的邮件主机和传输代理。另外如果你的主机暂时宕机了,那么信件可以暂时存储在你的信件交换主机上,直到你自己的机器恢复为止。比如说,mail.yourdomain.com是一台smtp主机,而mx2.yourdomain.com是另外一个smtp主机,你希望在mail.yourdomain.com正常的时候直接由其自身收发邮件,而万一mail崩溃,mx2为它暂时存储一段时间的邮件直到mail恢复正常工作-这是常见的设置,那么,你需要把mail以比较高的优先数设置成自己的信件交换主机,而mx2作为一个优先数较低的信件交换主机,也就是,在你的DNS配置文件中,应该这样配置: 

IN MX 0 mail 
IN MX 10 mx2 

如果DNS查询无法找出对某个地址的MX记录(通常因为对方没有信件交换主机),那么sendmail将是试图直接与对方的主机(来自邮件地址)对话并且发送邮件。例如,test@www.linuxaid.com.cn在DNS中没有对应的MX记录,因此sendmail在确定MX交换器失败后,将从DNS取得邮件地址服务器部分内容对应的IP地址,并直接和其通信来发送邮件。 

 

分享到:
评论

相关推荐

    asp.net知识库

    Microsoft .NET策略及框架概述 卸载Class? Web Form 窗体 如何实现web页面的提示保存功能 在ASP.Net中两种利用CSS实现多界面的方法 如何在客户端调用服务端代码 页面一postback,它就显示页面的最顶端,怎样让它定位...

    UNIX操作系统教程 张红光

    第1章绪论.1 1.1操作系统概述1 1.1.1建立操作系统的目标1 1.1.2操作系统是用户与计算机的接口1 1.1.3操作系统是资源管理器2 1.2UNIX系统的主要特性3 1.3UNIX系统的发展史4 1.4开源软件与UNIX的推广发展6 1.4.1开源...

    PHP和MySQL WEB开发(第4版)

    11.1 Web数据库架构的工作原理 11.2 从Web查询数据库的基本步骤 11.2.1 检查与过滤用户输入数据 11.2.2 建立一个连接 11.2.3 选择使用的数据库 11.2.4 查询数据库 11.2.5 检索查询结果 11.2.6 从数据库断开连接 ...

    PHP和MySQL Web开发第4版pdf以及源码

    4.1 创建一个示例应用程序:智能表单邮件 4.2 字符串的格式化 4.2.1 字符串的整理:chop()、ltrim()和trim() 4.2.2 格式化字符串以便显示 4.2.3 格式化字符串以便存储:addslashes()和stripslashes() 4.3 用...

    PHP和MySQL Web开发第4版

    4.1 创建一个示例应用程序:智能表单邮件 4.2 字符串的格式化 4.2.1 字符串的整理:chop()、ltrim()和trim() 4.2.2 格式化字符串以便显示 4.2.3 格式化字符串以便存储:addslashes()和stripslashes() 4.3 用...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据...

Global site tag (gtag.js) - Google Analytics