个人邮件解决方案
http://hi.baidu.com/%CB%BC%BF%C6%CD%F8%C2%E7%D1%A7%D4%BA/blog/item/e80c4243a7f6e81672f05d3f.html
背景:E-mail是信息社会中最重要的通信工具之一,也是各种Unix系统上最基本的组件之一。由于最早的E-mail就是在Unix系统上发展出来的,Unix上的E-mail解决方案非常丰富,Linux也继承了这一优点。
对于多数人而言,第一次使用的E-mail工具可能是微软的Outlook Express或者Foxmail。Linux上的E-mail软件非常丰富,除了各种图形界面的E-mail软件如Evolution、Mozilla Thunderbird之外,还有很多字符界面的E-mail工具,如Mutt、Pine等。
相关概念:MTA、MUA和MDA
MUA:(Mail User Agent)顾名思义,MUA就是“邮件用户代理”。邮件需要代理,这是由于通常Client端的计算机无法直接寄信(不然为什么要邮件主机?),所以,需要通过MUA帮我们传递信件,不论是送信还是收信,Client端用户都需要通过各个操作系统提供的MUA才能够使用邮件系统。举个例子,Windows里的OutLook Express、Netscape里的mail功能与KDE里的Kmail都是MUA。MUA主要的功能就是接收邮件主机的电子邮件,并提供用户浏览与编写邮件的功能。
MTA:(Mail Transfer Agent)MUA是用在Client端的软件,而MTA是用在邮件主机上的软件,它也是主要的邮件服务器。MTA就是“邮件传送代理”的意思,既然是“传送代理”,那么用户寄信与收信时,都找MTA就对了!因为它负责帮用户传送。基本上,MTA的功能如下。接收外部主机寄来的信件:既然是邮件主机,接收信件自然是主要功能,只要这个信件里有MTA内部账号,这封信就会被MTA收下来; 帮用户发(寄出)信:既然可以收信,自然也可以发信,只要用户具有合法的使用MTA的权力,就可以利用这台MTA主机把信传送出去!不过要注意,MTA会将信件送给目的地的MTA而不是目的地的MUA。不要搞错了!
MDA: (Mail Delivery Agent)“邮件投递代理”主要的功能就是将MTA接收的信件依照信件的流向(送到哪里)将该信件放置到本机账户下的邮件文件中(收件箱),或者再经由MTA将信件送到下个MTA。如果信件的流向是到本机,这个邮件代理的功能就不只是将由MTA传来的邮件放置到每个用户的收件箱,它还可以具有邮件过滤(filtering)与其他相关功能。
Mailbox:“收件箱”,说穿了就是主机上一个目录下某个人专用来接收信件的文件!举个例子,系统管理员root在默认情况下会有个信箱,默认的文件就是/var/spool/mail/root文件(每个账号都会有一个自己的信箱),然后,当MTA收到root的信时,就会将该信件存到/var/spool/mail/root文件中,用户可以通过程序将这个文件里的信件数据读取出来。
原理:
发信的步骤:
Step 1 用户利用MUA寄信到MTA。通常我们使用MUA(例如Outlook express)写信时,要写明几个项:
发信人与发信网站:必须有这个信息。发信网站就是下面Step 2接收信件的那个MTA;
收信人与收信网站:以account@e-mail.server 的形式给出,其中,account就是该e-mail.server里的账号。 在图20-1左上角的那台机器上,也就是“本地客户端使用的电脑”,利用MUA功能(如Outlook express)写好信之后,按下MUA的“发送”按钮,MUA就会依据你所定义的主机地址将信发送到MTA上。
Step 2 MTA收到信件,交由MDA发送到该账号的MailBox中。如果在Step 1收到的信件中,那个e-mail.server就是MTA自己,此时MTA会将该信件交由MDA处理,将信件放置在收信者的信箱中。
Step 3 MTA将信再转送出去。如果由Step 1发来的信件的收件人并不是MTA的内部账号,那么该信将被再次转送出去!Step 1及Step 3的动作,我们也称为Relay(邮件转发)功能。
Step 4 远程MTA收到本地MTA发出的邮件。远程MTA会收到我们这台MTA的信件,并将该信件交给它的MDA处理(Step 5),此时,信件会存放在远程MTA上,等待用户登录读取或下载。
收信的步骤:
远程用户使用的计算机直接连接到它的MTA,向MTA请求查看自己的收件箱是否有信件,而MTA通过MDA去检查,如果有 信件,就会将它传送给用户的MUA,同时,根据MUA的不同设置,MTA会选择将该信件从收件箱清除或继续保留!若继续保留,那么下次用户再次接收信件 时,保留的信件会再次被下载,因此,通常用户MUA都是默认删除MTA的收件箱中的内容。
正式配置:
采用的方案:MTA(esmtp,fetchmail)、MUA(mutt)、MDA(procmail)
esmtp的简单配置:
vi .esmtprc,添加以下内容:
identity kpshare@163.com #此项一定要有,否则会运行错误,网上有些参考资料就没有写此项
hostname smtp.163.com:25 #端口号一定要写
username "kpshare"
password "******"
mda="/usr/bin/procmail -d %T"
完成后chmod 600 ~/.esmtprc
如果有多个帐号可以继续按模版添加。
fetchmail的简单配置:
vi .fetchmailrc,添加以下内容:
poll pop.163.com #收件服务器地址
proto pop3 #收件服务器协议
uidl #只下载新的邮件
username "kpshare" #用户名
password "******" #密码,在*号里输入邮箱密码
完成后chmod 600 .fetchmailrc #一定要改权限,否则无法使用
配置好后,用fetchmail -a 命令来尝试收取邮件。
mutt的简单配置:
vi .muttrc,添加以下内容:
set sendmail = "/usr/bin/esmtp -v -X ~/.esmtplog" #指定esmtp发送邮件
set fast_reply = yes #在回复邮件的时候,不用自己输入地址和标题
set folder = ~/Mail #邮件存放目录
set include = yes #回信时是否包含原文
my_hdr From: kpshare<kpshare@163.com> #这俩行一定要写,否则你的信件会以
my_hdr Reply-To: kpshare<kpshare@163.com> #root@localhost这样的地址发送出去,
procmail的简单配置:
# 设置邮件存放目录,处理从Fetchmail转发过来的邮件 # 更多细节可参考man和文末参考资料 LOGFILE=$HOME/procmail.log MAILDIR=$HOME/Mail :0 * .* default
最终测试:
echo "xxxx" |mutt -s "test" negatlov@xxx.com -a /home/negatlvo/xxxx.pdf
fetchmail -v
mutt
ps:
.muttrc config file #编辑器 直接在 Mutt 的终端里使用非图形界面的 Emacs (emacs -nw) set editor="emacs -nw" #设置邮件发送程序 set sendmail="/usr/bin/msmtp" #建立信箱 set folder="~/mail" set mbox="~/mail/inbox/" set mbox_type=maildir set spoolfile="~/mail/inbox/" set postponed="~/mail/postponed" set record="~/mail/sent" # 让mutt监视下面几个邮箱,并随时报告新邮件 mailboxes "+inbox" mailboxes "+ags" mailboxes "+rockwell" mailboxes "+gmail" set check_new = yes set timeout = 600 #set alternates="xxx@mail.ustc.edu.cn" #这是一个格式字符串,用来控制你的index的列表显示。它的缺省定义是 set index_format="%4C %Z %{%b %d} %-15.15L (%4l) %s" #指定你有那些信箱文件。当你按 "c" 切换信箱时,再按 Tab 键,这些信箱就可供你选择 #mailboxes Mailbox sent-mail #这是一个 bool 型变量。它表明你在回信时引用原文是否加入原文的邮件头。 set header=no #可以设置为 yes, no, ask-yes, 或者 ask-no. 这是说,当你按q退出时,是否提示你(ask-yes,ask-no), #还是直接就退出了(yes),还是根本不理你(no)。 set quit=ask-yes #html类型的附件是允许直接通过 .mailcap 浏览的? #doc类型的附件通过wvware转成html 浏览 auto_view text/html application/msword # " "(空): 表示这封邮件的 To: 和 Cc: Bcc: 都没有你的地址,很多垃圾邮件都有这个特征。 # +: 表示你是收件人(To: 是你的地址之一),而且是唯一的收件人。 # T: 表示你是收件人(To: 包括了你的地址之一),但是你不是唯一的收件人。这是一封群体信件。 # C: 表示你的地址出现在 CC:,但是你不是唯一的被抄送的人。 # F: 表示这封邮件是你发出去的。 # L: 表示这是一封你已经加入的邮件列表寄来的。 #这也是一个提示性变量。它是确定当你退出时,是否提示你把信件从 spool 移动到的 mbox 文件。 set move=no #当 Mutt 用 thread 方式显示时,是否用纯 ascii 表示树状列表。 set ascii_chars=yes #回信时是否包含原文。 set include #回信的引文之前插入那个符号? set indent_str="> " #设置你自己的邮件头。 my_hdr From: shine_zhong@ags.com #打分 #新信件+4分,主题包含“通知”的+2,主题包含 “Circulation” +3, 已经标记删除的 -5,上次没有读的 +1,包含 “believe”的 -10(垃圾广告!)。 score "~N" +4 score "~s 通知" +2 score "~s Circulation" +3 score "~D" -5 score "~O" +1 score "~s believe" -10 #排序方式。 set sort=score #当用 thread 排序方式时,我们对各个 thread 的相对排序顺序。 set sort_aux=date #如果翻到最后,再按往下翻也不会翻到下一封信件 set pager_stop #如果设置,当你按 "r" 回信时,就不会再提示你输入回信地址和主题,直接进入编辑模式。 set fast_reply #当你按 "t" 或者 "D" 之类的标记操作时,是否自动把光标移动到下一封信件。 set resolve=yes #地址簿 source ~/.mutt.alias #当你在 index 里按 "a" 为来信者取别名时,使用哪一个别名文件保存这个别名。 set alias_file=/home/lixuebai/.mutt.alias #你发出的邮件保存到那个信箱文件?比如可以像我这样每个月发出的信件放在不同的文件里。 set record="~/mail/=sent-mail-`date +%Y-%m`" #你的终端支持哪一种编码的显示?这个必须和你的终端编码一样。推荐用utf8 set charset="utf8" #send_charset set send_charset="us-ascii:iso-8859-1:gb2312:utf-8" #外部程序退出时,是否要求用户按一个键才返回。这在察看某些shell命令输出时是比要的, #否则它们一下就消失了。 set wait_key=yes #当你要把信件存到另一个信箱,而这个信箱已经存在时,是否提示附加? set noconfirmappend #是否把邮件头也放在编辑器里可以修改? set edit_headers=no #当你在用 pager 看信件时,在 index 留出多少行显示邮件列表? set pager_index_lines=4 #告诉 Mutt 你已经订阅了那些邮件列表(mailing-list). #subscribe fvwm@fvwm.org #mutt显示日期为中文 set locale="zh_CN" #有些没有设置字符编码时 charset-hook ^us-ascii$ gb2312 #Chinaren 等服务器发出来的信件使用了 quoted-printable 的 subject, #而且设置编码为 "iso8859-1",这显然是错误的。 #对付这个错误的办法是把 iso-8859-1 变成 gb2312 的别名 charset-hook ^iso-8859-1$ gb2312 # evolution 发过来的 subject 为 utf-8 编码的邮件标题乱码! #那就把不是 utf-8 的编码都映射到 gb2312 charset-hook !utf-8 gb2312 # mutt进行pop3收信,当然之前要查看$ mutt -v 编辑情况的确编辑了pop3了。 # 以后进入mutt按G就可以收信了。 #set pop_user=xxx@mail.ustc.edu.cn #set pop_pass="xxxxxx" #set pop_host=202.38.64.8 #现在不用mutt直接收信了。 #把mutt发送的from域作为sendmail发送邮件的sender(否则会用user@localdomian) set envelope_from=yes macro index G "!getmail\n" "Invoke getmail" macro pager G "!getmail\n" "Invoke getmail" Mutt处理Html附件 首先需要安装lynx,aptitude install lynx 配置 ~/.mailcap text/html; lynx --dump %s; nametemplate=%s.html; copiousoutput 在 ~/.muttrc 加入: auto_view text/html Mutt处理Doc附件 需要安装wv, aptitude install wv 配置 ~/.mailcap application/msword; wvHtml --charset=gb2312 %s - | lynx --dump -stdin; nametemplate=%s.html; copiousoutput 在~/.muttrc中加入 auto_view text/html application/mswordp
.procmailrc config file PATH=/bin:/sbin:/usr/bin:/usr/sbin SHELL=/bin/bash MAILDIR=$HOME/mail DEFAULT=$MAILDIR/inbox/ LOGFILE=$MAILDIR/.procmaillog :0 * ^From:.*@ags.com ags/ :0 * ^From:.*@ra.rockwell.com rockwell/ :0 * ^From:.*@gmail.com gmail/ :0 #最后的这个配置就是指如果上面分类剩下的信件全扔到inbox里 * .* inbox/ # 黑名单(垃圾邮件) #:0: #* ^From.*badguy #/dev/null