LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4423|回复: 13

在 mutt 中通过 postfix 使用多个邮件帐号外发邮件

[复制链接]
发表于 2006-12-23 18:39:04 | 显示全部楼层 |阅读模式
[color="Red"]警告:此配置在多用户下有严重安全问题,暂未解决……
用 mutt、gnus 等字符型的邮件客户端(MUA)有一个问题,就是需要配置外发服务器,当然选择有很多:sendmail、msmtp等等,sendmail 据说有安全性问题,可以用 postfix 替代;用 msmtp 有一个问题,就是发送邮件的时候要等待这个发送进程执行完毕,在此期间不能进行其它的操作,解决这个问题的办法还是用 postfix 。postfix 是个邮件服务器,功能非常强大,配置参数超过 300 个,不过在这里我们只是用它来发送邮件,所以,配置起来也不算麻烦,下面来看具体步骤:
  • 1、安装 postfix-2.3.5
    为什么要用 2.3 系列的呢?因为 2.3 的支持 sender_dependent_relayhost_maps,也就是根据不同的发件人选择不同的外发服务器和不同的认证信息。该功能在 2.2 系列里也是有的,只是名称不一样,叫做 sender_based_routing,实现方式也有不同,根据
    [color="Blue"]Postfix 2nd Instance for Sender-based Routing: Multiple Gmail and Comcast Accounts 这篇文章,2.2 的需要启动两个 postfix 进程来完成此功能。而 2.3 相对来说比较容易理解,因此这里选用 2.3 的 postfix。
    大家知道,目前 Arch 的官方源里只有 postfix-2.2.11,所以我们要把它的 PKGBUILD 文件修改一下,安装最新的 postfix-2.3.5。
    用 root 身份运行:

    1. # abs
    2. # find /var/abs -name postfix
    复制代码

    输出会象这样:

    1. /var/abs/extra/daemons/postfix
    2. /var/abs/extra/daemons/postfix/postfix
    复制代码

    接着:

    1. # cp -r /var/abs/extra/daemons/postfix /var/abs/local
    2. # cd /var/abs/local/postfix
    3. # vi PKGBUILD
    复制代码

    需要修改的地方:第一个当然是版本号,改成 2.3.5,相应地,md5sum 也要修改:

    1. md5sums=('ccdaccbf4c77abbab039a44f9e92a560' 'a3c45ff23ef036143711793fcf2478c3'\
    2.          'eb5f290655559bbdfbf7b9791aeb4a64' '469ce1ce887bafb2afd243c4c64c843a')
    复制代码

    接着要修改 postfix 的编译参数,把原来的

    1.         make makefiles \
    2.                 CCARGS="-DUSE_SASL_AUTH -I/usr/include/sasl \
    3.                         -DUSE_TLS" \
    4.                 AUXLIBS="-lsasl2 -lssl -lcrypto"
    复制代码

    改成

    1.         make makefiles \
    2.                 CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl \
    3.                         -DUSE_TLS" \
    4.                 AUXLIBS="-lsasl2 -lssl -lcrypto -L/usr/lib/sasl2"
    复制代码

    这样 PKGBUILD 文件就修改完毕了。如果不想自己修改,可以用我修改好的文件:[color="Blue"]postfix.tar.bz2(可在附件中下载),
    把它解压到 /var/abs/local 下。
    现在开始编译:

    1. # cd /var/abs/local/postfix
    2. # makepkg
    复制代码

    编译完成后会在当前目录下生成 postfix-2.3.5-1.pkg.tar.gz 安装包。如果修改过 /etc/makepkg.conf 文件中生成包的路径,请自行去自己设置的目录查找。然后安装:

    1. # pacman -U postfix-2.3.5-1.pkg.tar.gz
    复制代码

    postfix 安装完成了,接下来要进行最重要的配置步骤
  • 2、配置 postfix
    首先修改 /etc/postfix/aliases

    1. root:                         YOUR_ACCOUNT
    复制代码

    YOUR_ACCOUNT 换成你想用来接收发给 root 的信件的用户名
    完成后运行:

    1. # postalias /etc/postfix/aliases
    复制代码

    接着修改 main.cf
    把以下代码加入 /etc/postfix/main.cf

    1. smtp_tls_loglevel = 1 #starttls 的 log 级别,可选 1-3,不推荐超过4以上
    2. smtp_tls_security_level = none #smtp.gmail.com 需要 tls,但是我们在下面一项设置
    3. smtp_tls_policy_maps = hash:/etc/postfix/tls_policy #分别指定每个转发服务器的安全级别
    4. smtp_tls_session_cache_database = btree:/var/spool/postfix/smtp_scache #tls 的cache 目录
    5. tls_random_source = dev:/dev/urandom #tls 需要生成随机数
    6. smtp_sasl_auth_enable = yes #转发服务器需要认证,gmail 和 163 都需要,选择 yes
    7. smtp_sasl_type = cyrus #认证方式
    8. smtp_sasl_password_maps = hash:/etc/postfix/sasl_password #每个转发服务器的认证信息
    9. smtp_sasl_security_options = noanonymous #sasl 安全选项
    10. smtp_sasl_tls_security_options = noanonymous #tls 安全选项
    11. disable_dns_lookups = yes #禁用 DNS 查询
    12. smtp_generic_maps = hash:/etc/postfix/generic #通用地址改写表,未指明发件人信息时可能需要,如在终端下使用 mail
    13. sender_dependent_relayhost_maps = hash:/etc/postfix/sd_relayhost #This is the point :)
    14. smtp_sender_dependent_authentication = yes #point related :)
    15. smtp_tls_CAfile = /etc/postfix/CA.pem #CA 文件,用来验证 gmail 的 tls 证书,主要是防止第三方攻击,没有此文件仍旧可以使用 smtp.gmail.com 发信;该文件可在附件下载
    复制代码

    接下来对配置文件中的几个 hash 文件作一下说明:
    /etc/postfix/tls_policy
    该文件用来指明转发服务器是否需要 tls,gmail 需要,163 不需要,因此添加如下内容到该文件中

    1. [smtp.gmail.com]        secure
    2. [smtp.163.com]          none
    复制代码

    把转发服务器用 [] 括起来是为了禁止 MX 查询,具体请查看 postfix 相关文档
    这是使用 CA.pem 文件的情况,如果不使用 CA 文件,要把 [smtp.gmail.com]        secure 改成:

    1. [smtp.gmail.com]      may
    复制代码

    不然会发信失败
    完成后要用 postmap 处理一下,处理过后才能在 postfix 配置文件中使用

    1. # postmap /etc/postfix/tls_policy
    复制代码

    /etc/postfix/sasl_password
    这个是转发服务器的认证信息,因为使用了 sended_dependent_relayhost_maps ,所以该文件格式由原来的
    relayhost       USERASS
    换成
    sender           USERASS
    例如:

    1. my163account@163.com         my163account:my163pass
    2. mygmailaccount@gmail.com     mygmailaccount@gmail.com:mygmailpass
    复制代码

    当然,具体地址和用户密码等信息要换成你自己的
    完成后同样要用 postmap 处理

    1. # postmap /etc/postfix/sasl_password
    复制代码

    另外,因为该文件包含密码信息,所以要修改一下权限,只能让 root 和 postfix 读取

    1. # chown root.postfix /etc/postfix/sasl_password*
    2. # chmod 0640 /etc/postfix/sasl_password*
    复制代码

    /etc/postfix/generic
    这个文件是什么作用呢?我们一般都是在自家使用 Linux,没有有效的域名(当然,有固定有效的域名情况除外),当你用 postfix 把邮件发到 Internet 上的邮件服务器而且没有指定 from: 或者 envelope 地址的时候(比如使用 mail),postfix 会在邮件的 from: 中使用 USER@localhost 或 USER@localhost.localdomain 这样的格式,绝大多数邮件服务器是拒收这样的信件的,因此我们就要用 generic_maps 来把 USER@localhost 或 USER@localhost.localdomain 这样的本地地址转换成 Internet 上有效的地址。
    修改这个文件要分两种情况,运行

    1. # hostname
    复制代码

    如果输出是 myhostname 这种格式,而不是 myhostname@mydomain 这样的,那么你需要在 main.cf 中加入

    1. append_dot_mydomain = no
    复制代码

    然后修改 /etc/postfix/generic ,加入

    1. USER@myhostname          mygmailaccount@gmail.com
    复制代码

    如果是 myhostname@mydomain 类型的,就不用修改 main.cf 了,使用默认值是可以的。generic 内容如下:

    1. USER@myhostname.mydomain      mygmailaccount@gmail.com
    复制代码

    其中 USER 就是你的系统用户名
    同样,完成后用 postmap 处理

    1. # postmap /etc/postfix/generic
    复制代码

    /etc/postfix/sd_relayhost
    这个文件就是当你在 mutt 中指定 from: 或者 envelope_address 的时候告诉 postfix 应该使用哪个转发服务器来发信,这也是本文的重点
    该文件的格式为:sender        relayhost
    比如你想使用 mygmailaccount@gmail.com 这个帐号通过 smtp.gmail.com 来外发邮件,那么就在该文件中写:

    1. mygmailaccount@gmail.com       [smtp.gmail.com]
    复制代码

    或者用 my163account@163.com 通过 smtp.163.com 来发送:

    1. my163account@gmail.com       [smtp.163.com]
    复制代码

    如果两个都有或还有更多的帐号,可以写在一起:

    1. mygmailaccount@gmail.com       [smtp.gmail.com]
    2. my163account@gmail.com       [smtp.163.com]
    复制代码

    完成后,用 postmap 处理:

    1. # postmap /etc/postfix/sd_relayhost
    复制代码

    至此,postfix 的部分完成了,启动 postfix:

    1. # /etc/rc.d/postfix start
    复制代码

    接下来看一下 mutt 的设置
  • 3、配置 mutt
    编辑 .muttrc 或 ./mutt/muttrc

    1. set sendmail="/usr/sbin/sendmail -om -oi"
    2. set use_from=yes
    3. set use_envelope_from=yes
    4. set edit_headers=yes
    复制代码


这样,在 mutt 里发信的时候只要改一下 From: 里面的地址,按"y"发送,邮件就会被送到 postfix 的邮件队列,不用等待,你可以继续用 mutt 干其它事,而 postfix 会根据发信人地址,也就是 From: 中指定的选择合适的转发服务器把邮件发出去。即使是用

  1. $ mail -s sometitle someaccount@somedomain.com
复制代码

postfix 也会用 generic 中指定的地址作为默认的 From:,然后选择相应的 relayhost 把邮件发出去。

好了,基本上就是这些了,如有任何错误、意见或建议,欢迎来 [color="Red"]irc.oftc.net 的 [color="Red"]#arch-cn 频道聊聊,我在里面的用户名是 [color="SeaGreen"]rock。当然也可以跟帖。
感谢 [color="SeaGreen"]wd、[color="SeaGreen"]sssslang 的意见和支持

-----
参考文档:
[color="Blue"]Gmail on Home Linux Box using Postfix and Fetchmail
[color="Blue"]Postfix 2nd Instance for Sender-based Routing: Multiple Gmail and Comcast Accounts
[color="Blue"]Postfix All main.cf parameters
[color="Blue"]Postfix SASL Authentication
[color="Blue"]Postfix TLS Encryption and authentication
[color="Blue"]Postfix Address rewriting
[color="Blue"]PostFix HostOnly Howto

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2006-12-23 21:25:38 | 显示全部楼层
wow,不错。
回复 支持 反对

使用道具 举报

发表于 2007-1-3 00:14:57 | 显示全部楼层
里面出现sasl_passwd,sasl_password两个文件名,应试是其中一个吧.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-3 02:12:15 | 显示全部楼层
Post by catinsnow
里面出现sasl_passwd,sasl_password两个文件名,应试是其中一个吧.

谢谢,已改正
回复 支持 反对

使用道具 举报

发表于 2007-1-3 09:36:37 | 显示全部楼层
我使用的邮件客户端环境是:fetchmail+postfix+mutt+msmtp,推荐个人使用.有没有人感兴趣,要不我来写一篇自己的整理心德.
回复 支持 反对

使用道具 举报

发表于 2007-1-3 10:49:06 | 显示全部楼层
Post by lewbing
我使用的邮件客户端环境是:fetchmail+postfix+mutt+msmtp,推荐个人使用.有没有人感兴趣,要不我来写一篇自己的整理心德.


請問既然已經使用 postfix,為什麽還要用 msmtp?這樣功能不就重復了嗎?
回复 支持 反对

使用道具 举报

发表于 2007-1-3 11:28:37 | 显示全部楼层
Post by sssslang
請問既然已經使用 postfix,為什麽還要用 msmtp?這樣功能不就重復了嗎?


本来是准备用postfix来过滤邮件的,用esmtp发邮件!
抱歉,刚才打错字.
esmtp:Mail Transport Agent(MTA)
mutt:Mail User Agent(MUA)
fetchmail:Mail Delivery Agent(MDA)
postfix:用来过滤邮件.不过目前没怎么写,gmail\yahoo\163服务器已经把它们全部过滤了.呵呵 !
回复 支持 反对

使用道具 举报

发表于 2007-1-3 11:57:42 | 显示全部楼层
那我覺得可以省掉 esmtp。其實個人使用的話用 msmtp 最簡單,tls 支持也較好。不過如果郵件量稍微大一點的話還是推薦用 postfix 發送,這樣就不會傻等著 mutt, Gnus 這樣的客戶端在那裏發送了。

flycraft 寫的 postfix 配置很不錯,我已經從中受益了。

P.S. 簡單的過濾用 procmail 就可以做到。
回复 支持 反对

使用道具 举报

发表于 2007-1-3 12:04:34 | 显示全部楼层
我觉得我们使用sylpheed就行了,日本人做的(在OpenSource下,应该不会有种族歧视吧!),基于gtk.用的还不错.
现在我们一般都用GUI了,mutt确实不太好用,就只应急用.
注意:sylpheed最好使用最新版,去google搜索,下载后编译\安装即可.如果你不使用最新版,那会有一些怪问题.而且现在的sylpheed本来还有些问题,但不太影响使用了!
回复 支持 反对

使用道具 举报

发表于 2007-1-3 12:09:29 | 显示全部楼层
Post by sssslang
那我覺得可以省掉 esmtp。其實個人使用的話用 msmtp 最簡單,tls 支持也較好。不過如果郵件量稍微大一點的話還是推薦用 postfix 發送,這樣就不會傻等著 mutt, Gnus 這樣的客戶端在那裏發送了。

flycraft 寫的 postfix 配置很不錯,我已經從中受益了。

P.S. 簡單的過濾用 procmail 就可以做到。


procmail 不止可以简单过滤哦,呵呵
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表