上回书说道安装了一个基本的邮件服务器,提供imap和smtp,但是必须通过客户端连接。这次加多一个webmail界面,再加上一些附加功能。
spamassassin
判断垃圾邮件。这个功能其实很重要,毕竟网络上的垃圾邮件太多了。安装spamassassin,选择这个的原因很简单,名字霸气啊,spam刺客。直接pacman -S安装。然后新建目录
mkdir /var/lib/spamassassin/
chown nobody:nobody /var/lib/spamassassin
用nobody是因为arch的spamassassin.service文件采用了nobody运行,所以就只能把这个目录改到nobody所有,不然没权限bayes无法生成autolearn文件,会提示autolearn=unavailable
2018-08-30: Arch 已经改为了spamd
用户,所以上面那个应该改为spamd:spamd
安装完后要先
sa-update
再启动spamd服务。
设置的文件在 /etc/mail/spamassassin/local.cf 很简单,看着改改就行。然后修改 /etc/postfix/master.cf 把
smtp inet n - n - - smtpd
改成
smtp inet n - n - - smtpd -o content_filter=spamassassin
然后在最下面加上
spamassassin unix - n n - - pipe user=nobody argv=/usr/bin/vendor_perl/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
效果不知道怎么样,毕竟我的邮箱地址还没有泄漏,不知道要过多久才有垃圾邮件来。
pigeonhole
鸽子窝。其实就是sieve,或者说filter。就是根据收到的邮件的一些特性来进行一些动作,比如说归类,标记已读,标记重要,删除等等。这其实是dovecot的一个插件,因为所有邮件都由postfix交给了dovecot来放到本地的邮箱目录中,所有dovecot是LDA。
首先要在 /etc/postfix/main.cf 中把
virtual_transport = virtual
改为
virtual_transport = dovecot
然后在 /etc/postfix/master.cf 中添加
dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${user}@${nexthop} -a ${recipient}
最后在 /etc/dovecot/dovecot.conf 中修改
protocols = imap
为
protocols = imap sieve
然后添加
protocol lda {
postmaster_address = admin@xjpvictor.info
hostname = xjpvictor.info
submission_host = localhost:587
mail_plugins = sieve
log_path = /var/spool/vmail/log/dovecot-lda-errors.log
info_log_path = /var/spool/vmail/log/dovecot-lda.log
}
protocol sieve {
}
plugin {
recipient_delimiter = +
sieve = /var/spool/vmail/%u/dovecot.sieve
}
需要提前新建 /var/spool/vmail/log/ 目录,并且赋予vmail用户读写的权限,然后vmail才能建立log文件。如果不需要log,不写也可以。
sieve规则文件在 /var/spool/vmail/a@xjpvictor.info/dovecot.sieve 语法很简单。参考我的
require ["fileinto","imap4flags","envelope","subaddress","reject","regex"];
# rule:[Spam]
# 把标记为Spam的扔到Spam目录中
if header :contains "X-Spam-Flag" "YES"
{
fileinto "Spam";
stop;
}
# rule:[Archlinux mailing list]
# 把从这几个地址发送来的邮件放到Mailing lists/Archlinux目录中
if anyof (header :contains "From" "arch-general-request@archlinux.org", header :contains "From" "arch-announce-request@archlinux.org", header :contains "From" "aur-notify@archlinux.org", header :contains "To" "arch-general@archlinux.org", header :contains "To" "arch-request@archlinux.org")
{
fileinto "Mailing lists/Archlinux";
stop;
}
# rule:[Save sent]
# 标记已发送的邮件为已读,并保存到SENT目录
if allof (envelope :detail :is "to" "sent", header :regex "To" "[a-zA-Z\\.\\-_+]+@[^(xjpvictor.info)]")
{
setflag "\\Seen";
fileinto "SENT";
stop;
}
# rule:[Discard sent me]
# 自己发给自己的邮件不需要保存在SENT目录中
if allof (envelope :detail :is "to" "sent", not header :matches "To" "[a-zA-Z\\.\\-_+]+@[^(xjpvictor.info)]")
{
reject "";
stop;
}
# rule:[To my self]
# 自己发给自己的邮件标记为重要
if allof (header :contains "From" "@xjpvictor.info", header :contains "To" "@xjpvictor.info")
{
setflag "\\Flagged";
stop;
}
主要功能都有了。[Save sent] 和 [Discard sent me] 这两条比较特殊,是用于保存已发送邮件的。虽然要保存已发送邮件可以简单的指定客户端的已发送文件夹为imap上的已发送目录,但是这样的话不能应用服务器端的sieve规则。比如我每天记账是通过发送邮件来添加条目的,那这种邮件我就不希望留在已发送目录中,所以我希望能用服务器端的sieve规则把这类邮件直接删除。
修改 /etc/postfix/main.cf 添加
sender_bcc_maps = hash:/etc/postfix/sender_bcc
然后新建 /etc/postfix/sender_bcc 文件,写入
a@xjpvictor.info a+sent@xjpvictor.info
再
postmap /etc/postfix/sender_bcc
生成数据文件。这样每当a@xjpvictor.info发送了一封邮件就会自动的bcc一份到a+sent@xjpvictor.info。这个地址不是另一个账户,仍然是a@xjpvictor.info,但是告诉dovecot要存放到sent目录中。当然,因为sieve规则的存在,dovecot会忽略这个请求,所以需要在sieve规则中单独指明如果收到的邮件detail是sent,那么就存放到SENT目录中。当然如果是自己发给自己的邮件就不需要再多保存一份在SENT里,bcc过来的直接reject掉就行了。另外必须先标记为已读再放到SENT目录中,不然fileinto之后就标记不到了。还有就是 /etc/postfix/virtual_alias 中不能使用 @xjpvictor.info 的转发了,不然会把a+sent@xjpvictor.info也给转发掉的。
其实sieve规则文件不一定要登录服务器修改。只要iptables打开了INPUT的4190端口,kmail就可以直接读取到sieve文件,然后修改会也会保存到服务器上。但是这样仍然是以文本的形式修改的。
roundcube webmail
为了在没有客户端的时候收发邮件,webmail是必须的。我用的是roundcube,因为直接在archlinux的源里就可以安装,界面也好看。
安装之前,需要把php的imap extension打开,不然会无法登录。然后设置nginx,赋予 /xinstallerx/ 目录权限,因为arch默认把这个目录禁止访问了。然后新建一个mysql数据库,再从浏览器里访问/xinstallerx/,跟着提示一步步做就是了。只是在填imap和smtp服务器的时候注意,imap服务器是 ssl://localhost 而smtp服务器是 tls://localhost 不要两个都写成tls或ssl了。而Sent folder那里填 none 因为我们已经使用服务器来保存已发送邮件了。
roundcube自带一些plugin,强烈推荐managesieve。修改 /etc/webapps/roundcubemail/config/main.inc.php 把
$rcmail_config['plugins'] = array();
修改为
$rcmail_config['plugins'] = array('managesieve');
再把 /usr/share/webapps/roundcubemail/plugins/managesieve/config.inc.php.dist 存为 /usr/share/webapps/roundcubemail/plugins/managesieve/config.inc.php 然后设置
$rcmail_config['managesieve_port']
定为4190。因为这是localhost的,所以如果不需要kmail修改sieve规则的话可以把INPUT的4190端口关闭,roundcube仍然能正常修改sieve的。roundcube修改sieve的好处在于可以使用图形界面,不需要在意sieve的语法格式了,和gmail设置filter很像。