smtp电子邮件发送
一(引子)MTA :“邮件传输代理”。 MTA 将邮件从点转发到点,直至邮件可被发送。其他服务器使用 SMTP 协议将电子邮件提交至 TCP 端口 25 ,或由本地客户端通过 /usr/bin/sendmail 程序进行提交。如果该 MTA 是最终目标位置,邮件将传递至 MDA 。否则,将使用 MX 记录在 DNS 中查找下一个 MTA ,并使用 SMTP进行转发。MDA :“邮件发送代理”。 MDA 将邮件发送至收件人的本地邮件存储位置(默认情况下是 /var/spool/mail/user )。 Postfix 提供自己的 MDA ,以发送至基于文件的本地默认邮件存储位置 /usr/libexec/postfix/local.
转发:电子邮件服务器( MTA )将提交的邮件转发至另一个服务器,以进行发送
排队:失败的发送或转发尝试排队等待,并由 MTA 定义重试。(默认情况下, Postfix 每小时执行此操
作一次)
拒绝:在首次提交期间,电子邮件被电子邮件服务器拒绝
退回:远程服务器接受电子邮件以进行发送以后,又将该电子邮件退回给始发电子邮件服务器和 / 或用户
二.
Postfix MTA
开源电子邮件服务器有很多,其中包括 Postfix 、 Sendmail 和 Exim .RHEL6 默认使用 Postfix 。
1.默认情况下, Postfix 仅侦听来自本地主机的传入电子邮件。若要重新配置 postfix 以接收从远程主机发送的本地邮件,必须在 /etc/postfix/main.cf 中设置 inet_interfaces = all
2.对电子邮件进行故障排除时,将在 /var/log/maillog 中保留所有与邮件相关的操作日志,其中包括关于被事件和成功事件的信息。 mailq 命令 ( 或 postqueue -p) 显示已排队的所有传出邮件的列表。若要尝试再次立即发送所有已排队的邮件,可以运行 postfix flush 命令(或 postqueue -f );否则, postfix 将大约每小时尝试重新发送一次,直至邮件被接受或过期。
3.使用 postfix flush 手动清除待发送队列。确认队列现在为空并且邮件已成功发送
4. 编辑 /etc/postfix/main.cf 将 inet_interfaces = localhost 行更改为 inet_interfaces = all 重启postfix 服务并确认后台程序在侦听所有接口。
[root@serverX ~]# service postfix restart
[root@serverX ~]# netstat -tuln |grep :25
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 :::25 :::* LISTEN
三.实验一:
在此以宿主机和虚拟机做实验宿主机的IP:192.168.0.24.虚拟机的IP:192.168.0.124
在两台电脑上均进行如下操作:yum install mutt postfix -y
然后重启服务/etc/init.d/postfix restart
假设从主机往虚拟机上发邮件:
mail [email protected](此处的domain24.example.com以及平常用的example.com都是域名,一个范围,这里之所以这样写是因为所在环境上定义了该域的邮件主机是124,不能写地址,没办法查询邮件主机)
检查发送是否成功:
tail /var/log/maillog
可以查看发送是否成功。
然后可以到虚拟机的IP:192.168.0.124,切换到student用户然后用mail或者mutt来查看接收信息。
实验二:
说明,在本次实验中desktop24作为null客户端,vserver虚拟机作为接受邮件的邮件服务器,vserver2作为邮件转发服务器,在null客户端上发送的邮件,直接到达本机的邮件服务器,如果在desktop24那么就到desktop24本身的邮件服务器上,然后根据你发送的邮件是发给谁的,如果你是mail student这样发送的,那么就不去那个邮件转发的服务器了,(前提是在mydestnation中有localhost的定义,下面实验中设置mydestnation为空,那么本地就不能接受邮件,回到达邮件服务器。)会直接到达你本地,假如你是mail [email protected]这样发送的。那么就会转发到邮件转发服务器。
(1)null 客户端:运行本地 MTA 的客户端计算机,使所有电子邮件都可以转发至中央邮件服务器以进行发送null 客户端不接受任何电子邮件的本地发送。用户可以在 null 客户端上运行 MUA, 以读取并发送电子邮件
大多数计算机都是 null 客户端。在本次实验中以desktop24作为null客户端。
(2)仅入站邮件服务器:在站点处理用户的所有传入电子邮件,并将之传递给 MDA 以发送至用户邮件存储位置的邮件服务器。出站邮件将通过与 null 客户端相同的方式转发至中央邮件服务器。入站邮件服务器可以
与 IMAP 或 POP3 服务器相集成,以允许用户 MUA 访问其邮件存储位置,或者具有访问邮件存储位置权限的单独的主机可以运行 IMAP 或 POP3 服务器。通俗的讲,对于本次实验,仅入站服务器是smtp.domain24.example.com.只是作为邮件转发的服务器。也就是说从desktop过来的邮件,在该服务器上会通过dig -t mx domain24.example.com或者外网的dig -t mx 163.com 即可查到你目的地的邮件服务器,然后将你的邮件传送到目的地的邮件服务器,(163.com是域名,www.163.com是主机名)在实际情况中,通常会在仅入站邮件服务器前端安装反垃圾邮件服务器或设备,以过滤垃圾邮件并且仅将正常邮件转发至入站邮件服务器。
(3)出站邮件转发:出站邮件转发(或“ smarthost” )接收所有出站邮件,并使用 MX 记录和 SMTP 协议将邮件转发至目标位置。出站邮件转发必须仅转发针对授权主机的电子邮件;“开放式邮件转发”会被垃圾邮
件发送者利用,并且其他邮件服务器将有可能阻止来自已知开放式转发的邮件。邮件到达邮件服务器之后,在该邮件服务器上会跟据你写的用户以及地址查找到最终的目的主机。
重要的 Postfix 配置指令
可以在 /etc/postfix/main.cf 文件中找到以下所有指令。或者通过命令行postconf -e 的方式改变。
myorigin
重写本地发布的电子邮件,使其显示为来自该域。这样有助于确保响应返回入站邮件服务器。
默认: myorigin = $myhostname如你该写成myorigin=westos.org,那么从你主机上y以root身份发送出去的文件在收发方会显示from ,可以用来做地址伪装。

以下是介绍一下常用的参数的使用:

inet_interfaces
控制 Postfix 侦听传入电子邮件的网络接口。如果设置为 loopback-only ,仅侦听 127.0.0.1 和 ::1 ,
如果设置为 all ,则侦听所有网络接口。还可以指定特定地址。通俗的讲就是接受所有端口发送的邮件。
默认: inet_interfaces = localhost

mydestination
收到地址为这些域的电子邮件将传递至 MDA ,以进行本地发送。通俗的讲就是说接收以定义的那些域名字结尾的地址。
默认: mydestination = $myhostname, localhost.$mydomain, localhost, domain24.example.com(意思就是接受这个域里面的主机发送的邮件)

mynetworks
IP 地址和网络的逗号分隔列表(采用 CIDR 表示法)。这些地址和网络可以通过此 MTA 转发至任何位
置,无需进一步身份验证。
默认: mynetworks = 127.0.0.0/8

relayhost
relayhost 转发所有通过的出站邮件。通常用方括号指定,以阻止 MX 记录查找。当定义了relayhost=[smtp.domain24.example.com],意思是本机或者其他机子发送的邮件只要经过经此设置的均被抛到relayhost所指定的地址。
默认: relayhost =

local_transport
收件地址为 $mydestination 的邮件的发送方式。默认情况下,设置为 local:$myhostname (使用
Local MDA 将传入电子邮件发送到 /var/spool/mail 中的本地邮件存储位置)
默认: local_transport = local:$myhostname

实验的步骤:(注意在做实验的时候要记住iptables 关闭和selinux是关闭的)
启动新的一个虚拟机,总共加上宿主机共三台机子,
宿主及的IP和hostname分别为:192.168.0.24和desktop24.example.com
vserver1的IP:192.168.0.124和hostname为mail.domain24.example.com
vserver2的IP:192.168.0.224和hostname为smtp.domain24.example.com
(新添加一个虚拟机之后可能网有问题,那么你要修改 /etc/udev/rules.d/70-persistent-net.rules去掉一个不服和的网卡,然后修改那个不服和的网卡的/etc/sysconfig/network-scripts/ifcfg-eth0的MAC地址给删除,然后reboot重启生效 )
(1)在mail.domain24.example.com(192.168.0.124)设置如下:

net_interfaces = all
myorigin = demain24.example.com
relayhost =[smtp.domain24.example.com]
mydestination = localhost, $myhostname, $mydomain, domain24.example.com
local-transport =local:$myhostname
mynetworks = 127.0.0.0/8(切记这里是127.0.0.0/8而不是127.0.0.1/8哦!否则错误呢!)
(2)在desktop.example.com(192.168.0.24)设置如下:
net_interfaces = loopback-only或者是localhost all
myorigin = domain24.example.com
relayhost =[smtp.domain24.example.com]
mydestination = 空 (意思是不接受任何邮件,只负责发送)
local-transport =error:local delivery disavled
mynetworks = 127.0.0.0/8
(3)在smtp.example.com(192.168.0.224)设置如下:
net_interfaces = all(接收所有端口)
myorigin = demain24.example.com
relayhost = 会跟据域名解析某些具体的邮件服务器,然后到达那台邮件服务器。
mydestination = 空 (意思是不接受任何邮件,只负责发送)
local-transport =error:local delivery disavled
mynetworks = 192.168.0.0/24,127.0.0.0/8 (作为邮件中转站接收192.168.0.0网段的邮件和本地发送的邮件)

(4)要在你三个机子上写解析的哦,如:
192.168.0.224    smtp.domain40.example.com
192.168.0.124    mail.domain40.example.com
192.168.0.24  desktop40.example.com

设置好之后,在你的desktop24主机上
测试示例:
mail [email protected]
然后查看tail /var/log/maillog看发送情况,可以看到会被中转到smtp.domain24.example.com
smtp.domain24.example.comtail /var/log/maillog你会看到会被传递给mail.domain24.xample.com。然后在mail.domain24.example.com上查看日志,你会看到直接到本地了,切换到student身份mail 你就会接收到邮件了。
四.
上面介绍了如何发送邮件,下面介绍一下如何在收发邮件
1,安装yum install telenet -y
  mail [email protected]
这样你先不要去mail服务器接收,(在mail服务器上安装yum install dovecot -y 之所以安装此包,是因为可以开启端口让其他客户端替它接受邮件)
mail.domain24.example.com中 /etc/init.d/dovecot restart   然后在/home/student下建立 mkdir   -p mail/.imap/INBOX
在desktop24中执行telnet 192.168.0.124  110
(监听的就是开启的110端口)
user student(输入对方用户)
pass student(输入密码)
list是收发的邮件
(  经本人验证,telnet只能接受本地的 也就说只能用telnet localhost 110来查看)
 2
mutt -f pop://[email protected]
-f 是指明协议的,pop 不加密的   pops是使用加密的。
进去的时候要输入密码
3
yum install thunderbird -y
可以图形化的接受和发送邮件。
选edit的accout setting添加帐号,然后写邮件,和收发邮件,
五.邮件转发服务配置
实验步骤:
(1)vi /etc/postfix/virtual 
在后面添加:
admin            student
@sushan.com        [email protected]
[email protected]    [email protected]
设置完成后设置:
postconf -e virtual_alias_maps=hash:/etc/postfix/virtual
之后进入/etc/postfix/virtual(保存虚拟别名的文件)
运行:postmap virtual                产生virtual.db文件
然后 /etc/init.d/postfix restart
这样你就设置完毕了:
    测试:
     mail     admin        你就会在student用户下接收到你发送的东西。
     mail  @sushan.com            你会在[email protected]邮箱中接收到邮件
     mail [email protected]    你会在[email protected]的邮箱中接到邮件   
(2)或者在/etc/aliases中写admin:    root  
    postalias   /etc/aliases   
(postconf -e virtual_alias_maps=hash:/etc/aliases千万不要有这一句,否则群组收发邮件的时候有错误!)
     /etc/init.d/postfix restart
等设置可以达到同样的效果。
六.用户组群发邮件
 步骤:
(1)vi /etc/aliases
   添加: 
       westos:  :include:/etc/postfix/userlist
 (2)
     vi /etc/postfix/userlist
    添加:
        bob
        student
        root   
(3)执行命令
    postalias   /etc/aliases     
     /etc/init.d/postfix restart
    测试:
    mail westos@localhost
       之后你就会在bob student root 用户下接收到发送的邮件呢!