xjpvictor's Blog
小老鼠,上灯台,两只耳朵竖起来

vps邮件服务器 (2)


各种折腾·emaillinuxvps

本文发表于超过180天以前,部分内容可能已经失效

上回书说道安装了一个基本的邮件服务器,提供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

安装完后要先

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很像。

本文 "vps邮件服务器 (2)" 由 K. Huang 首先发表于 xjpvictor's Blog 并以 CC BY-NC 4.0 许可证发布 © 2012
转载注明引用来源 https://blog.xjpvictor.info/2012/08/email-server-2/

赞助我

评论

你的邮箱地址不会被公开。必填项以 * 标出

无意义或不相关评论将被删除

取消 上传图片 或拖拽上传

* Some files will not be uploaded. Only png, gif, jpg are allowed and maximum 10 images, each file less than 10M.

你可以添加 10 个 png/gif/jpg 图片 (每个文件小于 10M)

允许使用以下html标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

你可以上传文件,粘贴代码或长文至 Drop.it.r

更多相似文章