SMTP协议简介
一、协议简介
此协议被用于通过互联网传递邮件信息。依据RFC821标准规范了此协议的所有细节内容。然而仅需掌握以下内容——此协议的基本操作指令和常用方法即可。
协议的基本原理极为简单。其实就是一个客户端计算机向服务器提交指令的过程,并由服务器给出相应的反馈信息。所有参与的数据类型均为字符串类型,在不进行额外配置或软件工具的情况下即可识别和解析这些数据。通过查看WinsockTerminal源代码及其注释部分,我们可以清晰地理解其运行机制。现在让我们利用该示例程序编写并发送一封自定义电子邮件。
运行示例程序代码,并点击"Connect"按钮。
在"Connectto..."对话框中输入你的电子邮件服务器的地地址坐标号。
选择SMTP选项后,
最后点击"Connect"按钮。
如果连接成功,
Winsock控件将触发Connected事件,
状态栏显示连接成功信息。
主窗口将显示来自服务器的回复。
该回复包含一个三位数编码及其描述,
例如:
220-ns.cinfo.ruSendmail8.6.12/8.6.9readyatWed,22Apr199822:54:41+0300
220ESMTPspokenhere
无需过分关注这些描述的内容。由于不同服务器可能有不同的描述方式。你需要只需要了解代码所代表的具体含义即可。当收到代码220时,则表示已经成功建立连接,并且服务器将准备好接收第一个指令。
向服务器传递的第一个命令是HELO.该命令包含一个参数,即你的邮箱名。
HELOoleg
请注意:根据RFC821规定,在此协议中,“HELO”这一指令具有可选性特征。当服务器不需要执行此指令时,“HELO”操作可以选择性地被忽略。
当该命令被执行并获得成功时, 服务器将返回一个状态码为250的响应. 下一步建议使用MAILFROM命令向服务器发送一封邮件. 此命令将采用发信人的电子邮件地址作为参数.
MAILFROM : oleg@vbip.com
完成发出指令后, 当服务器返回一个状态码为250的响应时, 你可以向服务器发送RCPTTO命令. 此指令采用收件人地址作为参数, 其作用即显而易见: 即指示向指定的接收方发送邮件.
RCPTTO : somebody@domain.com
若需将邮件发送给多个收件人,则应分别执行RCPTTO命令。每次运行该命令时,服务器均会输出带有编码250的响应信息。
注
Subject : Myfirste-mailmessage.
Firstlineofamessage.
Secondline.
.
请留意,在最后一条记录的最后一项数据是一个小数点。这标志着正文内容已经结束。可以用VB代码表示为vbLf&"."&vbCrLf.当服务器接收到此标记时,它会立即返回一个状态码为250的信息,并提供该邮件对应的唯一标识符。
250WAA10568Messageacceptedfordelivery
任务已完成,请您随后发送一封新邮件或随后与本机断开连接。若希望随后与同一机器断开联系,请使用QUIT指令。在此情形下,机器将返回状态码221的信息并执行切断操作
二、SMTP协议原始命令码和工作原理
1.SMTP主要处理两种情况:一种是邮件从客户端发送至服务器;另一种是从一台服务器发送给另一台
2.SMTP作为一个请求-应答协议,在传递命令与回应时使用纯文本格式(仅包含ASCII字符),并以换行符(CR)和分节符(LF)分隔。每个回应都包含一个三位数的状态代码
3.SMTP主要监听于TCP协议第25号端口
4.邮件传递流程如下:
a.建立TCP连接
b.客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令
服务器端正希望以OK作为响应,表明准备接收
c.客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行
服务器端则表示是否愿意为收件人接受邮件
d.协商结束,发送邮件,用命令DATA发送
e. 以.表示结束输入内容一起发送出去
f.结束此次发送,用QUIT命令退出。
另外两个命令:
VRFY---用于验证给定的用户邮箱是否存在,以及接收关于该用户的详细信息。
EXPN---用于扩充邮件列表。
6.邮件路由过程:
SMTP服务器主要依据‘域名服务DNS中接收方的域名’来决定邮件的路由路径。依据DNS中的MX记录进行路由配置是SMTP服务器的标准做法。每个MX记录不仅包含了对应的主机地址还指定了哪些邮件地址应当通过其发送。
当SMTP服务器mail.abc.com接收到一封电邮时,请将其内容并将其转发至SH_USER@SH_ABC.COM。
a.Sendmail请求DNS给出主机sh.abc.com的CNAME记录,如有,假若CNAME到shmail.abc.com,则再次
请求shmail.abc.com的CNAME记录,直到没有为止
b.假定被CNAME到shmail.abc.com,然后sendmail请求@abc.com域的DNS给出shmail.abc.com的MX记录,
shmail MX 5 shmail.abc.com
10 shmail2.abc.com
c. Sendmail最后请求DNS给出shmail.abc.com的A记录,即IP地址,若返回值为1.2.3.4
d. Sendmail与1.2.3.4连接,传送这封给shuser@sh.abc.com的信到1.2.3.4这台服务器的SMTP后台程序
7.SMTP基本命令集:
HELLo 命令用于向目标机器表明用户的身份信息。然而,在大多数情况下,目标机器能够识别出这些伪装行为。
Mail初始化邮件发送
8. MAIL FROM命令中指定的地址称为envelope from地址,并不需要与发送者的实际地址一致。
RCPT TO同样用于指定接收方地址称为envelope to地址,并与收件人实际收到的内容无关。
9.为什么没有RCPT CC和RCPT BCC?
所有的收件人协商都通过RCPT TO命令实现,在采用BCC时会删除信封上的接收者信息以达到不可见的效果。
10.邮件被划分为信封部分、信头部分和信体部分
envelope from、envelope to与message from:及message to:之间并无直接关联关系。
evnelope是由服务器主机间通过SMTP后台提供的服务项参数而message from/to是由用户自行定义并使用的选项参数项;其区别不仅在于是否带有冒号符号。
11. 怎样由信封部分检查是否一封信是否是伪造的?
a. received行的关联性。
现在的SMTP邮件传输系统,在信封部分除了两端的内部主机处理的之个,考虑两个公司防火墙之间
的部分,若两台防火墙机器分别为A和B,但接收者检查信封received:行时发现经过了C.则是伪造的。
b. received :行中的主机和IP地址对是否对应如:
Receibed : from galangal.org (turmeric.com [104.128.23.115] by mail .bieberdorf.edu....
c. 被人手动添加在最后面的received行:
Received : from galangal.org ([104.128.23.115]) by mail .bieberdorf.edu (8.8.5)
Received : from lemongrass.org by galangal.org (8.7.3)
Received : from graprao.com by lemongrass.org (8.6.4)
三、SMTP协议通讯模型
属于TCP/IP协议家族的一员
四、SMTP协议的命令和应答
从前面的通讯模型可以看出,在发信方与收信方之间建立会话的方式是发信方发送MAIL命令并指示邮件发送者这一过程得以实现的方式。在通讯链路建立后,在发信方使用发信端口(MAIL)向收信方发出MAIL命令来指示邮件发送者。当收信方接收到该命令时若能够接收邮件则会返回OK应答随后发信方再使用发信端口(RCPT)向收信方发出RCPT命令用于确认邮件是否已收到若已收到则会返回OK应答否则就会返回拒绝接收应答这一过程双方由此反复进行下去直至邮件处理完毕.
NOOP指令指示受信端仅返回确认信息(用于测试用例)。
注:<CRLF>为回车、换行,ASCII码分别为13、10(十进制)。
SMTP协议的每个命令都会返回一个响应码。\n\n这些代码位数都有特定含义。\n\n例如第一个字符是2时表示命令成功;当第一个字符是5时表示失败;而当第一个字符是3时则表示未完成操作。\n\n一些较为复杂的邮件程序利用这一特点。\n\n首先查看响应码的第一位数字,并据此确定后续操作步骤。\n\n下面将SMTP的所有响应代码列于下表:
应答码说明
501参数格式错误
502命令不可实现
503错误的命令序列
504命令参数不可实现
211系统状态或系统帮助响应
214帮助信息
220<domain>服务就绪
221<domain>服务关闭
421<domain>服务未就绪,关闭传输信道
250要求的邮件操作完成
251用户非本地,将转发向<forward-path>
450要求的邮件操作未完成,邮箱不可用
550要求的邮件操作未完成,邮箱不可用
451放弃要求的操作;处理过程中出错
551用户非本地,请尝试<forward-path>
452系统存储不足,要求的操作未执行
552过量的存储分配,要求的操作未执行
553邮箱名不可用,要求的操作未执行
354开始邮件输入,以"."结束
554操作失败
五、SMTP服务对命令流水的扩展
1.摘要
本文详细阐述了一项SMTP服务扩展方案,并且该方案能够帮助确定在单个TCP发送指令中可同时接收的操作数量。在单个TCP发送指令中采用多项操作流程能够显著提升系统运行效能。
2.介绍
尽管SMTP服务已经得到了广泛的使用,并且表现良好,然而其扩展对于提升整体性能至关重要。
在连接过程中可能出现连接异常或缓冲区已满的情况。
当SMTP命令失败发生时,在TCP输入缓冲区清空的操作通常是必要的。
某些情况下会错误地判定操作结果为失效(例如某些服务器在REPTTO上次操作未成功后拒绝接收DATA指令),但也有服务器能在RCPTTO失败后仍接受后续的数据指令。
3. 命令流水扩展框架
它的定义如下:
该服务扩展的名称被定义为流水(PIPELINING);
基于EHLO协议的扩展值设置为PIPELINING;
PIPELINING不再作为EHLO协议的相关参数;
MAILFROM和RCPTTO命令无需附加其他参数;
未添加其他SMTP相关命令;
4.流水服务的扩展
当客户机希望开启基于流水的服务连接时,它会发起EHLO命令向服务器.若 server返回250号码(其中包含PIPELINING反馈)则表示该 server 支持SMTP协议的服务数据传输流水.
4.1.客户使用流水
当客户得知服务器能够处理数据流量时
客户SMTP必须核对与组中相关拥有状态信息。当RCPTTP服务器拒绝接收指定地址时,在此情况下客户端应检测DATA状态。客户端不得假定未发送RCPTTO指令被认为是成功的情况;即使如此也会导致错误的发生。若DATA命令被正确拒绝后,则应发送RSET指令;若DATA命令未被正确拒绝,则应发送一个点(dot)。所有这些操作所产生之状态须与单独执行每条相应指令时的状态保持一致,并且须支持多行(Multiline)响应。客户SMTP可选择在非阻塞模式下运行,在接收到服务器的任何响应后均立即处理后续操作而无需延迟响应处理。如系统不支持非阻塞模式,则需检测TCP窗口大小;该值须大于每条单独指令所需长度。通常窗口大小设置为4KB;若无法进行相应的检测可能导致死锁现象出现。
4.2.服务器对流水的支持
服务器应该提供下面的服务扩展:
在任何情况下不行将TCP输入缓冲区的内容丢弃;
当且仅当接收到一个或多个有效的RCPTTO命令时,才对DATA命令应该主动发出响应;
因为DATA命令没有合法的接收者,结果接收到空信息时,不要再发出消息给任何人(当然对DATA命令还要做一个响应);
对成组的RSET,MAILFROM,SENDFROM,SOMLFROM,SAMLFROM和RCPTTO命令的响应先保存起来,然后一起发送;
不允许缓存对EHLO,DATA,VRFY,EXPN,TURN,QUIT和NOOP的响应;
不允许缓冲不可识别命令的响应;
在本地TCP输入缓冲区为空时必须将据有未发出的响应全部发出;
不允许对未接收到的命令进行猜测;或假设它的存在;
在响应的文本信息中应该表时这是对哪个命令进行的响应;
5.例子
下面是一个不支持流水的SMTP会话:其中S代表服务器,C代表客户端;
S :<等待打开连接>
C :<打开连接>
S :220innosoft.comSMTPserviceready
S :250innosoft.com
C : MAILFROM :
S :250senderOK
C : RCPTTO :
S :250recipientOK
C : RCPTTO :
S :250recipientOK
C : RCPTTO :VC@INNOSOFT.COM>
S :250recipientVC@INNOSOFT.COM>OK
C : DATA
S :354传输邮件内容,并以一个只有”.”的行结束邮件
...
C :.
S :250messagesent
C : QUIT
S : 221goodbye
在上一案例中,客户必须等待服务器九次以获得响应.让我们来分析一下,在支持流水的情况下会发生什么情况:这里S代表服务器端的处理流程,C则表示客户端的操作流程.
S:<等待打开连接>
C :<打开连接>
S : 220innosoft.comSMTPserviceready
S : 250-innosoft.com
S : 250PIPELINING
C : MAILFROM :
C : RCPTTO :
C : RCPTTO :
C : RCPTTO : VC@INNOSOFT.COM>
C : DATA
S : 250senderOK
S : 250recipientOK
S : 250recipientOK
S : 250recipientVC@INNOSOFT.COM>OK
S : 354传输邮件内容,并以一个只有”.”的行结束邮件
...
C :.
C : QUIT
S : 250messagesent
S : 221goodbye
当前等待次数从9次减少至4次。当我们观察到所有接收者都被拒绝的情况时
S:<等待打开连接>
C:<打开连接>
S :220innosoft.comSMTPserviceready
S :250-innosoft.com
S :250PIPELINING
C : MAILFROM :
C : RCPTTO :
C : RCPTTO :
C : DATA
S : 250senderOK
S : 550remotemailtonotallowed
S : 550remotemailtonotallowed
S : 554novalidrecipientsgiven//未给出合法的接收者
C : QUIT
S : 221goodbye
客户端也在等待四次。若服务器在接收DATA命令而未验证接收者的合法性,则会出现以下情况:
S :<等待打开连接>
C :<打开连接>
S :220innosoft.comSMTPserviceready
S :250-innosoft.com
S : 250PIPELINING
C : MAILFROM :
C : RCPTTO :
C : RCPTTO :
C : DATA
S:250senderOK
S:550remotemailtonotallowed
S:550remotemailtonotallowed
S:354传输邮件内容,并以一个只有”.”的行结束邮件
C:.
C : QUIT
S:554novalidrecipients//未给出合法的接收者
S:221goodbye
类ZSMailBox
{
var socketFile;
var stringLog;
}
varstrSMTPServer;
varstrSMTPPort;
varstrFrom;
varstrTo;
该函数初始化相关变量用于邮件发送功能。
该函数初始化了一个名为strLog的字符串变量,并将其设置为空字符串。
此外它还初始化了一个名为SMTPPort的整型变量默认值为25。
另外该函数设置了从地址字段为空以及到地址字段也为空。
这些初始化操作都位于函数体内部使用$this->语法进行赋值操作。
doCommand函数用于接收并执行命令字符串并将响应返回给调用方
具体操作流程如下
其中关键参数包括指令字符串以及预期响应内容
特别注意
returntrue;
}
等待回复函数用于接收来自客户端的数据流。
该函数采用以下步骤完成数据处理:
- 使用fgets方法从指定的网络通道读取512字节的数据内容到变量$strReply变量中;
- 将获取到的数据内容追加至字符串日志记录中,并附加标识符" n";
- 利用正则模式匹配功能检查提供的回复是否与预定义的标准响应模式一致;
- 如果输入数据不符合标准格式,则返回错误标志;
returntrue;
}
函数SendData(strSubject, strContent) {
将变量 str 初始化为字符串格式的"发送至"部分,并将其值连接到当前实例属性this->strTo以及转义字符$\x{CD}\x{A3}。
将变量 str 进一步附加上"来自"字段,并连接转义字符\$\x{CD}\x{A3}。
将变量 str 连接到当前实例属性this->strSubject以及两个转义字符\$\x{CD}\x{A3}。
最后将变量 str 连接到两个转义字符$\x{CD}\x{A3}、一个点号和另一个转义字符$\x{CD}\x{A3}。
}
fputs(this->fpSocket,str);
returntrue;
}
function SendMail(strSubject, strContent) {
if (this->VerifySMTPVariables()) {
this->strLog = "";
} else {
$this->strLog = "Any of SMTP variables are invalid\n";
return false;
}
}
this->fpSocket=fsockopen(this->strSMTPServer,this->strSMTPPort);
if(!this->fpSocket)
{
this->strLog.="Cann'topensocket
n";
returnfalse;
}
this->strLog.="Opensocketsucceed
n";
if(!this->WaitReply("220"))
{
fclose(this->fpSocket);
returnfalse;
}
strCommand="HELO".this->strSMTPServer."n";
if(!this->DoCommand(strCommand,"250"))
{
this->strLog.="HELOerror
n";
fclose(this->fpSocket);
returnfalse;
}
strCommand="MAILFROM:<".this->strTo.">n";
if(!this->DoCommand(strCommand,"250"))
{
this->strLog.="MAILerror
n";
fclose(this->fpSocket);
returnfalse;
}
strCommand="RCPTTO:<".this->strTo.">n";
if(!this->DoCommand(strCommand,"250"))
{
this->strLog.="Refusetoestablishthechannel
n";
fclose(this->fpSocket);
returnfalse;
}
strCommand="DATAn";
if(!this->DoCommand(strCommand,"354"))
{
this->strLog.="Refusetorecievethedata
n";
fclose(this->fpSocket);
returnfalse;
}
if(!this->SendData(strSubject,strContent))
{
this->strLog.="Senddataerror
n";
fclose(this->fpSocket);
returnfalse;
}
if(!this->WaitReply("250"))
{
this->strLog.="Senddataunsuccessful
n";
fclose(this->fpSocket);
returnfalse;
}
strCommand="QUITn";
if(!this->DoCommand(strCommand,"221"))
{
this->strLog.="QUITerror
n";
fclose(this->fpSocket);
returnfalse;
}
fclose($this->fpSocket);
returntrue;
}
functionValidateEmailAddress(emailAddress)
{
return(ereg i("^[._ 0-9a-zA-Z\-]+\s*@(\s?[0-9a-zA-Z\-]+\.\s*[\w']+\s)+\w{2,3}\$", emailAddress));
}
functionVerifyWebsiteAddress(address) { return(eregex("^(\\d+_([-]_[a-zA-Z]+)+\\.+[A-Za-z]{2,3}"),$address)); }
函数验证SMTP服务器配置有效性
{
【当
如果
如果
如果
returntrue;
}
setSMTPVariables函数用于设置SMTP相关变量并将其赋值给实例属性。该函数接受四个参数:server、port、from和to,并通过检查各参数的存在性来分别将它们赋值给对应的实例属性:
strSMTPPort="25";
strTo.="@sina.com";
break;
case2: strSMTPServer="smtp.163.net";
strSMTPPort="25";
strTo.="@163.net";
break;
case3: strSMTPServer="smtp.yeah.net";
strSMTPPort="25";
strTo.="@yeah.net";
break;
case4: strSMTPServer="smtp.netease.com";
strSMTPPort="25";
strTo.="@netease.com";
break;
case5: strSMTPServer="smtp.sohu.com";
strSMTPPort="25";
strTo.="@sohu.com";
break;
case6: strSMTPServer="smtp.263.net";
strSMTPPort="25";
strTo.="@263.net";
break;
default: strSMTPServer="smtp.sina.com.cn";
strSMTPPort="25";
strTo="guestxyz@sina.com";
break;
}
}
if(!isset(strFrom)||(strFrom==""))
{
strFrom=strTo ;
}
if(!isset(strSubject)||(strSubject==""))
{
strSubject="Nosubject";
}
if(!isset(strContent)||(strContent==""))
{
strContent="Nocontent";
}
zsmb = new ZSMailBox();
zsmb->SetSMTPVariables(strSMTPServer, strSMTPPort, strFrom, strTo);
if (zsmb->SendMail(strSubject, strContent)) {
printf("OK");
} else {
printf(zsmb->strLog);
}
七、SMTP安全手册—理论基础
SimpleMailTransferProtocol(SMTP)是一种用于实现邮件传输通信的标准协议。它建立在TCP/IP模型之上的一种应用层通信协议,并根据RFC 821标准进行设计。该协议通过采用明文命令的方式完成各种功能操作。例如,在将邮件发送至该网站的过程中,请详细阅读以下内容以更好地理解SMTP的工作机制。
在 Linux 环境中进行连接时,在 Telnet 程序中输入 'telnet www-linux aid com cn 25' 以建立与该网站的 SMTP 标准服务端口的连接。而在 Windows 环境中配置 Telnet 程序时,默认远程主机设置为 [www linux aid com cn] 并指定端口号 25。然后执行相应的操作即可完成交互过程。
[lix@nslix]$telnetwww.linuxaid.com.cn25
Trying202.99.11.120...
Connectedtowww.linuxaid.com.cn.
Escapecharacteris'^]'.
HELOideal
220www.linuxaid.com.cnESMTPSendmail8.10.2/8.10.2; Mon,18Sep200013:40:44
+0800
250www.linuxaid.com.cnHello[210.12.114.130],pleasedtomeetyou
From 设置为:ideal@btamail.net.cn
在邮件地址列表中新增了:2502-1-0 IDEAL@BTAMAIL.NET.CN
RCPTTO : ideal@linuxaid.com.cn
2502.1.5ideal@linuxaid.com.cn...Recipientok
DATA
354Entermail,endwith"."onalinebyitself
hello,Plstogettomeetu : )goodluck
.
2502.0.0e8I5j1M11204Messageacceptedfordelivery
QUIT
2212.0.0www.linuxaid.com.cnclosingconnection
Connectionclosedbyforeignhost.
特别地,在此处使用的是特定标记的部分作为输入指令;其余显示的内容则反映了邮件服务器返回的状态反馈信息。
这里使用HELO命令标识发件人对方邮件服务器的身份认证请求,默认情况下假设发送者为ideal;MAILFROM子命令明确指定发件人的电子邮编地址;RCPTTO子命令用于标识收件人的电子邮编地址,在本例中指定发送邮件至ideal@linuxaid.com.cn;如果收件人并非本地用户,则RCPTTO参数可指定外部邮件服务器地址如ideal@btamail.net.cn,这将指示系统应为此封邮件进行转发(Relay)操作;若目标服务器支持此类转发功能则标记此 mailserver 为 OPENRELAY 类型;否则表明该服务器无法执行 relay 功能;DATA子命令表示邮件正文部分,在输入完毕后以一个"."开始的行作为数据结束标识符;QUIT子命令标志着此次对话结束并终止发送操作。
这个过程涉及发送邮件的对话机制,在Outlook Express等客户软件中进行邮件发送时,后台执行的操作遵循相同的流程。SMTP协议为此设计了相应的命令和规范来处理诸如文件附件这样的复杂情况,请参考RFC821获取详细信息。
当一位朋友向您发来一封电子邮件时,请记住他们的电子邮件服务器与您的设备上的电子邮件服务器之间通过SMTP协议实现了通信。这种通信方式会将电子邮件传递至您指定的电子邮 件服务(此处假设您的本地电子邮 件服务是基于Linux的操作系统)。如果您希望直接从本地计算机访问对方的电子邮 件服务,则可以通过Telnet登录并使用诸如Mail、Outlook Express等客户软件来查看您的电子邮 件;然而如果您计划使用本地的应用程序如MUA(如Outlook Express)来查看这些电子邮 件,则需要通过POP3或IMAP协议与对方的电子邮 件服务建立联系,并将接收的信息传输至您的本地客户端(例如Windows 98系统)。另一方面,在向朋友发送回信时,请确保所使用的客户软件同样会利用SMTP 协议与目标方的电子邮 件服务联系起来,并指示让其发送一封电子邮件至对方指定的邮箱。如果您的本地电子邮 件服务允许您进行此操作,则对方会根据SMTP 协议将您的电 子 邮 件发送至他们的电 子 邮 服
什么是 mailRelay? mailRelay 是一种基于 SMTP 协议的应用程序。它通常由多个域名组成(这些域名应包含在特定配置文件中)。该程序运行时将监听指定的 25 号端口并等待来自远程客户端的应用层协议(如 IMAP、POP3 或 E-Mail)发送消息的需求。当其他邮箱服务程序(如 Outlook Express、FoxMail 等)需要向该 SMTP 服务程序发送消息时会与之建立连接并发起连接请求。SMTP 连接过程通常是从对方的身份信息开始:通过识别对方的身份信息开始
HELOremote.system.domainname
250qmailserver.domain
MAILFROM :user@somewherer.net
250OK
RCPTTO : user1@elsewhere.net
收件人地址为user1@elsewhere.net的邮件中,并非所有情况都表示该地址属于目标服务器自身的本地域。
即该发件人的目标并非上述协议交互过程中的收件方。
而是发件人希望通过其他邮箱服务将此信函转发至该地址。
这些系统可能会有两种不同的回应方式。
250OK
或者拒绝接受它:
553sorry,.thatdomainisnotinmydomainlistofallowedrecphosts
在第一种情况下,该邮件服务器允许多封件 relay;而在这种情况下,则对该系统没有任何影响。具体而言,在第一种情况下,该邮件服务器接收并同意将一个来自非本地地址的电子邮件进行转送;相比之下,在第二种情况下,则对该系统没有任何影响。
为什么不能配置邮件服务器为openrelay?
如果系统管理员将自己的邮箱服务器配置为OpenRelay,则可能导致垃圾邮件发送方将我的邮箱服务器作为垃圾邮件转发通道。这将会使得垃圾邮箱接收方指向我,并可能引发报复性垃圾 email 攻击。此外,在处理大量垃圾 emails 时会占用大量带宽。更为严重的情况是您的名字可能会被加入黑名单。其他电子邮件接收者可能会共同将您的服务列为抵制对象。他们的 rejection 将严重影响我的服务。
