Peter Englmaier <ppe_AT_pa.uky.edu> 撰写的一篇关于如何在家庭(拨号)和工作场所(以太网)使用的笔记本电脑上设置电子邮件的简短介绍。
作为笔记本电脑用户,我对电子邮件设置有特殊的需求。下面描述的设置使我能够:
从家庭使用 POP 电子邮件服务器读取我的电子邮件,该服务器由我的大学提供,但也可以在工作场所的计算机上设置。
从家庭撰写电子邮件,并在电子邮件中使用正确的回复地址(不提及我的计算机名称)。
在工作站上工作时,无需访问我的笔记本电脑或 POP 电子邮件服务器即可读取/撰写我的电子邮件(作为备份)。
在我的笔记本电脑连接到我们研究所的以太网时,读取我的电子邮件。
通过以太网连接时直接发送电子邮件(比 fetchmail 方法更快)。
在未连接到工作场所的以太网时(在家通过调制解调器或在其他地方通过以太网),通过 POP 邮件服务器间接发送电子邮件。
使用任何电子邮件客户端,例如 elm 或简单的 mail 命令。
对收到的电子邮件进行排序,删除垃圾邮件,将电子邮件集合(摘要)拆分为单独的电子邮件。
此配置基于 sendmail、fetchmail 和一个用于电子邮件的远程 POP 帐户。
这是最复杂的部分。安装了 sendmail-cf 软件包后,我创建了一个名为/usr/lib/sendmail-cf/laptop.mc:
divert(-1) include(`../m4/cf.m4') define(`confDEF_USER_ID',''8:12'') define(`confBIND_OPTS',`-DNSRCH -DEFNAMES') # here you define your domain define(`confDOMAIN_NAME',''pa.uky.edu'') OSTYPE(`linux') undefine(`UUCP_RELAY') undefine(`BITNET_RELAY') # there we send outgoing email define(`SMART_HOST',`server1.pa.uky.edu') # there we send mail to users my laptop does not know define(`LUSER_RELAY',`server1.pa.uky.edu') # again the domain, we want to be seen as MASQUERADE_AS(pa.uky.edu) FEATURE(allmasquerade) FEATURE(nouucp) FEATURE(nodns) FEATURE(nocanonify) FEATURE(redirect) FEATURE(always_add_domain) FEATURE(use_cw_file) FEATURE(local_procmail) MAILER(procmail) MAILER(smtp) HACK(check_mail3,`hash -a@JUNK /etc/mail/deny') HACK(use_ip,`/etc/mail/ip_allow') HACK(use_names,`/etc/mail/name_allow') HACK(use_relayto,`/etc/mail/relay_allow') HACK(check_rcpt4) HACK(check_relay3) |
的文件。这看起来比实际情况复杂。它所做的只是将外发邮件重定向到 server1 (SMART_HOST),以及将发送给未知本地用户 (LUSER_RELAY) 的邮件也重定向到 server1。这样,我可以给我的同事写邮件,而无需使用他们的完整电子邮件地址。更重要的是:我的电子邮件中的 "From" 行指向我的 MASQUARADE_AS 域,而不是直接指向我的笔记本电脑。如果不是这样,使用回复按钮回复的邮件可能无法到达我这里。您必须重启 sendmail 才能使更改生效。注意:此配置适用于 Redhat 5.2 系统。您可能需要更改一些细节。
现在,需要做的就是生成/etc/sendmail.cf文件 m4 laptop.mc >/etc/sendmail.cf,并将我的笔记本电脑应响应的所有可能的域名添加到/etc/sendmail.cw:
# sendmail.cw - include all aliases for your machine here. laptop laptop.pa.uky.edu 128.17.18.30 guest1 guest1.somewhere.org |
文件中。重要的是在此文件中包含所有别名,否则 sendmail 将不接受邮件(并会回复发送者 we don't relay)。最后,您现在必须通过发送电子邮件、回复所有可能的配置的邮件来测试设置。任何配置错误都可能导致电子邮件丢失。
将电子邮件获取到您的机器的一种方法是通过 fetchmail。Fetchmail 定期检查一个或多个远程邮件服务器上的新电子邮件。我使用以下 fetchmail 配置文件(在我的用户主目录中):fetchmailrc
set postmaster "myusername" set daemon 900 poll pop.uky.edu with proto POP3 user "mypopusername" there with password "mypoppassword" is mylaptopusername here |
Fetchmail 将只获取电子邮件并将其发送到 sendmail,然后 sendmail 会将其投递到您的/var/spool/mail/$USER文件。
在我的工作站上,我有以下.forward文件
me@pop.acount.edu,me@server1 |
。这里 server1 是我保存邮箱的机器。所有电子邮件都发送到 POP 帐户,以便稍后由我的笔记本电脑(使用 fetchmail)接收。但是,当我的笔记本电脑通过以太网连接时,我希望我的电子邮件直接发送到笔记本电脑,而不是 POP。
me@laptop,me@server1 |
在这两种情况下,我的电子邮件的备份都会发送到 server1(如果我无法访问我的笔记本电脑,我也可以在那里读取它)。我将所有电子邮件都保留/存储在笔记本电脑上。
切换是通过三个脚本文件和一个 crontab 文件(在工作站上)完成的:
forward_pop
#!/bin/sh echo "me@pop.acount.edu,me@server1" > ${HOME}/.forward |
forward_laptop
#!/bin/sh echo "ppe@laptop,ppe@server1" > ${HOME}/.forward crontab ${HOME}/mycrontab ${HOME}/utl/check_laptop |
check_laptop
#!/bin/sh if /usr/sbin/ping -c 1 laptop >/dev/null 2>&1 ; then : else # redirect mail to pop ${HOME}/utl/forward_pop sleep 10 if /usr/sbin/ping -c 1 laptop >/dev/null 2>&1 ; then # back to normal ${HOME}/utl/forward_laptop else # deactivate crontab check /bin/crontab -l | grep -v check_laptop >${HOME}/tmp/mycrontab.tmp /bin/crontab ${HOME}/tmp/mycrontab.tmp rm -f ${HOME}/tmp/mycrontab.tmp fi fi |
mycrontab
# mycrontab 0,10,20,30,40,50 * * * * ${HOME}/utl/check_laptop |
每次我将笔记本电脑连接到以太网时,我必须运行 forward_laptop,每次我断开连接时,我都运行 forward_pop。如果我忘记运行 forward_pop,crontab 作业会在不到 10 分钟后为我运行它。为了自动执行所有这些操作,我按如下方式更改笔记本电脑上的网络脚本文件:
/sbin/ifdown(此脚本在网络设备停止时运行,BEGIN 和 END 之间是新内容)
... fi # BEGIN new stuff # turn off forwarding email mail ppe <<EOF turning off forwarding email device = ${DEVICE} hostname = `hostname` EOF if [ "${DEVICE}" = "eth0" -a "`hostname`" = "laptop" ]; then su -lc "ssh -l myusername server1 utl/forward_pop" myusername >& /dev/null fi # END new stuff ifconfig ${DEVICE} down exec /etc/sysconfig/network-scripts/ifdown-post $CONFIG |
注意,该脚本检查主机名的值。如果我连接到外部以太网,我的主机名和 IP 地址将是其他内容,例如 guest1。
/etc/sysconfig/network-scripts/ifup-post(此脚本在网络设备启动时运行)
# Notify programs that have requested notification do_netreport # BEGIN new stuff # check for email -- I'm using fetchmail for this if [ "${DEVICE}" = "eth0" -o "${DEVICE}" = "ppp0" ]; then su -lc fetchmail myusername >& /dev/null & fi # set clock if connected to ethernet, redirect email if [ "${DEVICE}" = "eth0" -a "`hostname`" = "zaphod" ]; then ( rdate -s server1 ; hwclock --systohc --utc ) >& /dev/null & # forward email su -lc "ssh -l myusername gradj utl/forward_laptop" myusername >& /dev/null & fi # END new stuff exit 0 |
此步骤是完全可选的。上面描述的 sendmail 配置为每个收到的电子邮件调用 procmail,但您也可以使用 .forward 文件(请参阅 procmail 手册页)调用 procmail。Procmail 是一个方便的工具,可以阻止垃圾邮件并对收到的电子邮件进行排序。
您需要设置一个 .procmailrc 文件才能使用 procmail。请参阅 procmail、procmailrc 和 procmailex(示例)的手册页。我的设置演示了如何忽略某些电子邮件消息并将电子邮件集合(摘要)拆分为多个部分。
# -- mail filtering -- procmail is called by sendmail -- PATH=/bin:/usr/bin MAILDIR=$HOME/Mail LOGFILE=$MAILDIR/from # keep in mind: # use ":0:" when writing to a file # use ":0" when writing to a device, e.g. /dev/null, or send email # - make a backup of *all* incoming mail, but ignore mail tagged below - :0 c: *! ^Sissa-Repro backup # - keep only last 50 messages :0 ic | cd backup && rm -f dummy `ls -t msg.* | sed -e 1,50d` # - delete email coming through the 'postdocs' email list, when # it is not of any interest :0 * ^From.*postdocs * ^From.*Ernst Richter /dev/null :0 * ^From.*postdocs * ^Subject.*card charge /dev/null # Split mailing list from the sissa preprint server into individual emails # - this is quite complicated :( I can flip through the list much # faster and ignore preprints which have uninteresting titles. Instead of # having to browse through the whole list, my mailer will just present a # list of papers. # 1. split it in individual messages :0 * ^From no-reply@xxx.lanl.gov | formail +1 -de -A "Sissa-Repro: true" -s procmail # 2. reformat messages a bit # 2.1. extract 'Title:' from email-Body and add to email-header as 'Subject:' :0 b * ^Sissa-Repro *! ^Subject TITLE=| formail -xTitle: :0 a |formail -A "Subject: $TITLE " -s procmail # 2.2. store in my incoming sissa-email folder. Here, we could # also reject (and thereafter delete) uninteresting 'Subjects' # we could also mark more interesting subjects as urgend or send a copy # to regular mail box. :0: * ^Sissa-Repro * ^Subject *! ^replaced with sissa |
顺便说一句,有一个 tk GUI 工具可以配置 procmail(我认为它叫做 dotfiles)。
电子邮件的另一种可能的解决方案是使用 UUCP。此软件是为断开连接的机器制作的,如果您在笔记本电脑上有多个用户(我们谈论的是 UNIX,记住吗?),每个人都有自己的帐户,那么它是迄今为止最简单的解决方案。
与大多数人的想法不同,UUCP 不需要串行连接:它可以通过 TCP/IP 正常工作,因此您的 UUCP 合作伙伴可以是 Internet 上的任何机器,只要它可以从您的网络连接点访问。这是 UUCPsys文件,用于典型的笔记本电脑
system mylaptop time any chat "" \d\d\r\c ogin: \d\L word: \P address uucp.mypartner.org port TCP |
Mailsync 是一种同步邮箱集合的方法。该算法是三向差异比较。两个邮箱同时与上次同步时两个邮箱状态的记录进行比较。新消息和消息删除在两个邮箱之间传播。Mailsync 可以同步多种格式的本地邮箱文件以及通过 IMAP、POP 和 IMAPS 的远程邮箱。