2014-03-13 13:46:22 AndersHo 阅读数 2180

需求概述

公司有两台邮件服务器,一台是IceWarp邮件系统,一台是IceWarp或者是其他的邮件系统,要求两台服务器都在线运行,两台服务器上的域名是一样的,域名的MX记录指向了IceWarp邮件服务器,但要求IceWarp服务器上所有用户收到的邮件也要发送到另一台其他邮件系统服务器上相对应的用户邮箱里,作为备份,这个可以通过在IceWarp服务器上设置静态路由来实现。

实现方法

1、  在IceWarp服务器上添加一个静态路由帐户

静态路由是一些简单的别名(别名取什么不重要),它的主要作用是根据配置的过滤机制处理邮件,以及在服务器上直接执行预定义操作。右击域名,添加一个静态路由帐户,

 

添加的这个静态路由帐户,“行为”处选择“转发至主机”,“值”处填写另一台邮件服务器的主机名或者IP地址,

该静态路由起到的效果是将转发到该静态路由帐户的邮件都转发到“值”中指定的服务器上,相当于在IceWarp服务器上将邮件又发送一次到另一台服务器上。

1、  对IceWarp服务器所有帐户的邮件设置转发

shift全选域下所有帐户,在“邮箱”选项下的“复制收到邮件至”中填写静态路由帐户,所有帐户收到的邮件都会通过静态路由帐户转发到另外一台服务器上,但是邮件原来的发件人以及收件人都不会改变。

3、  另一台服务器的设置

另外一台服务器上也要有一样域名的域,并且帐户要跟IceWarp服务器上的所有帐户一模一样,同时要把IceWarp服务器的IP地址加入到信任IP中,防止IceWarp服务器因发送大量邮件给这台服务器,而被这台服务器的防护系统认为是垃圾邮件发送器而拒收邮件。

4、  去掉IceWarp服务器上“清除重复邮件”的勾选

如果勾选了“邮件服务”-SMTP服务”-“投递”-“清除重复邮件”选项,会导致当有人发送邮件给IceWarp服务器上某用户,又抄送给IceWarp服务器上多个用户时,另一台服务器上只有一个用户能收到邮件,其他用户收不到,因为Message-ID相同,当转发邮件往另一台服务器时,重复的邮件清除了,只有一封邮件转发到另一台服务器上,所以要保证所有邮件都能正常转发到另一台服务器上,必须去掉IceWarp服务器上“清除重复邮件”的勾选。

2013-11-30 19:21:09 daiyuntao841226 阅读数 5792

邮件服务器

邮件服务器的功能与运作原理:他是利用网络传递一些信息给远程服务器的一种信息传递行为,相当具有时效性,不过现在有很多人乱用,导致垃圾信件,色情,广告信件等等

的滥用,时至今日,Google和几个大型的网络公司都有提供免费或者付费的邮件服务器,除非必要,不建议去架设mail server,因为搞定它十分的难,除了目前网络社会的垃圾

信件太多,所以各个主要的ISP对于邮件控管上面越来越严格,而且基于当中的mail vs. DNS相关性又太高。

你可以在地球上的任何一个有网络存在的地方,连上Internet去收取你的信件。

电子邮件容易产生的一些问题:

夹带病毒的电子邮件问题, 怪客透过邮件程序入侵, 广告信与垃圾信等, 主机被大量不明信件塞爆, 真实社会的讨厌情事, 不实的信件内容

email 服务器的设定与管理真的很难,因为如果你设定的太简单和便利,那就越容易被攻击或遭利用,反过来说,如果针对邮件服务器管的太严,那么你的主管可能就不太满意

Mail server 与 DNS 之间的关系,是否要架设 mail server 就『宿命』的一定得架设 DNS server 在你的主机上面吗?

Mail server 与合法的主机名:现今我们收到的email都是使用【账号@主机名】的方式来处理的,所以说,你的邮件服务器【就一定要有一个合法注册过的主机名】才可以,

所以想要架设mail server 就必需要有合法的主机名,既然我只要一个合法的主机名即可,那么表示我不需要架设一部 DNS 主机,只要你有合法的主机名,亦即在DNS的查询

系统当中你的主机名拥有一个A的标志,理论上你的mail server就可以架设成功,只不过由于垃圾信件会占用掉太多的宽带,导致整个网络社会花费过多的成本消耗在这些垃圾

资料上了,因此要想办法杜绝这种可恶的垃圾信件,目前大型网络供应商(ISP)都会针对不明来源的邮件加以限制,所以就造成架设mail server越来越难了

DNS 的反解也很重要:对于一般的服务器来说,我们只要使用正解让客户端可以正确的找到我们服务器的IP即可架站,例如www服务器,不过由于目前收信端的邮件服务器会

针对邮件来源的IP进行反解,而如果你的网络环境不是固定IP时,该种IP在ISP方面通常会主动的以xxx.dynamic.xxx 之类的主机名来管理,偏偏这样的主机名会被主要的大型邮件

服务器(hotmail yahoo) 视为垃圾信件,所以你的邮件服务器所发出的信件将可能被丢弃。所以如果想要架设一部Mail Server的话,请务必向你的上层ISP申请IP的反解的对应,

不要再使用预设的反解主机名,否则很容易导致你的邮件服务器所发出的信件会在Internet上面流浪,其实你还是可以不用申请 IP 的反解,不过就得要利用所谓的 relayhost 或

者是 smarthost 来处理邮件转递的问题

需要 DNS 的 MX 及 A 标志啊 (超重要的 MX)

邮件服务器系统到底是如何使用DNS的信息来进行邮件的传递,MX代表的是Mail eXchange,当一封邮件想要传送出去时,邮件主机会先分析那封信的【目标主机的DNS】,取得

MX标志(MX标志可能会有多部主机),然后以最优先MX主机为准将信件发送出去,,我们以底下这个 DNS 范例来说:

xyz.com.vbird IN MX 10 mail.xyz.com.vbird,

xyz.com.vbird IN MX 20 mail2.xyz.com.vbird

xyz.com.vbird IN A aaa.bbb.ccc.ddd

当有一封信要传给user@xyz.com.vbird 时,由于 MX 标志最低者优先,如果由于mail.xyz.com.vbird 由于种种原因,导致无法收下该

封信时,该封信将以次要 MX 主机来传送,那就是传送到 mail2.xyz.com.vbird 那部主机上头,如果两部 MX 主机都无法负责的话,那么该封信会直接以 A 的标志,亦即直接

传送到aaa.bbb.ccc.ddd 那个 IP 上头去, 也就是 xyz.com.vbird 本身啦!这个过程中,必需要注意到:mail.xyz.com.vbird 及 mail2.xyz.com.vbird 必需要是可以帮 、

xyz.com.vbird 转信的主机才行,这两部主机通常是你公司最上游的邮件主机,不要随意填写,那两部主机还需要针对你的 xyz.com.vbird 来设定『邮件转递』才行! 否则你的信

会被踢掉的。架设服务器虽然不必自行设定DNS服务器,不过最好要申请一个MX的标志才行,此外,MX标志一定要设定正确,否则你的信件可能会被直接被MX服务器踢掉

为了要设定 MX 但是我们没有上层邮件服务器时,所以你可以指定 MX 为自己,利用自己当 MX 服务器即可,MX的好处是目标主机挂掉了,那你的邮件通常会直接退还给

原发送者,但如果有MX主机时,这部MX主机会先将该封信放在他的队列当中,等到你的目标主机重新提供邮件服务器后,MX会主动将你的信件传送给目标主机,如此一来你的

信件就比较不会遗失。

Email 的地址写法

email 通常是『账号@主机名』的方式来处理,例如www.centos.vbird 主机上面有个 dmtsai 的使用者,则我的 email 将会成为:『dmtsai@www.centos.vbird

当有人要寄信给我时,他会分析@后面的主机名,亦即 www.centos.vbird 的 MX/A 标志等等,然后再透过刚刚说明的流程来传出信件,然后再透过刚刚说明的流程来传出信件

当中,

邮件传输所需要的组件 (MTA, MUA, MDA) 以及相关协议

假设你要寄信给一个用户,他的电子邮件『a_user@gmail.com』好了,也就是说,你要寄一封信到gmail.com这个主机上的意思,那你的桌面计算机是否能够将这封信『直接』

透过网络送给 gmail.com 那个主机上? 当然不行,你得要设定帮你转信的邮件服务器才行,也就是说,你必须要先向某一部邮件服务器注册,以取得一个合法的电子邮件权限

后,才能够发送邮件出去的。所以说,你要寄出一封信件时是需要很多接口的帮忙的,底下列出一个简单的说明:


A. MUA (Mail User Agent):MUA 就是『邮件使用者代理人』的意思,因为除非你可以直接利用类似telnet之类的软件登入邮件服务器来主动发出邮件,否则你就要透过MUA来

帮你送信到邮件服务器上头去,最常见的MUA像是Mozilla 推出的Thunderbird (雷鸟) 自由软件,或者是 Linux 桌面 KDE 常见的 Kmail,及 Windows 内件的 Outlook Express

(OE) 等,MUA主要的功能就是接受邮件主机的电子邮件,以及提供用户浏览和编写邮件的功能。

B. MTA (Mail Transfer Agent):MUA 帮用户传送邮件到邮件主机上,那这部邮件主机如果能够帮用户将这封信寄出去,那他就是一部邮件传送主机 (MTA) ,这个MTA就是

『邮件传送代理人』的意思,既然是『传送代理人』,那么使用者寄出的信,帮用户将属于该用户的信件收下时,就是找它(MTA)就对了,基本上,MTA的功能有这些:

1.接受信件:使用简单邮件传送协议(SMTP) :MTA主机最重要的功能是:将来自客户端或者是其他MTA的来信收下来,这个时候MTA使用的是Simple Mail Transfer Protocol

(SMTP),他使用的是 port 25。

2. 转递信件:如果该封信件的目的地并不是本身的用户,且该封信的相关数据符合使用 MTA 的权力, 那么咱们的 MTA 就会将该封信再传送到下一部主机上。这即是所谓的转

递 (Relay) 的功能。

总之,我们一般提到的 Mail Server 就是 MTA ,而严格来说, MTA 其实仅是指 SMTP 这个协议而已。而达成 MTA 的 SMTP 功能的主要软件包括老牌的 sendmail,后起

之秀的 postfix,还有 qmail 等等。底下我们来看看,那么在 MTA 上头还有哪些重要的功能

C. MDA (Mail Delivery Agent):邮件传递代理人,事实上,这个MDA是挂在MTA底下的一个小程序,最主要的功能就是:分析由MTA所收到的信件表头或内容等数据,来决定

邮件的去向,所以说,上面提到的MTA的信件转递功能,其实是由MDA达成的,例如,如果 MTA 所收到的这封信目标是自己,那么 MDA 会将这封信给他转到使用者的信箱

(Mailbox) 去, 如果不是呢?那就准备要转递出去了,此外,MDA只有分析与过滤邮件的功能,举例来说:

1. 过滤垃圾信件:可以根据该封邮件的表头资料,或者是特定的信件内容来加以分析过滤。例如某个广告信的主题都是固定的, 如『AV情色...』等等,那就可以透过 MDA 来

过滤并去除该邮件

2. 自动回复:如果您出差了导致某一段时间内无法立即回信时,就可以透过 MDA 的功能让邮件主机可以自动发出回复信件, 如此您的朋友就不会认为你太大牌!^_^

各主要的 MTA 程序 (sendmail,postfix...) 都有自己的 MDA 功能,不过有些外挂的程序功能更强大,举例来说 procmail 就是一个过滤的好帮手,另外 Mailscanner +

Spamassassion 也是可以使用的一些 MDA

D. Mailbox:就是电子邮件信箱嘛!简单的说,就是某个账号专用的信件收受档案,我们的 Linux 系统默认的信箱都是放在 /var/spool/mail/使用者账号,若 MTA 所收到的信件

是本机的使用者,MDA 就会将信件送到该 mailbox 当中去

好了,那么来想一想,你如何透过 MUA 来将信件送到对方的邮件信箱 (Mailbox) 去呢?

Step 0:取得某部 MTA 的权限: 本机端的MUA想要使用MTA来传送信件,当然需要取得MTA的权限,通常就是:我们必须要向MTA注册一组可使用email的帐号与密码才行

Step 1:使用者在 MUA 上编写信件后,传送至 MTA 上头: 用户在MUA上面编写信件,信件主要有:信件标头,信件内容,编写好之后按下传送钮,该封信就会送至你的MTA服务器

上面了,注意:是你的MTA而不是对方的MTA,如果你确定可以使用该部MTA,那么这封信会被放置到MTA的队列(queue)当中等待被传送出去了。

Step 2.1:如果该封信的目标是本地端 MTA 自己的账号:你是可以寄信给你自己的,所以如果你的MTA收到该封信的目录是自己的用户时,那就会透过MDA将这封信送到

Mailbox去。

Step 2.2:如果该封信目的为其他 MTA ,则开始转递 (Relay) 的流程: 如果该封信的目标是其他的主机,这个时候我们的MTA就会开始分析该封信是否具有合法的权限,若有权限,

则我们的MDA会开始进行邮件传递,亦即该封信会透过我们的MTA向下一部MTA的smtp(port 25)发送出去,如果该封信件顺利的发送出去了,那么该封信会在队列中移除掉了

Step 3:对方 MTA 服务器收受信件:远程MTA会收到我们MTA所发出的那封信,并将该信件放置到正确的使用者信箱当中,等待使用者登入来读取或下载。

在整个过程当中,你会发现你的信件是由我们的MTA帮忙发送出去的,此时MTA提供的协议是简单邮件传输协议(smtp),并且该封信最终停留在对方主机的MTA上头,并不是你

朋友的MUA上头。

了解了传送信件时 MTA 需要启动 smtp (port 25) 之后,再来我们得要谈谈那这封信件对方要如何接收啊?

使用者收信时服务器端所提供的相关协议: MRA 

使用者如果想要收信时,当然可以透过MUA直接来联机取得自己的邮件信箱内的数据,整个过程有点下这样:

E. MRA (Mail Retrieval Agent): 使用者可以透过MRA服务器提供的邮政服务协议(POP)来收下自己的信件,也可以透过IMAP协议将自己的信件保留在邮件主机上面,并进一步

建立邮政数据匣等进阶工作,也就是说,当客户端收受信件时,使用的是MRA的POP3,IMAP等通讯协议,并非MTA的SMTP。

POP3 的收信方式:

1. MUA 透过 POP3 (Post Office Protocol version 3) 的协议连接到 MRA 的 port 110, 并且输入账号与密码来取得正确的认证与授权;

2. MRA确认该用户账号/密码没有问题后,会前往该使用者的 Mailbox (/var/spool/mail/使用者账号) 取得使用者的信件并传送给用户的 MUA 软件上;

3. 当所有的信件传送完毕后,用户的 mailbox 内的数据将会被删除

上面的3个步骤中可以看出MRA必须要启动POP3这个协议才行,这个协议的收件方式较有趣,因为使用者收信是由第一封信件开始收下直到最后一封信件传输完毕,不过

由于某些MUA程序撰写问题,若有些邮件有病毒的可能性时,透过防病毒软件将可能导致该MUA软件的断线,如此一来由于没有传输完毕,因此MRA主机并不会将用户的信件

删除,此时如果使用者又再一次的按下接受按键,那么原来已接收的信件又会重复收到,而没有收到的还是没有收到。

因为POP3的协议预设会将信件删除,那如果我今天在办公室将我的信收到办公室的计算机中,当我回家时再度启动MUA时,此时是收不到被接收了的信件的,那就要使用

IMAP这个协议可以让你将mailbox的数据转存到你主机上的家目录,亦即/homt/帐号/那个目录下,那你不但可以建立邮件数据匣,也可以针对信件分类管理,而且在任何一个可

连上网络的地方只要登入主机,原本的信件就还是存在的。

不过,使用 IMAP 时,用户的目录最好能够加点限制,例如利用 quota 来管理用户的硬盘权限,否则因为信件都在主机上头,如果用户过多且误用时,你的硬盘空间会被吃光。

通过上面的步骤,我们可以知道要架设一部可以使用MUA进行收发信件的MTA,MRA服务器,你至少需要启动SMTP以及POP3这两个协议才行,而这两个协议启动程序

并不相同,所以架设上还是要小心注意的。

pop3s, imap2 与 SMTP 的困扰

由于邮件数据在因特网上面传输的,透过的 SMTP, POP3, IMAP 等通讯协议,通通是明码传输的,尤其 POP3, IMAP 这两个通讯协议中,使用者必须要输入帐号密码才能收到

信件,因为涉及帐号密码,所以当然加密这两个通讯协议的数据较佳,于是就有了POP3s,IMAPs通讯协议出现,通过SSL加密,既然已经有 pop3s, imaps,那有没有smtps

答案是有的,只不过没人用,因为IMAP与POP3只是与MRA及自己的用户有关,并不会影响其他的服务器,但是MTA就不同了,因为MTA必须与其他的MTA沟通,因此,若你

使用了smtps,那么全世界与你的MTA沟通者,通通需要改变为smtps通讯协议才行,这个工程实在太浩大,目前没有任何一家ISP有能力进行,所以,目前没有SMTPs的协议

此时既然MTA(smtp)无法加密,那么就将自己的邮件数据加密后,再交由MTA传送即可,这也是目前很多急需加密名数据的邮件用户所需要的手段。

Relay 与认证机制的重要性

MTA帮你将信寄到下一部MTA去,这个动作称为邮件转递(Relay),如果所有的人可以籍由这一部MTA帮忙进行Relay时,这个情况称之为Open Relay的动作,当你的MTA发生

Open Relay时,并且由于设定不良的关系导致具有Open Relay的主机出现状况,加上你的MTA确实是连上因特网时,由于因特网上面用port scan软件的闲人太多,你的MTA

具有Open Relay的功能这件事情,很快会被人察觉的,此时那些垃圾信件就会利用你的这部Open Relay MTA发送他们的广告,所以你会发生的问题至少有:

1. 你主机所在的网域正常使用的连接速度将会变慢,因为网络带宽都被广告、垃圾信吃光了;

2.  你的主机可能由于大量发送信件导致主机资源被耗尽,容易产生不明原因当机之类的问题;

3. 你的 MTA 将会被因特网社会定义为『黑名单』,从此很多正常的邮件就会无法收发

4. 你 MTA 所在的这个 IP 将会被上层 ISP 所封锁,直到你解决这个 OpenRelay 的问题为止

5. 某些用户将会对你的能力产生质疑,对您公司或者是你个人将会有信心障碍!甚至可能流失客源;

6. 如果你的 MTA 被利用来发黑函,你是找不到原发信者的,所以你这部 MTA将会被追踪为最终站

所以,目前所有的distributions都一样,几乎将MTA预设启动为仅监听内部循环接口而已,而且也将Open Relay的功能取消了,既然取消了Open Relay的功能,那么怎么使用

这部 MTA 的 Relay 来帮忙转信?所以上面就说了你必须要取得合法使用该MTA的权限,也就是说,设定谁可以使用Relay的功能就是我们管理员的任务,通常Relay方法有几种

1. 规定某一个特定客户端的 IP 或网段,例如规定内部 LAN 的192.168.1.0/24 可使用 Relay

2. 若客户端的 IP 不固定时 (例如拨接取得的非固定 IP) 可以利用认证机制来处理

3. 将 MUA 架设在 MTA 上面,例如 OpenWebMail 之类的 web 接口的 MUA 功能。

认证机制上面常见的有 SMTP 邮件认证机制, 以及 SMTP after POP 两种, 无论哪种基本上都是透过使用者输入认证用的帐号与密码,来确定他有合法使用该MTA的权限,然后

针对,然后针对通过认证者开启 Relay 的支持就是了。如此一来你的 MTA不再启动 Open Relay ,并且客户端还是可以正常的利用认证机制来收发信件。

电子邮件的数据内容:email主要有标头(header)以及内容 (body) 两部份

email 的标头部分 (类似邮件信封) 会有几个重要信息,包括,信件来自哪个MTA,由谁发送出来的,要送给谁,主旨为何等等,至于内容(类似信封内的信纸)则是发送者填写的

一些说明,如果使用dmtsai的身份下达这个指令:

echo "HaHa.." | mail -s "from vbird" dmtsai 

将自己的信箱内容叫出来看:cat /var/spool/mail/dmtsai  从结果中看出标头部分记录了收,发件者数据,以及相关的来源,目标之MTA信息,但是那个『Received:...』那一行资

料是『会变动的』,如同前面谈到的MX标志,如果一封信由MUA传送到 MTA 再由 MTA 传送到 MX 主机后,才传送到最终的 MTA 时,那么这个 Received: 的数据将会记录每一部

经手过的 MTA 信息,所以可以借着这个记录数据慢慢的找回这封信的传递方向。

此外,这个邮件的标头以及内容的分析部分,你还可以籍由某些分析软件来进行过滤,先知道一封邮件至少要有的这些数据。

MTA 服务器: Postfix 基础设定

由于sendmail的配置太过于难懂,以及早期的程序漏洞问题导致的主机安全性缺失,加上sendmail将所有的功能都整合在/usr/sbin/sendmail 这个程序当中,导

致程序太大可能会有效能方面的疑虑等等,所以新版的CentOS已经将预设的mail server调整为postfix,先介绍下postfix:

Postfix 设计的理念上面,主要是针对『想要完全兼容于 sendmail』所设计出来的一款『内在部分完全新颖』的一个邮件服务器软件,ostfix 在外部配置文件案的支持度,与

sendmail 几乎没有两样,同样的支持 aliases 这个档案,同样的支持 ~/.forward 这个档案,也同样的支持 SASL 的 SMTP 邮件认证功能

Postfix所需要的软件与软件结构:主要的配置文件都在/etc/postfix/当中:

/etc/postfix/main.cf  这就是主要的 postfix 配置文件,几乎所有的设定参数都是在这个档案内规范的,这个档案预设就是一个完整的说明档,可以参考这个档案的内容就设定

好属于你的postfisx MTA,主要修改过这个档案,记得要重新启动postfix

/etc/postfix/master.cf 主要规定了postfix每个程序的运作参数,这个档案预设已经很OK了,通常无需改动

/etc/postfix/access (利用 postmap 处理) ,可以设定开放Relay或拒绝联机的来源与目标地址等信息的外部配置文件,不过这个档案要生效还需要在/etc/postfix/main.cf启动这个

档案的用途才行,且设定完毕后需要以postmap来处理成为数据库档案。

/etc/aliases (利用 postalias 或 newaliases 均可)  做为邮件别名的用途,也可以作为邮件群组的设定

常见的执行档则有底下这些:

/usr/sbin/postconf (查阅 postfix 的设定数据) 这个命令可以列出目前你的postfix的详细设定数据,包括系统默认值也会被列出来,数据比较庞大,如果你在main.cf里面曾经修改

过某些预设参数的话,想要仅列出非默认值的设定数据,则可以使用postconf -n这个选项。

/usr/sbin/postfix (主要的 daemon 指令) 此为postfix的主要执行档,可以简单的使用他来启动或重新读取配置文件:

postfix check <==检查 postfix 相关的档案、 权限等是否正确

postfix start <==开始 postfix 的执行

postfix stop <==关闭 postfix

postfix flush <==强制将目前正在邮件队列的邮件寄出

postfix reload <==重新读入配置文件,也就是/etc/postfix/main.cf

要注意每次更动过main.cf后,务必重新启动postfix,可简单的使用『postfix reload』即可。不过老实说,习惯使用 /etc/init.d/postfixreload..

/usr/sbin/postalias 设定别名数据库的指令,因为MTA读取数据库格式的档案效能较佳,所以我们都会将ASCII格式的档案重建为数据库,在postfix当中,这个指令主要在

轮换/etc/aliases成为/etc/aliases.db用法为:postalias hash:/etc/aliases ,hash是一种数据库格式,然后那个/etc/aliases.db 就会自动被更新

/usr/sbin/postcat 主要用在检查放在 queue (队列) 当中的信件内容,由于队列当中的信件内容是给MTA看得,所以格式并不是一般我们看得懂的文字数据,这个时候你得要用

postcat才可以看出该信件的内容, 在 /var/spool/postfix 内有相当多的目录,假设内有一个文件名为 /deferred/abcfile , 那你可以利用底下的方式来查询该档案的内容

postcat /var/spool/postfix/deferred/abcfile

/usr/sbin/postmap 这个指令的用法与 postalias 类似,不过他主要在转换 access 这个档案的数据库!用法为: postmap hash:/etc/postfix/access

/usr/sbin/postqueue 类似 mailq 的输出结果,例如你可以输入『postqueue -p』看看就知道了

一个邮件服务器的设定案例,主要的参数是这样的:

邮件服务器的主要名称为: www.centos.vbird , 邮件服务器尚有别名为 linux.centos.vbird 及 ftp.centos.vbird 也可以收发信件;  此邮件服务器已有 MX 设定,直接指向自己

(www.centos.vbird),这个 www.centos.vbird 有个 A 的标志指向 192.168.100.254

让 Postfix 可监听 Internet 来收发信件

在预设的情况下,CentOS 6.x 的 MTA 仅针对本机进行监听,所以你要修改成对整个Internet开放的话,需要修改/etc/postfix/main.cf 这个档案中的某些设定。

『 # 』符号是批注的意思; 

所有设定值以类似『变量』的设定方法来处理,例如 myhostname = www.centos.vbird,请注意等号的两边要给予空格符,亦即『my..』要由行首写起

可以使用『 $ 』来延伸使用变量设定,例如 myorigin = $myhostname,会等于 myorigin = www.centos.vbird

如果该变量支持两个以上的数据,则使用空格符来分隔,不过建议使用逗号加空格符『, 』来处理,例如: mydestination = $myhostname, $mydomain,linux.centos.vbird,意指

mydestination 支持三个数据内容之意

可使用多行来表示同一个设定值,只要在第一行的最后有逗号,且第二行开头为空格符,即可将数据延伸到第二行继续书写,(所以刚刚第二点才说,开头不能留白!);

若重复设定某一项目,则以较晚出现的设定值为准

要让你的 postfix 可以收发信件时,你必需要启动的设定数据有底下这些:

myhostname:设定主机名,需使用 FQDN :这个项目在于设定你的主机名,这个练习当中,应该设定为myhostname = www.centos.vbird 才对,除了这个设定之外,还有一个

mydomain的设定项目,这个项目默认会取$myhostname 第一个【.】之后的名称,例如预设的mydomain就是centos.vbird 啰!你也可以自行设定他

myorigin :发信时所显示的『发信源主机』项目:这个项目在设定『邮件头上面的 mail from 的那个地址』,也就是MTA传出去的信件将以此设定值为准,如果本机寄信时忘了

加上Mail From字样的话,那么就以此值为准,默认这个项目以$myhostname 为主的,例如 myorigin = $myhostname

inet_interfaces :设定 postfix 的监听接口 (极重要):预设Postfix只会监听本机回还接口(127.0.0.1)而已,如果想要监听整个Internet的话,请开放成为对外接口,或者开放给

全部接口,常见的设定为: inet_interfaces = all 才对,如果有重复设定项目时,会以最晚出现的设定值为准,所以最好保留一组inet_interfaces 的设定

inet_protocols :设定 postfix 的监听 IP 协议:预设CentOS的postfix会去同时监听IPv4,IPv6两个版本的IP,如果你的网络环境仅有IPv4,那么可以直接指定 inet_protocols =

ipv4 就会避免看到 :::1 之类的 IP 出现

mydestination :设定『能够收信的主机名』 (极重要):我们的主机有非常多的名字,那么对方填写的mail to到底要写哪个名字我们才能将该信件收下,就是这里规范的,

也就是说仅有写入这个设定值的名称才能作为email的主机地址,在我们这个练习当中这部主机有三个名字,所以写法为:

mydestination = $myhostname, localhost, linux.centos.vbird, ftp.centos.vbird,如果想要将此设定移动到外部档案,做法为:mydestination = /etc/postfix/local-host-names

然后在ocal-host-names 里面将可收信的主机名写入即可,一般不建议你额外建立local-host-names 这个档案,直接写入main.cf 即可,如果你的DNS里头的设定有MX标志

的话,那么请将MX指向的那个主机名一定要写在这个mydestination 内, 否则很容易出现错误讯息

mynetworks_style :设定『信任网域』的一项指标:这个设定值在规定『与主机在同一个网域的可信任客户端』的意思,例如我的主机IP是192.168.100.254,如果我相信整个局

域网络内(192.168.100.0/24) 的用户的话,那我可规定此设定值为『 subnet 』,不过,一般来说,因为底下的mynetworks 会取代这个设定值, 所以不设定也没有关系,

如果设定的话,最好设定成为 host 即可 (亦即仅信任这部 MTA 主机而已)

mynetworks :规定信任的客户端 (极重要):你的MTA能不能帮忙进行Relay与这个设定值有关系,例如:我要开放本机与内部网域的 IP 时,就可以这样进行设定: mynetworks =

127.0.0.0/8,192.168.100.0/24,如果你想要以 /etc/postfix/access 这个档案来控制relay 的用户时,那建议你将上述的数据改写成这样:

mynetworks =127.0.0.0/8, 192.168.100.0/24, hash:/etc/postfix/access,然后你只要再建立access 之后重整成数据库后,嘿嘿!就能够设定 Relay 的用户。

relay_domains :规范可以帮忙 relay 的下一部 MTA 主机地址:相对于 mynetworks 是针对『信任的客户端』而设定的,这个 relay_domains 则可以视为『针对下游 MTA 服务器』

而设定的,例如:如果你这部主机是 www.niki.centos.vbird 的 MX 主机时,, 那你就得要在 relay_domains 设定针对整个 niki.centos.vbird 这个领域的目标信件进行转递才行。

在预设的情况下,这个设定值是 $mydestination 而已

alias_maps :设定邮件别名:就是设定邮件别名的设定项目,只要指定到正确的档案去即可,这个设定值可以保留默认值

开始设定:

vim /etc/postfix/main.cf 

myhostname = www.centos.vbird

myorigin = $myhostname 

inet_interfaces = all

inet_protocols = ipv4

mydestination = $myhostname, localhost.$mydomain, localhost, linux.centos.vbird, ftp.centos.vbird

mynetworks = 127.0.0.0/8, 192.168.100.0/24, hash:/etc/postfix/access

relay_domains = $mydestination

alias_maps = hash:/etc/aliases

alias_database = hash:/etc/aliases  # 其他的设定值就先保留默认值即可

设定好之后,执行:

postmap hash:/etc/postfix/access

postalias hash:/etc/aliases

main.cf 当中我们有额外加入两个外部配置文件 (mynetworks 及 alias_maps),所以才会额外进行 postmap 及 postalias。然后准备来启动

# 1. 先检查配置文件的语法是否有错误  /etc/init.d/postfix check <==没有讯息,表示没有问题

# 2. 启动与观察 port number   /etc/init.d/postfix restart   netstat -tlunp | grep ':25'

此时假设你的防火墙已经处理完毕,那么你的Postfix已经可以开放客户端进行转递,并且也可以收受信件,不过,预设的情况下我们的postfix可以收下那些信件,又可以针对

哪些设定值的内容进行转递。

信件传送流程与收信、relay 等重要观念

一般来说一封邮件传送会经过许多的流程为:  送信端与收信端两部主机间会先经过一个握手 (ehlo) 的阶段,此时送信端被记录为发信来源(而不是 mail from),通过握手后就可以

进行信件标头的传递。

2. 此时收信端主机会分析标头的信息,若信件之 Mail to: 主机名为收信端主机,且该名称符合 mydestination 的设定,则该信件会开始被收下至队列,进一步送到mailbox当中,若

不符合mydestination 的设定,则终止联机且 不会进行信件内容 (body) 的传送。

3. 若 Mail to: 主机名非为收信端本身,则开始进行转递 (relay) 的分析。

4. 转递过程首先分析该信件的来源是否符合信任的客户端,亦即来源是否符合(mynetworks)的设定值,若符合则可以收下信件至列队中,并等待MDA等信件再转递出去,若

不符mynetworks则继续下一步;

5. 分析信件来源或目标是否符合 relay_domains 的设定,若符合则信件将被收下至队列,并等待 MDA 将信件再转递出去

6. 若这封信的标头数据都不合乎上述的规范,则终止联机,并不会接受信件的内容数据的

整个流程有点像底下这样:



也就是说标头分析通过后,你的信件内容才会开始上传到主机的队列,然后透过MDA 来处理该信件的流向,而不是将信件完整的传送到主机后才开始进行分析,这个要注意,

透过上述的流程,在暂不考虑 access 以及 MDA 的分析机制中,一部MTA想要正确的收,发信件时,电子邮件必须需要符合:

收信方面:必需符合底下需求: 1. 发信端必需符合 $inet_interfaces 的设定; 2.信件标头之收件者主机名必需符合 $mydestination 的设定, 或者收件主机名需要符合 $virtual_maps

(与虚拟主机有关) 的设定

转递方面 (Relay):必需符合底下需求:

1. 发信端必需符合 $inet_interfaces 的设定;

2.发信端来源必需为 $mynetworks 的设定;发信端来源或信件标头之收件者主机名符合 $relay_domains 之设定内容

同样的原理与想法你可以将他用在 sendmail 的设定当中

设定邮件主机权限与过滤机制 /etc/postfix/access,指定了 Postfix 的 mynetworks 的信任来源就能够让使用者 relay 了,设定你的 mynetworks 的话,那么我们还

可以利用 access 这个档案来额外管理我们的信件过滤呢!基本的 access 语法为:

规范的范围或规则                       Postfix 的动作 (范例如下)

IP/部分 IP/主机名/Email 等        OK/REJECT

假设你想要让 120.114.141.60 还有 .edu.tw 可以使用这部 MTA 来转递信件,且不许av.com 以及 192.168.2.0/24 这个网域的使用时,可以这样做:

vim /etc/postfix/access

120.114.141.60   OK

.edu.tw  OK

av.com  REJECT

192.168.2.   REJECT

# OK 表示可接受,而 REJECT 则表示拒绝

postmap hash:/etc/postfix/access          ls -l /etc/postfix/access*

-rw-r--r--. 1 root root 19648 2011-08-09 14:05 /etc/postfix/access

-rw-r--r--. 1 root root 12288 2011-08-09 14:08 /etc/postfix/access.db

# 你会发现有个 access.db 的档案才会同步更新!这才是 postfix 实际读取的,这个档案设定最大的好处就是不必重新启动postfix,只要将数据库建立好,立刻生效,这个档案

还有其他进阶功能,你可以自行进入该档案查阅,但是进阶设定还需要main.cf内的其他参数有设定才行,如果只有之前$mynetworks 的设定值时,你只能利用 access.db 的方式

来开放 relay 的能力而已。不过,至少他可以让我们的设定简化

设定邮件别名: /etc/aliases, ~/.forward:当如果以某些系统帐号执行的程序若有讯息发生时,他会将email发送给root,这是因为其他的系统帐号并没有密码可登入,自然就无法

接收邮件了,所以若有邮件就给系统管理员,不过,我们的MTA怎么知道这些信件要传给root?这就得要aliases这个邮件别名配置文件来处理

邮件别名配置文件: /etc/aliases ,在你的 /etc/aliases 档案内,你会发现类似底下的字样: vim /etc/aliases

mailer-daemon: postmaster

postmaster: root

bin:root

daemon:root

左边是【别名】右边是实际存在的使用者帐号或者是email address ,就是透过设定这个值,所以让我们可以将所有系统账号所属的信件通通丢给 root 啊

postalias hash:/etc/aliases

ll /etc/aliases*

-rw-r--r--. 1 root root 1535 2011-08-09 14:10 /etc/aliases

-rw-r--r--. 1 root root 12288 2011-08-09 14:10 /etc/aliases.db

从此之后不论dmtsai@www.centos.vbird 还是 dermintsai@www.centos.vbird 都会将信件丢到 /var/spool/mail/dmtsai 这个信箱当中

/etc/aliases 实际应用一:让一般账号可接收 root 的信

假设你是系统管理员,而你常用的一般账号为 dmtsai,但是系统出错时的重要信件都是寄给 root,偏偏 root 的信件不能被直接读取,此时可以将给root的信件转寄一份给dmtsai

vim /etc/aliases

root: root,dmtsai <==建议这种写法  ,# 信件会传给 root 与 dmtsai 这两个账号

postalias hash:/etc/aliases

/etc/aliases 实际应用二:发送群组寄信功能

vim /etc/aliases

student2011: std001,std002,std003,std004...

postalias hash:/etc/aliases

如此一来,只要寄送到部主机的 student2011 这个不存在的账号时,,该封信就会被分别存到各个账号里头去, 管理上面是否很方便,除了填写自己主机上面的实体用户之外,还

可以填写外部主机的email,例如你要将本机的dermintsai 那个不存在的用户的信件除了传给 dmtsai 之外,还要外传到dmtsai@mail.niki.centos.vbird 时,可以这样做:

vim /etc/aliases

dermintasi: dmtsai,dmtsai@mail.niki.centos.vbird

postalias hash:/etc/aliases

个人化的邮件转递: ~/.forward:虽然/etc/aliases 可以帮我们达到邮件别名设定的好处,不过/etc/aliases是只有root才能修改的档案权限,那我们一般使用者如果也想要进行邮件

转递时,该如何是好?没关系,可以透过自己家目录下的 .forward 这个档案,例如,我的dmtsai这个帐号所接收的信件除了自己保留一份之外,还要传给本机上的vbird以及

dmtsai@mail.niki.centos.vbird 时,那你可以这样做设定:

vim .forward

# 注意!我现在的身份现在是 dmtsai 这个一般身份,而且在他的家目录下!

dmtsai

vbird

dmtsai@mail.niki.centos.vbird

[dmtsai@www ~]$ chmod 644 .forward,这个档案内容是一行一个账号 (或 email) ,而且权限方面非常重要

该档案所在用户家目录权限,其 group、other 不可以有写入权限。.forward 档案权限,其 group、other 不可以有写入权限

察看信件队列信息: postqueue, mailq

有时候由于网络的问题或者对方主机的问题,可能导致某些信件无法送出而被暂存在队列中,那我们如何了解队列中有那些邮件?还有,队列中等待送出的信件如何送出?

如果该封信在五分钟之内无法寄出,则通常系统会发出一封『警告信』给原发信者, 告知该封邮件尚无法被寄送出去,不过,系统仍会持续的尝试寄出该封邮件;

如果在四小时候仍无法寄出,系统会再次的发出警告信给原发信者;

如果持续进行五天都无法将信件送出, 那么该封邮件就会退回给原发信者了

当然啦,某些 MTA 已经取消了警告信的寄发,,不过原则上,如果信件无法实时寄出去的话 MTA 还是会努力尝试 5 天的,如果接下来的 5 天都无法送出时,才会将原

信件退回给发信者。 一般来说,如果 MTA 设定正确且网络没有问题时,应该是不可能会有信件被放在队列当中而传不出去的, 所以如果发现有信件在队列时,当然得要仔细的瞧一瞧

检查队列内容的方法可以使用 mailq , 也可以使用 postqueue -p 来检查的: postqueue -p

不过如果你将 postfix关闭, 并尝试发一封信给任何人,那就可能会出现如下的画面:/etc/init.d/postfix stop          echo "test" | mail -s "testing queue" root         postqueue -p

输出结果中的第一行就说明了无法寄出的原因为 Mail system is down 

输出的信息主要为:

Queue ID:表示此封邮件队列的代表号 (ID),这个号码是给 MTA 看的,我们看不懂不要紧;

Size :这封信有多大容量 (bytes) 的意思;

Arrival Time:这封信什么时候进入队列的,并且可能会说明无法立即传送出去的原因;

Sender/Recipient:送信与收信者的电子邮件

事实上这封信是放置在 /var/spool/postfix 里面,由于信件内容已经编码为给MTA 看的资料排列, 所以你可以使用 postcat 来读出原信件的内容,cd /var/spool/postfix/maildrop

postcat 5CFBB21DB <==这个档名就是 Queue ID

named_attribute: rewrite_context=local <==分析 named (DNS) 的特性来自本机

sender_fullname: root <==发信者的大名与 email

sender: root

recipient: root   <==就是收件者!

如此一来就知道我们的MTA主机有多少未送出的信件,还有未送出信件的内容你也可以追踪到的,如果你想要我们的 postfix 立刻尝试将这些在队列当中的信件寄出去:

执行/etc/init.d/postfix restart              postfix flush           比较建议使用 postfix flush 

接下来,让我们先来处理一下收信的 MRA 服务器, 搞定后再来处理客户端的用户接口

防火墙设置  因为整个 MTA 主要是透过 SMTP (port 25) 进行信件传送的任务,因此,针对postfix 来说,只要放行 port 25 即可

vim /usr/local/virus/iptables/iptables.rule

# 找到底下这一行,并且将它批注拿掉

iptables -A INPUT -p TCP -i $EXTIF --dport 25 --sport 1024:65534 -j ACCEPT

/usr/local/virus/iptables/iptables.rule  这样就放行整个 Internet 对您服务器的 port 25 的读取

MRA 服务器: dovecot 设定

除非你想要架设 webmail 在你的 MTA 上头,否则,你的MTA收下了信件,你总得连上 MTA 去收信,收信要用的通讯协议pop3 以及 imap,这就是所谓的 MRA 服务器

CentOS 6.x 使用的是dovecot 这个软件来达成 MRA 的相关通讯协议的,但由于 pop3/imap 还有数据加密的版本,底下我们就依据是否加密 (SSL) 来设定 dovecot 

基础的 POP3/IMAP 设定

你得要先确定已经安装了 dovecot 这个软件。而这个软件的配置文件只有一个,就是 /etc/dovecot/dovecot.conf 。我们仅要启动 pop3/imap 而已,所以可以这样设定即可

yum install dovecot

vim /etc/dovecot/dovecot.conf

# 找到底下这一行,大约是在第 25 行左右的地方,复制新增一行内容如下:

#protocols = imap pop3 lmtp

protocols = imap pop3

vim /etc/dovecot/conf.d/10-ssl.conf     ssl = no<==将第 6 行改成这样

改完之后你就可以启动 dovecot,且检查看看 port 110/143 (pop3/imap) 有没有启动/etc/init.d/dovecot start,chkconfig dovecot on,netstat -tlnp | grep dovecot

搞定!这样就可以提供使用者来收信件,这里只提供基本的明码 pop3/imap 传输而已, 如果想要启动其他如 pop3s (传输加密机制) 协议时,就得要额外的设定

加密的 POP3s/IMAPs 设定:如果担心数据在传输过程会被窃取,或者是你的登入信息(账号与密码) 在使用,pop3/imap 时会被窃听, 那么这个 pop3s/imaps 就显的重要

似的, 其实我们都是透过 openssl 这个软件提供的 SSL 加密机制来进行数据的加密传输。方式很简单,预设的情况下,CentOS 已经提供了 SSL 凭证范例文件给我们使用了。

如果你一点都不想要使用预设的凭证,那么我们就来自己建一个,# 1. 建立凭证:到系统提供的 /etc/pki/tls/certs/ 目录下建立所需要的 pem凭证档:

cd /etc/pki/tls/certs/      make vbirddovecot.pem

# 2. 因为担心 SELinux 的问题,所以建议将 pem 档案放置到系统默认的目录去较佳!

mv vbirddovecot.pem ../../dovecot/

restorecon -Rv ../../dovecot

# 3. 开始处理 dovecot.conf,只要 pop3s, imaps 不要明码传输的咯

vim /etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = yes <==第 9 行改成这样!取消批注

vim /etc/dovecot/conf.d/10-ssl.conf

ssl = required<==第 6 行改成这样

ssl_cert = </etc/pki/dovecot/vbirddovecot.pem <==12, 13 行变这样

ssl_key = </etc/pki/dovecot/vbirddovecot.pem

vim /etc/dovecot/conf.d/10-master.conf

inet_listener imap { port = 0 <== 15 行改成这样}

inet_listener pop3 { port = 0 <== 36 行改成这样}

# 4. 处理额外的 mail_location 设定值!很重要!否则网络收信会失败:

vim /etc/dovecot/conf.d/10-mail.conf

mail_location = mbox:~/mail:INBOX=/var/mail/%u <==第 30 行改这样

# 5. 重新启动 dovecot 并且观察 port 的变化: /etc/init.d/dovecot restart   netstat -tlnp | grep dovecot  , 最终你看到的 993 是 imaps 而 995 则是 pop3s

防火墙设置

上面的练习中,我们将 pop3/imap 关闭,转而打开 pop3s/imaps 了,,因此防火墙启动的埠口会不一样! 请依据您实际的案例来设定你所需要的防火墙才好。我们这里主要是开放

993, 995 两个埠口

vim /usr/local/virus/iptables/iptables.rule

# 大约在 180 行左右,新增底下两行去!

iptables -A INPUT -p TCP -i $EXTIF --dport 993 --sport 1024:65534 -j ACCEPT

iptables -A INPUT -p TCP -i $EXTIF --dport 995 --sport 1024:65534 -j ACCEPT

/usr/local/virus/iptables/iptables.rule  如果你的 pop3/imap 还是决定不加密的话,请将上面的 993/995 改成 143/110 即可

MUA 软件:客户端的收发信软件

Linux mail 

LInux的操作系统当中有一支可以进行收发信件的软件,那就是mail这个指令,这个指令是由 mailx 这个软件所提供的,由于 mail 是 Linux 系统的功能,所以即使你的 port 25

(smtp)没有启动,他还是可以使用的,只是该封邮件就只会被放到队列,而无法寄出去,底下我们来谈一谈最简单的 mail 用法

mail dmtsai@www.centos.vbird

Subject: Just test <==这里填写信件标题

This is a test email. <==底下为信件的内容

. <==注意,这一行只有小数点!代表结束输入之意! 

这样就可以将信件寄出去了!另外,早期的 mail server 是可以接受 IP 寄信的,举例来说: mail dmtsai@[192.168.100.254] ,记得 IP 要用中括号包起来。不过由于

受到垃圾邮件的影响, 现在这种方式几乎都无法成功的将信件寄出了

利用已经处理完毕的『纯文本档』寄出信件,这不是【附件夹带】的方式,因为在程序里编写信件很痛苦,可以使用数据流导向来将一个文件中的内容寄给别人,可以这样作:

mail -s 'My bashrc' dmtsai < ~/.bashrc

开始查阅接收的信件

同样的收信还是使用 mail。直接在提示字符之后输入 mail 时, 会主动的捉取使用者在 /var/spool/mail 底下的邮件信箱 (mailbox), 例如我 dmtsai 这个账号在输入 mail 后,

就会将 /var/spool/mail/dmtsai 这个档案的内容读出来并显示到屏幕上

输入mail 查看邮件,读信直接按Enter或输入数字按Enter,显示标题: (直接数入 h 或输入 h 数字),回复邮件: (直接输入 R ) ,删除邮件: (输入 d 数字)

储存邮件到档案: (输入 s 数字 文件名),离开 mail: (输入 q 或 x )

以『附件夹带』的方式寄信,你需要 uuencode 这个指令的帮忙,在 CentOS 当中这个指令属于sharutils ,请先利用 yum 来安装他吧,接下来你可以这样使用:

[root@www ~]# uuencode [实际档案] [信件中的檔名] | mail -s '标题' email

# 1. 将 /etc/hosts 以附件夹带的方式寄给 dmtsai

uuencode /etc/hosts myhosts | mail -s 'test encode' dmtsai 这样就能寄出去了,

不过,如果收下这封信件,同样的我们得要透过译码器来解碼 ,你得先将该档案存下来,然后这样做:

[dmtsai@www ~]$ mail

& s 11 test_encode

[dmtsai@www ~]$ uudecode test_encode -o decode

ll *code*

-rw-r--r--. 1 dmtsai dmtsai 380 Aug 9 15:15 decode <==译码后的正确数据

虽然 mail 这个指令不是挺好用的,不过至少他可以提供我们在 Linux 纯文本模式下的一个简单的收发信件功能! 不过,目前有个更棒的替代方案,那就是 mutt 这玩意儿

Linux mutt  mutt 除了可以仿真 mail 这个指令之外, 他还能够透过 pop3/imap 之类的协议去读取外部的信件,yum install mutt 安装好

直接以 mutt 进行寄送信件的动作:含快速附件夹带文件

mutt [-a 附加檔] [-i 内文档] [-b 秘密副本] [-c 一般副本]  > [-s 信件标题] email 地址

-a 附加檔:后面就是你想要传送给朋友的档案,是附加档案,不是信件内容

-i 内文档:就是信件的内文部分,先编写成为档案而已;

-b 秘密副本:原收件者不知道这封信还会寄给后面的那个秘密副本收件者;

-c 一般副本:原收件者会看到这封信还有传给哪位收件者;

-s 信件标题:这还需要解释吗?这封信的标头!

email 地址:就是原收件者的 email

# 1. 直接在线编写信件,然后寄给 dmtsai@www.centos.vbird 这个用户

mutt -s '一封测试信' dmtsai@www.centos.vbird

/root/Mail 不存在。 建立吗? ([yes]/no): y <==第一次用才会出现这个讯息

To: dmtsai@www.centos.vbird

Subject: 一封测试信

随便写写!随便看看~! <==会进入 vi 画面编辑!很棒

y:寄出 q:中断 t:To c:CC s:Subj a:附加档案 d:叙述  ?:求助 <== 按下 y 寄出

# 2. 将 /etc/hosts 当成信件内容寄给 dmtsai@www.centos.vbird 这个用户:mutt -s 'hosts' -i /etc/hosts dmtsai@www.centos.vbird 记得最终在 vim 底下要按下 :wq 来储存寄出

与 mail 在线编写文字不一样,mutt 竟然会呼叫 vi 让你去编辑你的信件,整个画面非常的直觉化!相当容易处理,如果需要附件夹带呢?尤其是夹带 binary program时,可以这样做:

# 1. 将 /usr/bin/passwd 当成附件夹带,寄给 dmtsai@www.centos.vbird 用户

mutt -s '附件' -a /usr/bin/passwd -- dmtsai@www.centos.vbird

看到上表中的附件底下那两行,I 代表的是直接附在信件内的内文, A 才是附加档案,不过你想要使用 mutt 来附加档案时,必须要有底下的注意事项才行:

1. -a filename 这个选项必须是在指令的最后面,如果上述的指令改写成:『 mutt -a /usr/bin/passwd -s "附件" ... 』就不行!会失败的

2. 在文件名与 email 地址之间需要加上两个连续减号『 -- 』才行!如同上面测试的指令模样!

以 mutt 来读不同通讯协议的信箱,与 mail 比较之下,mutt 可以直接透过网络的 pop3, imap 等通讯协议来读信,是相当优秀的一个功能

mutt [-f 信箱位置] -f 信箱位置:如果是 imaps 的信箱,可以这样:『 -f imaps://服务器的IP 』

# 1. 直接用 dmtsai 的身份读取本机的信箱内容: mutt

# 2. 在上面的信件 14 号内容反白后,直接按下 Enter 会出现如下画面!

# 3. 在上面画面按下 v 后,会出现相关的附件数据: 反白处按下 s 就能够储存附加档案,最后离开时,一直按下 q 

我用 root 的身份去收 dmtsai 的 imaps 信件,会是怎样的情况

# 1. 在服务器端必须要让 mail 这个群组能够使用 dmtsai 的家目录,所以要这样:

# 2. 开始在客户端登入 imaps 服务器取得 dmtsai 的新邮件与邮件文件夹,mutt -f imaps://www.centos.vbird 

在 www.centos.vbird 的使用者名称:dmtsai

dmtsai@www.centos.vbird 的密码: 

最终在密码设定正确后,你就会看到刚刚我们所看到的信件了,不过要注意的是,如果你的用户家目录在非正规目录, 那么可能会出现 SELinux 的错误,这时就得要重新修

订一下你的 SELinux 安全本文的类型,如此一来,我们就直接以文本模式来取得网络邮件信箱

Thunderbird 好用的跨平台 (Windows/Linux X) 软件

自由软件最大的好处之一就是该软件大多可以进行移植,也就是在任何操作系统上面几乎都能够执行该软件的意思 http://moztw.org/thunderbird/    ThunderBird (雷鸟)

以 dmtsai@www.centos.vbird 这个账号为范例来说明

由于是第一次启动,所以 thunderbird 里面没有任何识别数据。此时你可以填写你要在 email 上面让人家看到的数据, 以及包括你登入远程信箱的账号密码等信息

由于 Thunderbird 会尝试使用你输入的账号密码去登入远程服务器的 imaps 服务,所以就会出现如下图一般的凭证取得示意, 这时要按啥?当然是确认永久储存该凭证

确定凭证 OK、账号密码也 OK 的话,就可以开始使用 Thunderbird 啦!

由于是 imaps 的通讯协议,因此 Thunderbird 的内容会与服务器上面的 /var/spool/mail/dmtsai 这个信箱内容同步喔!不像 POP3 抓下来就删除服务器的信件! 真是好好用的软件

由于 gmail 等免费邮件的盛行,目前连 Openwebmail 自由软件都很少人安装了,几乎全部使用gmail, yahoo mail, hotmail 等的 web 接口的 MUA,根本没人在用本机端的 MUA 了

但是, 某些时刻某些过时的信件还是得要从web mail 上面捉下来,这时,Thunderbird 就派上用场

邮件服务器的进阶设定

在这一个小节当中,关于收信的过滤机制方面,底下主要针对 postfix 的邮件收下过滤处理,以及重新发送的 Relay 过程进行介绍,这两个过程在 postfix 的设定中,主要有几个重要

的项目管理:

smtpd_recipient_restrictions:recipient 是收件者的意思,这个设定值主要在管理『由本机所收下的信件』的功能,因此大部分的设定都是在进行邮件过滤以及是否为可信任邮件的意

思。 来源可以是 MTA 或 MUA 的意思

smtpd_client_restrictions:client 是客户端的意思,因此主要在管理客户端的来源是否可信任。 可以将非正规的 mail server 来信拒绝掉的!来源当然就是 MUA

smtpd_sender_restrictions:sender 是寄件人的意思,可以针对信件来源(对方邮件服务器) 来进行分析过滤的动作。来源理论上就是 MTA

邮件过滤一:用 postgrey 进行非正规 mail server 的垃圾信抵挡 

在邮件无法顺利寄出时该邮件会暂时放置到队列中一段时间, 并一直尝试将信件寄出的动作,预设直到五天后若还是无法寄出才会将信件退回。

根据这个合法与非法的邮件服务器运作流程而发展出一套所谓的曙光 (postgrey)软件, 你可以参考底下的几个说明来了解这个软件:

http://isg.ee.ethz.ch/tools/postgrey/         http://www.postfix.org/SMTPD_POLICY_README.html

基本上 postgrey 主要的功能是在记录发信来源而已,若发信来源同一封信第一次寄来时, postgrey 预设会抵挡他,并且将来源地址记录起来,在约 5 分钟后,若该

信件又传来一次时, 则该信件会被收下来。如此则可以杜绝非发邮件服务器单次发送的问题,但对于你确定合法的主机则可以开放所谓的『白名单 (whitelist) 』来优先通过而不抵挡

主要是这样进行的:(参考http://projects.puremagic.com/greylisting/whitepaper.html)

1. 确认发信来源是否在白名单中,若是则予以通过;

2. 确认收信者是否在白名单中,若是则予以通过;

3. 确定这封信是否已经被记录起来呢?放行的依据是:

4.若无此信件的记录,则将发信地址记录起来,并将信件退回;

5. 若有此信件的记录,但是记录的时间尚未超过指定的时间 (预设 5分钟),则依旧退回信件;

6. 若有信件的记录,且记录时间已超过指定的时间,则予以通过;

整个过程简单的来说就是这样而已。不过为了要快速的达成 postgrey 的『记录』能力,所以数据库系统又是不可避免的东西。 且 postgrey 是由 perl 写成的,你可

能也需要加入很多相依的 perl 模块才行。总的来说,你需要的软件至少要有:

BerkeleyDB: 包括 db4, db4-utils, db4-devel 等软件:

Perl: 使用 yum install perl 即可;

Perl 模块: perl-Net-DNS 是 CentOS 本身有提供的,其他没有提供的可以到 http://rpmfind.net/去搜寻下载

安装流程:  官网介绍:http://wiki.centos.org/HowTos/postgrey   在线安装软件:http://wiki.centos.org/AdditionalResources/Repositories/RPMForge

http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm 这个软件且放置到 /root 底下,然后这样做:

rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt

rpm -ivh rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

yum install postgrey

上述的动作在进行数字签名档案的安装、yum 配置文件的建置,以及最终将 postgrey透过网络安装起来而已,整个流程简单到不行呢!最重要的是,找到适合你的 yum 配

置文件软件来安装就是了

启动与设定方式: 因为 postgrey 是额外的一个软件,因此我们还是得要将它视为一个服务来启动,同时 postgrey 是本机的 socket 服务而非网络服务,他只提供给本机的 postfix 来

作为一个外挂,因此观察的方式并不是观察 TCP/UDP 之类的联机,

/etc/init.d/postgrey start

chkconfig postgrey on

netstat -anlp | grep postgrey

上表中最重要的就是那个输出的 path 项目啦!/var/spool/postfix/postgrey/socket 是用来做为程序之间的数据交换, 这也是我们的 postfix 要将信件交给 postgrey 处

理的一个相当重要的接口,有了这个数据后,接下来我们才能够开始修改 postfix 的main.cf

vim /etc/postfix/main.cf

# 1. 更改 postfix 的 main.cf 主配置文件资料:

# 一般来说, smtpd_recipient_restrictions 得要手动加入才会更动默认值:

smtpd_recipient_restrictions = permit_mynetworks, <==默认值,允许来自 mynetworks设定值的来源

reject_unknown_sender_domain, <==拒绝不明的来源网域 (限制来源MTA )

reject_unknown_recipient_domain, <==拒绝不明的收件者 (限制目标MTA)

reject_unauth_destination, <==默认值,拒绝不信任的目标

check_policy_service unix:/var/spool/postfix/postgrey/socket

# 重点是最后面那一行!就是指定使用 unix socket 来连接到 postgrey 之意

# 2. 更改 postgrey 的抵挡秒数,建议将原本的 300 秒 (五分钟) 改为 60秒较佳:

vim /etc/sysconfig/postgrey <==预设不存在,请手动建立

OPTIONS="--unix=/var/spool/postfix/postgrey/socket --delay=60"

# 重点是 --delay 要抵挡几秒钟,默认值为 300 秒,我们这里改为 60 秒等待

/etc/init.d/postfix restart

/etc/init.d/postgrey restart

由于过往的经验指出,等待 5 分钟有时候会让某些正常的 mail server 也会被拒绝好久,对于紧急的信件来说,这样有点不妥。 因此,CentOS 官网也建议将这个数值改小

一点,例如 60 秒即可。反正,不正常的信件第一次寄就会被拒绝, 等多久似乎也不是这么重要了。然后,在 postfix 的设定中,默认值仅有允许本机设定(permit_mynetworks) 以及拒绝

非信任的目标 (reject_unauth_destination), 根据经验,先加入拒绝发件人 (MTA) 的不明网域以及拒绝收件者的不明网域的信件了,这样也能够减少一堆不明的广告信件。最终才加入

postgrey 的分析

要注意的是,smtpd_recipient_restrictions 里面的设定是有顺序之分的!以上面的流程来说, 只要来自信任用户,该封信件就会被收下会转递,然后不明的来源与

目标会被拒绝,不受信任的目标也会被拒绝, 这些流程完毕之后,才开始正常信件的postgrey 机制处理!这样其实已经可以克服一堆广告信了! 接下来,让我们测试看看

postgrey 有没有正常运作!请在外部寄一封信到本机来吧!例如寄给dmtsai@www.centos.vbird, 然后查一下 /var/log/maillog 的内容看看

事先取消 permit_mynetworks 之后才开始测试,测试完毕后又将permit_mynetworks 加回来才好!这样才能看到上述的资料。 这表示 postgrey 已经开始顺利运作了!

并且来源主机的相关记录也已经记载在/var/spool/postfix/postgrey/ 目录下啰!如此一来您的 postfix 将可以透过postgrey 来挡掉一些莫名其妙的广告信

设定不受管制的白名单:

不过 postgrey 也是有缺点的,怎么说呢?因为 postgrey 预设会先将信件退回去, 所以你的信件就可能会发生延迟的问题, 延迟的时间可能是数分钟到数小时,端看你

的 MTA 设定而定。如果你想要让『某些信任的邮件主机不需要经过 postgrey 的抵挡机制』时,就得要开放白名单

白名单的开启也很简单啊,直接编写 /etc/postfix/postgrey_whitelist_clients这个档案即可。 假设你要让鸟哥的邮件服务器可以自由的将信寄到你的 MTA 的话,那

么你可以在这个档案内加入这一行:

vim /etc/postfix/postgrey_whitelist_clients

mail.vbird.idv.tw

www.centos.vbird

# 将主机名写进去吧!

/etc/init.d/postgrey restart

如果你还有更多信任的 MTA 服务器的话,将他写入这个档案当中!那他就可以略过postgrey 的分析。

邮件过滤二:关于黑名单的抵挡机制

讲到的 Open Relay 的问题吧?你的 MTA 可千万不能成为 OpenRelay 的状况,否则对你的网络与『信用』影响很大,一般来说,只要是 Open Relay的邮件 MTA 都会被列入黑名单

当中, 例如台湾地区的学术网络黑名单以及因特网社会上提供的黑名单数据库: http://rs.edu.tw/tanet/spam.html  http://cbl.abuseat.org/

既然黑名单数据库里面的 mail server 本身就是有问题的邮件主机,那么当黑名单里面的主机想要跟我的 mail server 联机时,我当然可以『合理的怀疑该信件是有

问题的! 您说是吧! 所以来自黑名单或者是要送至黑名单的信件最好是不要接受

您当然可以自行前往该网站将有问题的主机列表给他加入自己的邮件主机抵挡机制当中, 不过就是不太人性化!既然因特网社会已经提供了黑名单数据库了,我们就

可以利用这个数据库来抵挡嘛! 在决定是否进行 Relay 之前,先要求我们的 postfix前往追踪黑名单的数据库, 若目标的 IP 或主机名是黑名单的一员,则我们就将该信件拒绝

Postfix 设定黑名单检验真的很简单,你只要这样做即可:

vim /etc/postfix/main.cf

smtpd_recipient_restrictions =

permit_mynetworks,

reject_unknown_sender_domain,

reject_unknown_recipient_domain,

reject_unauth_destination,

reject_rbl_client cbl.abuseat.org,

reject_rbl_client bl.spamcop.net,

reject_rbl_client cblless.anti-spam.org.cn,

reject_rbl_client sbl-xbl.spamhaus.org,

check_policy_service unix:/var/spool/postfix/postgrey/socket

# 请注意整个设定值的顺序才好!在 postgrey 之前先检查是否为黑名单

smtpd_client_restrictions =

check_client_access hash:/etc/postfix/access,

reject_rbl_client cbl.abuseat.org,

reject_rbl_client bl.spamcop.net,

reject_rbl_client cblless.anti-spam.org.cn,

reject_rbl_client sbl-xbl.spamhaus.org

# 这个设定项目则是与客户端有关的设定!拒绝客户端本身就是黑名单的一员!

smtpd_sender_restrictions = reject_non_fqdn_sender, reject_unknown_sender_domain

# 此项目则在抵挡不明的送件者主机网域啰!与 DNS 有关系的

/etc/init.d/postfix restart

上表当中的特殊字体部分『reject_rbl_client』是 postfix 内的一个设定项目,后面可以接因特网上提供的黑名单!您得要注意的是,这个黑名单数据库可能会持续的变动,

请您先以 dig 的方式检查每个数据库是否真的存在, 如果存在才加以设定在您的主机上头啊!(因为因特网上头很多文献所提供的黑名单数据库似乎已经不再持续服务的样子!)

检查你的邮件服务器是否在黑名单当中?

既然黑名单数据库所记录的是不受欢迎的来源与目标 MTA ,那么您的 MTA 当然最好不要在该数据库中嘛! 同时这些数据库通常也都有提供检测的功能,所以你也可以

用该功能来检查你的主机是否『记录有案』呢? 你可以这样处理的:

1. 是否已在黑名单数据库中: 确认的方法很简单,直接到『http://cbl.abuseat.org/lookup.cgi 』输入您的主机名或者是 IP ,就可以检查是否已经在黑名单当中;

2. 是否具有 Open Relay: 如果要测试你的主机有没有 Open Relay ,直接到『http://rs.edu.tw/tanet/spam.html 』这个网页, 在这个网页的最下方可以输入你的 IP 来检查,注意喔,不

要使用别人的 email IP 吶! 此时该主机会发出一封 mail 的测试信看看你的 mail server 会不会主动的代转, 然后将结果回报给您。要注意的是,回传的网页可能有编码的问题,如果

出现乱码时,请调整为 big5 编码即可

3. 如何移除:如果被检查出,您的主机已经在黑名单当中,那么请立刻将 Open Relay 的功能关闭,改善你的 Mail Server 之后,你可能还要到各个主要的 Open Relay 网站进行移除的

工作。如果是学术网络的话, 请与您单位的管理员联络。至于一般常见的黑名单数据库则通常会主动的帮您移除,只不过需要一些时间的测试就是了。

邮件过滤三:基础的邮件过滤机制

在整封信的传送流程当中,客户端若通过主机的重重限制后,最终应该可以到达邮件队列当中。 而由队列当中要送出去或者是直接送到 mailbox 就得要透过 MDA 的处

理。MDA 可以加挂很多机制呢! 尤其是他可以过滤某些特殊字眼的广告信件或病毒信件呢! MDA 可以透过分析整封信件的内容 (包括标头以及内文) 来撷取有问题的关键词,然后决

定这封信的『命运』说!

咱们的 postfix 已经有内建可以分析标头或者是内文的过滤机制了,那就是/etc/postfix/ 目录下的 header_checks 以及 body_checks 这两个档案啊!在预设的

情况下这两个档案不会被 postfix 使用, 你必需要用底下的设定来启用他:

vim /etc/postfix/main.cf

header_checks = regexp:/etc/postfix/header_checks

body_checks = regexp:/etc/postfix/body_checks

# 那个 regexp 代表的是『使用正规表示法』的意思

touch /etc/postfix/header_checks

touch /etc/postfix/body_checks

/etc/init.d/postfix restart

接下来你必需要自行处理 header_checks 以及 body_checks 的规则设定,在设定前请您确认『 你对于正规表示法是熟悉的 』才行!因为很多信息都必需要透过正规表示法

来处理啦!然后开始设定的依据是:

只要是 # 代表该行为批注,系统或直接略过;

在默认的规则当中,大小写是视为相同的;

规则的设定方法为:

/规则/ 动作 显示在登录文件里面的讯息

请注意,要使用两个斜线『 / 』将规则包起来,举个例子来说明:例如我想要 (1)抵挡掉标题为 A funny game 的信件,(2)并且在登录文件里面显示drop header deny,则可以在

header_chekcs 档案中可以这样写:/^Subject:.*A funny game/  DISCARD  drop header deny

关于动作有底下几个动作:

REJECT :将该封信件退回给原发信者;

WARN : 将信件收下来, 但是将该封信的基本数据记录在登录文件内;

DISCARD:将该封信件丢弃,并不给予原发信者回应!

自己可以作一些规则的比对,只不过.....效能不好!如果您有兴趣的话,可以自行下载来看看, 不过,使用的后果请自行评估!因为每个人的环境都不一样

header: http://linux.vbird.org/linux_server/0380mail/header_checks

body: http://linux.vbird.org/linux_server/0380mail/body_checks

记得,如果你自行修改过这两个档案后,务必要检查一下语法才行! postmap -q - regexp:/etc/postfix/body_checks < /etc/postfix/body_checks

如果没有出现任何错误,那就表示您的设定值应该没有问题,你也可以使用procmail 这个抵挡的小程序来处理。 不过,鸟哥觉得 procmail 在大型邮件主机当中,

分析的过程太过于繁杂,会消耗很多 CPU 资源,因此后来都没有使用这玩意儿

非信任来源的 Relay:开放 SMTP 身份认证

由 MUA 透过 MTA 来寄发信件时 (具有 Relay 的动作时),理论上 MTA 必需要开放信任用户来源才行,这就是为啥我们必需要在 main.cf 里头设定 smtpd_recipient_restrictions 那个

设定项目的原因了(mynetworks)!不过人总有不方便的时候, 举例来说,如果你的客户端使用的是拨接制的 ADSL 所以每次取得的 IP 都非固定,那如何让你的用户使用你的 MTA

这个时候 SMTP认证或许有点帮助。

什么是 SMTP 呢?就是让你在想要使用 MTA 的 port 25 (SMTP 协议) 时,得要输入账号密码才能够使用的意思!既然有了这个认证的功能,于是乎,你就可以不用设定

MTA 的信任用户项目! 举例来说, 在本章提到的环境下, 你可以不用设定 mynetworks 这个设定值啊!启动 SMTP 认证,让你的用户需要输入账密才能 Relay !那如何让 SMTP

支持身份认证咱们的 CentOS 已经有提供内建的认证模块,那就是 Cyrus SASL 这个软件的帮忙

Cyrus SASL (http://cyrusimap.web.cmu.edu/),在 SMTP 认证方面,Cyrus 主要提供了 saslauthd 这个服务来进行账号密码的比对动作,也就是说:当有任何人想要

进行邮件转递功能时, Postfix 会联络 saslauthd 请其代为检查账号密码,若比对通过则允许客户端开始转寄信件

好了,如果你想要使用最简单的方式,就是直接透过 Linux 自己的帐密来进行SMTP 认证功能,而不使用其他如 SQL 数据库的身份认证时,在 CentOS 当中你应该要这样做:

1. 安装 cyrus-sasl, cyrus-sasl-plain, cyrus-sasl-md5 等软件;

2. 启动 saslauthd 这个服务;

3. 设定 main.cf 让 postfix 可以与 saslauthd 联系;

4. 客户端必需要在寄信时设定『邮件主机认证』功能。

如此一来客户端才能够启动 SMTP AUTH 喔!关于软件安装方面,请使用 yum 直接安装吧!不再多啰唆!底下我们由启动 saslauthd 这个服务开始谈起

启动 saslauthd 服务:进行 SMTP 明码身份验证功能

saslauthd 是 Cyrus-SASL 提供的一个账号密码管理机制,他能够进行挺多的数据库验证功能,不过这里我们仅使用最单纯简单的明码验证 (PLAIN)!如果我们想要直

接使用 Linux 系统上面的用户信息, 也就是 /etc/passwd, /etc/shadow 所记载的账号密码相关信息时,可以使用 saslauthd 提供的『 shadow 』这个机制, 当然也能使用『 pam 』

啦!更多的 saslauthd 联机至 MTA 的机制请『 man saslauthd 』来查阅吧。 由于我们的帐密可能来自网络其他类似 NIS 服务器,因此这里建议可以使用 pam模块

saslauthd 的启动真是好简单,首先你必需要选择密码管理机制,这个可以使用底下的方式处理:

# 1. 先了解你的 saslauthd 有支持哪些密码管理机制:

saslauthd -v

saslauthd 2.1.23

authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap

# 上列的特殊字体部分就是有支持的!我们要直接用 Linux 本机的用户信息, # 所以用 pam 即可,当然也能够使用 shadow 啦

# 2. 在 saslauthd 配置文件中,选定 pam 的验证机制: [root@www ~]# vim /etc/sysconfig/saslauthd   MECH=pam <==其实这也是默认值啊!

# 这也是默认值,有的朋友喜欢单纯的 shadow 机制,也可以啦!

# 3. 那就启动吧!

[root@www ~]# /etc/init.d/saslauthd start

[root@www ~]# chkconfig saslauthd on

之后我们必需要告知 Cyrus 这个咚咚使用来提供 SMTP 服务的程序为 saslauthd 才行,设定的方法很简单:vim /etc/sasl2/smtpd.conf

log_level: 3  <==登录文件信息等级的设定,设定 3 即可

pwcheck_method: saslauthd <==就是选择什么服务来负责密码的比对啊

mech_list: plain login <==那么支持的机制有哪些之意

我们可以使用 mech_list 列出特定支持的机制。而且 saslauthd 是个很简单的账号密码管理服务,你几乎不需要进行什么额外的设定,直接启动他就生效了

更改 main.cf 的设定项目:让 postfix 支持 SMTP 身份验证

那我们的 postfix 该如何处理呢?其实设定真的很简单,只要这样做就好了:

vim /etc/postfix/main.cf

# 在本档案最后面增加这些与 SASL 有关的设定资料:

smtpd_sasl_auth_enable = yes

smtpd_sasl_security_options = noanonymous

broken_sasl_auth_clients = yes

# 然后找到跟 relay 有关的设定项目,增加一段允许 SMTP 认证的字样:

smtpd_recipient_restrictions =

permit_mynetworks,

permit_sasl_authenticated, <==重点在这里!注意顺序!

reject_unknown_sender_domain,

reject_unknown_recipient_domain,

reject_unauth_destination,

reject_rbl_client cbl.abuseat.org,

reject_rbl_client bl.spamcop.net,

reject_rbl_client cblless.anti-spam.org.cn,

reject_rbl_client sbl-xbl.spamhaus.org,

check_policy_service unix:/var/spool/postfix/postgrey/socket

/etc/init.d/postfix restart

上面关于 SASL 的各个项目的意义是这样的:

smtpd_sasl_auth_enable:设定是否要启动 sasl 认证的意思,如果设定启动后 postfix 会主动去加载 cyrus sasl 的函式库, 而该函式库会依据 /etc/sasl2/smtpd.conf 的设定

来连结到正确的管理账号与密码的服务

smtpd_sasl_security_options 由于不想要让匿名者可以登入使用 SMTP 的 Relay 功能,于是这个项目中只要设定 noanonymous 即可

broken_sasl_auth_clients 这个是针对早期非正规 MUA 的设定项目,因为早期软件开发商在开发 MUA 时没有参考通讯协议标准, 所以造成在 SMTP 认证时可能会发生的一些困扰

。这些有问题的 MUA 例如 MS 的 outlook express 第四版就是这样! 后来的版本应该没有这个问题。所以这个设定值你也可以不要设定

smtpd_recipient_restrictions 最重要的就是这里啦!我们的 sasl 认证可以放在第二行,在局域网络这个可信任区域的后面加以认证。 上表的设定意义是:局域网络内的 MUA 不需要

认证也能够进行 relay ,而非区网内的其他来源才需要进行 SMTP 认证之意。

设定完毕也重新启动 postfix 之后,我们先来测试看看是否真的提供认证了?   telnet localhost 25

250-AUTH LOGIN PLAIN <==你得要看到这两行才行呦!

在客户端启动支持 SMTP 身份验证的功能:以 thunderbird 设定为例

既然已经在 MTA 设定了 SMTP 身份验证,那么我们 MUA 当然要传送账号、密码给MTA 才能通过 SMTP 的验证,所以,在 MUA 上面就得要加上一些额外的设定才行

我们依旧以 Thunderbird 来作为介绍,请打开 thunderbird,选择『工具』-->『账号设定』后会出现如下画面:

先选择 SMTP 寄件服务器;,然后选择所需要的寄件 SMTP 服务器后,点选编辑, 就会出现上图中的窗口项目。选择不安全传输的密码后,在填入你要使用的账号即可

如果要测试的话,记得此客户端不要在局域网络内,否则将不会经过认证的阶段,因为我们的设定以信任网域为优先

如果一切都顺利的话,那么当客户端以 SMTP 来验证时,你的登录档应该会出现类似底下的讯息才是: tail -n 100 /var/log/maillog | grep PLAIN

Aug 10 02:37:37 www postfix/smtpd[18655]: 01CD43712: client=vbirdwin7   [192.168.100.30], sasl_method=PLAIN, sasl_username=dmtsai

非固定 IP 邮件服务器的春天: relayhost

们上面提到,如果你要架设一部合法的 MTA 最好还是得要申请固定的 IP 以及正确对应的反解比较恰当。 但如果你一定要用浮动 IP 来架设你的 MTA 的话,也不是不可以啦,

尤其今年 (2011) 光纤到府已经可达 50M/5Mbps 的下载/上传速度了!你当然可以用家庭网络来架站啊!只不过你就得要透过上层 ISP 所提供的 relay 权限

当你的 MTA 要传信件给目标 MTA 时,如果直接传给目标 MTA,由于你的 IP 可能是非固定的,因此对方 MTA 恐怕会把你当成是垃圾来源!那如果我们可以透过 ISP 进

行转递,当你要传给目标 MTA 时:先将信件交给妳的 ISP,因为你是 ISP 的客户,通常来信都会被 ISP 接受,因此这个时候这封信就会被你的ISP 给 relay 出去;

被 ISP 所 relay 的信件到目标 MTA 时,对方会判断是来自那部 ISP 的 MTA,当然是合法的 mail server, 所以该封信件就毫无疑问的被收下

不过想要以此架构来架设你的 MTA 仍有许多需要注意的地方:

你还是得要有一个合法的主机名,若要省钱,可以使用 DDNS 来处理;

你上层的 ISP 所提供的 MTA 必需要有提供你所在 IP 的 relay 权限;

你不能使用自定义的内部 DNS 架构了,因为所有 relay 的信都会被送至ISP 的 MTA

尤其是最后一点,因为所有外送的信件全部都会被送到 ISP 处,所以像我们之前自己玩的 centos.vbird 这种非合法的领域数据就没用了!为什么呢?你想想看,如果

你要将信件送给 www.centos.vbird, 但由于上述 relayhost 的功能,所以这封信会被传到 ISP 的 MTA 来处理, ISP 的 MTA 会不会认识你的 centos.vbird

说是挺难的,做起来却很简单,只要在 main.cf 里面加设一段数据即可。 假设你的环境是台湾地区的 hinet 所提供的用户,而 hinet 提供的邮件主机为

ms1.hinet.net , 则你可以直接这样设定vim /etc/postfix/main.cf

# 加入底下这一行就对啦!注意那个中括号!

relayhost = [ms1.hinet.net]

/etc/init.d/postfix restart

之后你只要尝试寄一封信出去看看,就会了解这封信是如何寄送的了。看一下登录档的内容会像这样:tail -n 20 /var/log/maillog

经由上层 ISP 来转寄啦!如此一来,你的 MTA 感觉上就似乎是部合法的 MTA,不过,可别利用这个权限来滥发广告信,因为您所透过的那个 ISP 邮件主机可是有

记录你的 IP 来源, 如果你乱来的话,后果可是不堪设想

其他设定小技巧

除了之前谈到的几个主要的设定之外, postfix 还有提供一些不错的设定要给大家使用的

单封信件与单个邮件信箱的大小限制

在预设的情况下,postfix 可接受的单封信件最大容量为 10MBytes ,不过这个数值我们是可以更改的, 动作很简单:

 vim /etc/postfix/main.cf

message_size_limit =40000000

postfix reload

上面的单位是 bytes,所以我将单封信件可接受大小改为 40MByte 的意思啦,请按照你的环境来规定这个数值。 而从前我们要管制 /var/spool/mail/account 大多是使用

文件系统内的 quota 来达成, 现在的 postfix 不需要,可以这样做:vim /etc/postfix/main.cf

mailbox_size_limit = 1000000000  postfix reload  我给每个人 1GB 的空间

寄件备份:SMTP 自动转寄一份到备份匣

收件备份我们知道可以使用 /etc/aliases 来处理的, 但是如果想要送件也备份,利用底下的方式即可:

vim /etc/postfix/main.cf      always_bcc = some@host.name

[root@www ~]# postfix reload

如此一来任何人寄出的信件都会复制一份给 some@host.name 那个信箱。不过,除非您的公司很重视一些商业机密, 并且已经公告过所有同仁,否则进行这个设定值,

个人认为侵犯隐私权很严重

配置文件的权限问题:权限错误会不能启动 postfix

这部份我们以 Sendmail 官方网站的建议来说明喔!其实也适用于 postfix 的啦!其中,大部分是在于『目录与档案权限』的设定要求上面

请确定 /etc/aliases 这个档案的权限,仅能由系统信任的账号来修改,通常其权限为 644 ;

请确定 Mail server 读取的数据库 (多半在 /etc/mail/ 或/etc/postfix/ 底下的 *.db 档案),例如 mailertable, access,virtusertable 等等,仅能由系统信任的用户读取,其他一概不能读取,

通常权限为 640

系统的队列目录 (/var/spool/mqueue 或 /var/spool/postfix) 仅允许系统读取,通常权限为 700 

请确定 ~/.forward 这个档案的权限也不能设定成为任何人均可查阅的权限,否则您的 e-mail 数据可能会被窃取

总之,一般用户能够不用 ~/.forward 与 aliases 的功能,就不要使用!

不过整体的使用上还是需要身为网站管理员的您多费心!多多观察登录档

备份资料:与 mail 有关的目录是哪些

不管什么时候,备份总是重要的!那么如果我是单纯的 Mail Server 而已,我需要的备份数据有哪些?

/etc/passwd, /etc/shadow, /etc/group 等与账号有关的资料

/etc/mail, /etc/postfix/ 底下的所有档案数据

/etc/aliases 等等 MTA 相关档案

/home 底下的所有用户数据;

/var/spool/mail 底下的档案与 /var/spool/postfix 邮件队列档案

其他如广告软件、病毒扫瞄软件等等的设定与定义档

错误检查:查出不能启动 postfix 的问题流程

虽然 Mail 很方便, 但是仍然会有无法将信件寄出的时候!如果您已经设定好 MTA了,但是总是无法将邮件寄出去,那可能是什么问题呢?你可以这样追踪看看:

1. 关于硬件配备: 例如,是否没有驱动网卡?是否调制解调器出问题?是否 hub 热当啦?是否路由器停止服务等等的!

2. 关于网络参数的问题: 如果连不上 Internet ,那么哪里来的 Mail Server 呢?所以请先确认你的网络已经正常的启用了! 关于网络的确认问题

3. 关于服务的问题:  请务必确认与 mail server 有关的埠口已经顺利启动!例如 port 25, 110, 143,993, 995 等等,使用 netstat 指令即可了解是否已经启动该服务

4. 关于防火墙的问题: 很多时候,很多朋友使用 Red Hat 或者其他 Linux distribution 提供的防火墙设定软件,结果忘了启动 port 25 与 port 110 的设定,导致无法收发信件!请特别留

意这个问题喔!可以使用 iptables 来检查是否已经启用该 port

5. 关于配置文件的问题: 在启动 postfix 或者是 sendmail 之后,在登录档当中仔细看看有无错误讯息发生? 通常如果设定数据不对,在登录文件当中都会有记载错误的地方

6. 其他档案的设定问题: (1)如果发现只有某个 domain 可以收信,其他的同一主机的 domain 无法收信,需要检查 $mydestination 的设定值才行; (2)如果发现邮件被挡下来了!而且老

是显示 reject 的字样,那么可能被 access 挡住了; (3)如果发现邮件队列(mailq) 存在很多的邮件,可能是 DNS 死掉了,请检查 /etc/resolv.conf 的 设定是否正确

7. 其他可能的问题: 最常发生的就是认证的问题了!这是由于使用者没有在 MUA 上面设定『我的邮件需要认证』的选项啦! 请叫你的用户赶紧勾选

8. 还是不知道问题的解决方案:如果还是查不出问题的话,那么请务必检查您的 /var/log/maillog (有的时候 是 /var/log/mail ,这个要看 /etc/syslog.conf 的设定),当你寄出一封信的时

候,例如 dmtsai 寄给 bird2@www.centos.vbird 时,那么 maillog 档案里面会显示出两行,一行为 from dmtsai 一行为 to bird2@www.centos.vbird, 也就是『我由哪里收到信,而这封

信会寄到哪里去!』的意思,由这两行就可以了解问题了!尤其是 to 的那一行,里面包含了相当多的有用信息,包括邮件无法传送的错误原因的纪录。

















4. 关于防火墙的问题:



















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































 ,以及 SMTP after POP 两种,



2013-05-02 15:41:11 lg831229 阅读数 1724
邮件服务基础知识  
    邮件服务涉及两个协议:SMTP和POP3。 
    SMTP是Simple Message Transfer Protocol(简单邮件传输协议)的缩写,默认端口是25。SMTP主要负责邮件的转发,以及接收其他邮件服务器发来的邮件。
 
    POP3是Post Office Protocol3(邮局协议3)的缩写,默认端口是110。邮件客户端使用POP3协议连接邮件服务器收邮件。
  此外,邮件服务还涉及域名里的MX记录。MX(Mail Exchanger)记录是邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。例如,当Internet上的某用户要发一封信给 webmaster@comexe.cn 时,该用户的计算机将通过DNS查找comexe.cn这个域名的MX记录,如果MX记录存在,用户计算机就将邮件发送到MX记录所指定的邮件服务器上。
  MX记录不一定要指向本域的机器。例如,dns0755.net这个域的MX记录,可以设置为“mail.comexe.com.cn”。这样,所有发给username@dns0755.net的邮件,会被发送到mail.comexe.com.cn这台服务器上。如果邮局域名与机器域名相同,不需要设置MX记录。
公网用户安装设置方法  
一、下载MDaemon并安装 
    从MDaemon的官方网站 http://www.mdaemon.com/ 或其他软件下载网站下载MDaemon。下载后,使用默认选项安装。
 
 
二、设置MDaemon
    点击“开始”->“程序”->“MDaemon”->“Start MDaemon”启动MDaemon。
    在MDaemon菜单里选择“Setup”->“Primary domain”。
  
    在“Domain name”和“HELLO domain”里填入域名。点击“确定”。
   
    在MDaemon菜单里选择“Accounts”->“Account manager”,弹出帐号管理窗口:
   
     在帐号管理窗口里点击“New”,弹出帐号编辑窗口:
  
    在“Full name”里输入帐号全名,在“Mailbox name”里输入邮箱帐号,在“Account password”里输入帐号密码。点击“确定”。
    安全配置:关闭OpenRelay,启用SMTP身份验证,防止邮件服务器被人用来发垃圾邮件。请在MDaemon里选择“Setup”-> “Security settings”->“Relay...”->“Relay Settings”,如下图,把打勾的选项选上:
     
   至此,MDaemon配置完成。之后,就可以配置邮件客户端(例如OutLook、FoxMail),利用新建的帐号来收发邮件。
  MDaemon还提供了WorldClient,一个基于WEB界面的邮件管理工具(WebMail)。MDaemon的WebMail是一个单独的Web服务器,不需要IIS、Apache等Web服务器,可以单独运行。默认端口是3000。在浏览器里输入 http://user.dns0755.net:3000/ 就可以进入WebMail。
 
  另外,WorldClient也可以在IIS下运行。让WorldClient在IIS下运行,可以少打开一个端口。建议使用端口映射的内网用户采取这种方式。设置方法如下:
 
  1. 配置好IIS。进入MDaemon的WorldClient目录“C:\MDaemon\WorldClient”,在“HTML”子目录上按鼠标右键,选择“共享”->“Web共享”->“共享这个文件夹”,输入别名(例如“mail”),在“应用程序许可”里点击“执行”。
  2. 进入“C:\MDaemon”目录,在“Users”子目录上按鼠标右键,选择“属性”->“安全”->“添加”,双击“Everyone”,点击确定,回到“属性”窗口,点击“Everyone”,在下面的“完全控制”右边点击“允许”。
  3. 进入“控制面板”->“管理工具”->“Internet信息服务器”->“默认Web站点”,在“mail”上按鼠标4. 右键,选择“属性”->“文档”->“添加”,输入文件名“WorldClient.dll”。
    启动MDaemon,选择“Setup”->“WorldClient”,选中“WorldClient is running under IIS”。
    之后,在浏览器里输入 http://user.dns0755.net/mail/ 就可以进入WorldClient。
2017-08-29 15:49:16 xtjie 阅读数 2584

          去年配置一次,没有成功,没想到配置一个免费的邮件服务器,会那么复杂。前些天碰巧在GIT上看到有人做了一个dock image,把邮件服务器的各种程序打包,配好了,就又勾起了再一次配置邮箱服务器的想法,因为在vps上使用了docker部署应用,所以使用环境是现成的,把docker image拉下来,运行很简单,但还是需要配置许多东西,这中间停了一段时间,浏览各种邮箱提供商的产品,竟发现,邮箱服务比租一个vps主机还要贵许多。坚持着把邮件服务器配置成功。

        根据git上的说明,配置完成后,第一个问题,不能在foxmail上创建邮箱,日志里提示,鉴权密码不一致,反复的试验,删除邮箱、创建邮箱,就是不成功,看git上提交的issue,在docker-compose.yml里加上:restart: always,SSL_TYPE=letsencrypt,重启docker,因linode vps主机以ipv6地址为主,又去掉ipv6,操作linode的设置,不让linoe创建网络配置,不知这一步是否起了作用,反正也操作了一变,最终能在fomailh 创建邮箱了。

        第二个问题,不能收邮件,提示找不到域名,又重新在dns服务器上配置域名,原先mx记录用的A记录的名字,现改成mail的全域名的形式,收邮件成功。

 

 

      关闭linode的 ipv6,下面方法有效:

https://askubuntu.com/questions/1046057/disabling-ipv6-in-ubuntu-18-04-server

To clarify Stephan Rauch (for 18.04 only) - If using grub method to disable ipv6, the /etc/sysctl.conf configuration changes were not needed. I ended up leaving them in, (in case netplan is fixed in future) but all that is needed is the following:

sudo vi /etc/default/grub

Modify the GRUB_CMDLINEs to look like:

GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1"
GRUB_CMDLINE_LINUX="ipv6.disable=1"

Then execute:

sudo update-grub
sudo reboot

Enjoy ipv4.

 

2016-10-27 18:26:16 qq_33325153 阅读数 9025

前言:

最近写一个管理系统需要用到发送邮件的功能,曾经在javamail中使用过163的smtp服务,但是邮件要么被当成垃圾邮件,要么就是无法在一天之内发送超过20封,四天前我再次使用javamail时,发现我的163账号被冻结,允许我在厕所哭一会儿。然后换了qq的smtp服务,开启服务还需收短信费用,以为花了钱可以弄好,结果又发现,javamail和腾讯的smtp握手失败,已哭晕在厕所。最后忍无可忍只好自己搭一个邮件服务器。

牢骚发完了,开始进入主题,我使用的是centos6.5系统,以及和postfix邮件服务器,postfix邮件服务器的搭建需要使用到cyrus-sasl、postfix、dovecot,具体他们的功能我不在这里阐述,毕竟网上一大堆。
一、cyrus-sasl安装与配置

yum -y install cyrus-sasl

与jdk安装一样最好查看他的版本,如果有版本提示则就证明安装成功。

/usr/sbin/saslauthd -v

之后需要修改saslauthd文件,选择使用shadow方式认证。(温馨提示:可以在linux中使用/word去查找单词,如下面的MECH=shadow可以输入/MECH=查找)

vim /etc/sysconfig/saslauthd
SOCKETDIR=/var/run/saslauthd
MECH=shadow
FLAGS=

修改smtpd.conf

vim /etc/sasl2/smtpd.conf

添加如下代码

pwcheck_method: saslauthd
mech_list: plain login
log_level: 3
saslauthd_path:/var/run/saslauthd/mux

测试cyrus-sasl

创建系统用户root,并修改其密码,测试cyrus-sasl,如下:

useradd root &&echo 'rootmail'| passwd --stdin root
su - root
mkdir -p ~/mail/.imap/INBOX

启动cyrus-sasl

/etc/init.d/saslauthd start
chkconfig saslauthd on

现在来使用刚刚创建的用户进行认证测试,如下:
testsaslauthd -u root-p 'rootmail'

如果出现OK "Success"代表启动成功,否则请严格检查配置文件。

二、postfix安装与基本配置

yum -y install postfix

查看他的版本与配置

postconf -d | grep mail_version

修改main.cf文件

vim /etc/postfix/main.cf

并添加如下代码

queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
myhostname = mail.XXX.com        (这里是写你的服务器的域名前加上一个前缀,一般我们都喜欢用mail,域名必须可访问)
mydomain = XXX.com            (这里是写你的服务器的域名,域名必须可访问)
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost
local_recipient_maps =
unknown_local_recipient_reject_code = 550
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
debug_peer_level = 2
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.6.6/samples
readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES

启动postfix并设置开机自启

/etc/init.d/postfix start
chkconfig postfix on

查看postfix的监听端口,如果发现是25端口证明postfix已经成功启动

netstat -tunlp
ps -ef |grep postfix

我们来测试postfix是否可以发邮件

telnet mail.XXX.com 25
mail from:root@XXXX.com
rcpt to:xxxx@qq.com
data
XXXXXXXX
quit

登录邮箱发现确实有一封邮件。


这个时候,我们来试试javamail。

import java.util.List;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

public class MailUtils {
	/**
	 * 向用户发送邮件
	 */
	private static final long serialVersionUID = 1L;

	private MimeMessage mimeMsg; // MIME邮件对象

	private Session session; // 邮件会话对象

	private Properties props; // 系统属性

	private boolean needAuth = false; // smtp是否需要认证

	private String username; // smtp认证用户名和密码

	private String password;

	private Multipart mp; // Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成

	private String log;

	public MailUtils() {

	}

	public MailUtils(String smtp) {
		setSmtpHost(smtp);
		createMimeMessage();
	}

	public void setSmtpHost(String hostName) {
		System.out.println("设置系统属性:mail.smtp.host = " + hostName);
		if (props == null)
			props = System.getProperties(); // 获得系统属性对象
		props.put("mail.smtp.host", hostName); // 设置SMTP主机
		props.put("mail.smtp.localhost", "localHostAdress");
	}

	public boolean createMimeMessage() {
		try {
			System.out.println("准备获取邮件会话对象!");
			session = Session.getDefaultInstance(props, null); // 获得邮件会话对象
		} catch (Exception e) {
			log = "获取邮件会话对象时发生错误!" + e.toString();
			System.err.println(log);
			return false;
		}
		try {
			mimeMsg = new MimeMessage(session); // 创建MIME邮件对象
			mp = new MimeMultipart(); // mp 一个multipart对象
			// Multipart is a container that holds multiple body parts.
			return true;
		} catch (Exception e) {
			log = "创建MIME邮件对象失败!" + e;
			System.err.println(log);
			return false;
		}
	}

	public void setNeedAuth(boolean need) {
		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");
		}
	}

	public void setNamePass(String name, String pass) {
		System.out.println("程序得到用户名与密码");
		username = name;
		password = pass;
	}

	public boolean setSubject(String mailSubject) {
		System.out.println("设置邮件主题!");
		try {
			mimeMsg.setSubject(MimeUtility.encodeText(mailSubject,"utf-8","B"));
			return true;
		} catch (Exception e) {
			log = "设置邮件主题发生错误!"+e;
			System.err.println(log);
			return false;
		}
	}

	public boolean setBody(String mailBody) {
		try {
			System.out.println("设置邮件体格式");
			BodyPart bp = new MimeBodyPart();
			// 转换成中文格式
			bp.setContent(
					"<meta http-equiv=Content-Type content=text/html; charset=utf-8>"
							+ mailBody, "text/html;charset=utf-8");
			mp.addBodyPart(bp);
			return true;
		} catch (Exception e) {
			log = "设置邮件正文时发生错误!" + e;
			System.err.println(log);
			return false;
		}
	}

	public boolean setFiles(List<String> files){
		try{
			for(String s:files){
				MimeBodyPart mbp=new MimeBodyPart();
				FileDataSource fds=new FileDataSource(s); //得到数据源
				mbp.setDataHandler(new DataHandler(fds)); //得到附件本身并至入BodyPart
				mbp.setFileName(fds.getName());  //得到文件名同样至入BodyPart
				mp.addBodyPart(mbp);
			}
			return true;
		}catch(Exception e){
			log = "增加附件时出错:"+e;
			e.printStackTrace();
			return false;
		}
	}

	public boolean addFile(String path, String name){
		try{
			MimeBodyPart mbp=new MimeBodyPart();
			FileDataSource fds=new FileDataSource(path); //得到数据源
			mbp.setDataHandler(new DataHandler(fds)); //得到附件本身并至入BodyPart
			mbp.setFileName(MimeUtility.encodeText(name,"utf-8","B"));
			mp.addBodyPart(mbp);
			return true;
		}catch(Exception e){
			log = "增加附件时出错:"+e;
			e.printStackTrace();
			return false;
		}
	}

	public boolean setFrom(String from) {
		System.out.println("设置发信人!");
		try {
			mimeMsg.setFrom(new InternetAddress(from)); // 设置发信人
			return true;
		} catch (Exception e) {
			log = "设置发信人出错:"+e;
			return false;
		}
	}

	public boolean setTo(String to) {
		System.out.println("设置收信人");
		if (to == null)
			return false;
		try {
			mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress
					.parse(to));
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	public boolean setCopyTo(String copyto) {
		if (copyto == null)
			return false;
		try {
			mimeMsg.setRecipients(Message.RecipientType.CC,
					(Address[]) InternetAddress.parse(copyto));
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	public boolean sendout() {
		try {
			mimeMsg.setContent(mp);
			mimeMsg.saveChanges();
			System.out.println("正在发送邮件....");
			Session mailSession = Session.getInstance(props, null);
			Transport transport = mailSession.getTransport("smtp");
			transport.connect((String) props.get("mail.smtp.host"), username,
					password);
			transport.sendMessage(mimeMsg, mimeMsg.getRecipients(Message.RecipientType.TO));
			System.out.println("发送邮件成功!");
			transport.close();
			return true;
		} catch (Exception e) {
			log = "邮件发送失败!" + e;
			System.err.println(log);
			return false;
		}
	}

	public String getLog(){
		return log;
	}

	public static void main(String[] args) {
		MailUtils utils = new MailUtils("mail.xxx.com");
		utils.setFrom("root@xxx");
		utils.setSubject("xxxx");
		utils.setNamePass("xxx","xxx");
		utils.setBody("main");
		utils.setTo("xxxx@qq.com");
		utils.sendout();
	}
}











运行成功!

尾声

到此结束,但是在这里我并没有配置反垃圾策略,有需要的同学可以百度下,并且在这里,如果我发送大量的邮件的话,还是无法避免封ip,这也是为什么要购买邮件服务器的原因吧。

架设邮件服务器

阅读数 630

没有更多推荐了,返回首页