15.3. 电子邮件

15.3.1. 介绍

Peter Englmaier <ppe_AT_pa.uky.edu> 撰写的一篇关于如何在家庭(拨号)和工作场所(以太网)使用的笔记本电脑上设置电子邮件的简短介绍。

15.3.1.1. 功能

作为笔记本电脑用户,我对电子邮件设置有特殊的需求。下面描述的设置使我能够:

  • 家庭使用 POP 电子邮件服务器读取我的电子邮件,该服务器由我的大学提供,但也可以在工作场所的计算机上设置。

  • 从家庭撰写电子邮件,并在电子邮件中使用正确的回复地址(不提及我的计算机名称)。

  • 在工作站上工作时,无需访问我的笔记本电脑或 POP 电子邮件服务器即可读取/撰写我的电子邮件(作为备份)。

  • 在我的笔记本电脑连接到我们研究所的以太网时,读取我的电子邮件。

  • 通过以太网连接时直接发送电子邮件(比 fetchmail 方法更快)。

  • 在未连接到工作场所的以太网时(在家通过调制解调器或在其他地方通过以太网),通过 POP 邮件服务器间接发送电子邮件。

  • 使用任何电子邮件客户端,例如 elm 或简单的 mail 命令。

  • 对收到的电子邮件进行排序,删除垃圾邮件,将电子邮件集合(摘要)拆分为单独的电子邮件。

此配置基于 sendmailfetchmail 和一个用于电子邮件的远程 POP 帐户

15.3.1.2. sendmail 的配置

这是最复杂的部分。安装了 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)。最后,您现在必须通过发送电子邮件、回复所有可能的配置的邮件来测试设置。任何配置错误都可能导致电子邮件丢失。

15.3.1.3. 笔记本电脑上 fetchmail 的配置

将电子邮件获取到您的机器的一种方法是通过 fetchmailFetchmail 定期检查一个或多个远程邮件服务器上的新电子邮件。我使用以下 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文件。

15.3.1.4. 将电子邮件转发到笔记本电脑

在我的工作站上,我有以下.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

15.3.1.5. 使用 procmail 处理收到的电子邮件

此步骤是完全可选的。上面描述的 sendmail 配置为每个收到的电子邮件调用 procmail,但您也可以使用 .forward 文件(请参阅 procmail 手册页)调用 procmailProcmail 是一个方便的工具,可以阻止垃圾邮件并对收到的电子邮件进行排序。

您需要设置一个 .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)。

15.3.2. 使用 UUCP 的电子邮件

电子邮件的另一种可能的解决方案是使用 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

15.3.3. MailSync

Mailsync 是一种同步邮箱集合的方法。该算法是三向差异比较。两个邮箱同时与上次同步时两个邮箱状态的记录进行比较。新消息和消息删除在两个邮箱之间传播。Mailsync 可以同步多种格式的本地邮箱文件以及通过 IMAP、POP 和 IMAPS 的远程邮箱。