背景:我正在尝试设置一个服务器来定期提取 RSS 提要,将它们打包在移动电子书中并将它们发送到我的 kindle。
问题:如果我将服务器配置为发送到我的 @kindle.com 电子邮件地址(如下所述:https://www.amazon.com/gp/sendtokindle/email)我收到一封电子邮件,告诉我:
您发送给 Kindle 的电子邮件不包含任何附件。
我使用以下命令发送带有附件的电子邮件:
echo "See attachment" | mail -s subject -aFrom:"$EMAIL_FROM" -A $EMAIL_FILE -r $EMAIL_FROM $EMAIL_TO
我通过将其发送到我的个人电子邮件地址而不是 @kindle.com 来测试此命令。该电子邮件及其附件正确显示在我的个人收件箱中。
有趣的是,如果我像这样使用 mutt ,它工作得很好(就像我的 kindle 上出现的电子书一样):
echo "See attachment" | mutt -s subject -a $EMAIL_FILE -- $EMAIL_TO
我正在使用 postfix 将电子邮件转发到托管的 smtp 服务器。我已经检查了后缀日志(/var/log/mail.log
),但看不出上述两种方法之间有任何区别。服务器运行的是 Ubuntu 18.04。
问题:为什么它可以与 一起使用mutt
但不能与 一起使用mail
?我该如何解决这样的问题?
要求的信息
来自 mutt 的标题(如果我删除了太多,请告诉我):
Delivered-To: [...]
Received: by 2002:a2e:9c0f:0:0:0:0:0 with SMTP id s15-v6csp1355528lji;
Sat, 10 Nov 2018 10:47:03 -0800 (PST)
[... removed X-* ...]
[... removed ARC-* ...]
Date: Sat, 10 Nov 2018 18:46:44 +0000
From: [...]
To: [...]
Subject: mutt
Message-ID: <20181110184643.GA23337@server>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="5mCyUwZo2JvN/JJP"
Content-Disposition: inline
User-Agent: Mutt/1.9.4 (2018-02-28)
[... removed X-* ...]
--5mCyUwZo2JvN/JJP
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
See attachment
--5mCyUwZo2JvN/JJP
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="20181024T0942.mobi"
Content-Transfer-Encoding: base64
--5mCyUwZo2JvN/JJP--
邮件标题:
Delivered-To: [...]
Received: by 2002:a2e:9c0f:0:0:0:0:0 with SMTP id s15-v6csp1355767lji;
Sat, 10 Nov 2018 10:47:23 -0800 (PST)
[... removed X-* ...]
[... removed ARC-* ...]
MIME-Version: 1.0
Content-Type: application/octet-stream; name="20181024T0942.mobi"
Content-Transfer-Encoding: base64
Subject: mail
To: [...]
X-Mailer: mail (GNU Mailutils 3.4)
Message-Id: <[email protected]>
Date: Sat, 10 Nov 2018 18:47:07 +0000 (UTC)
From: [...]
[... removed X-* ...]
经过仔细检查,我发现其中mail
缺少“请参阅附件”文字。
版本:
jonas@server:~$ mutt -v
Mutt 1.9.4 (2018-02-28)
[...]
jonas@server:~$ mail --version
mail (GNU Mailutils) 3.4
[...]
jonas@server:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.1 LTS
Release: 18.04
Codename: bionic
根据我-A
正确使用的服务器上的手册页:
-A, --attach=FILE
attach FILE
-a, --append=HEADER: VALUE append given header to the message being sent
答案1
我相当确定这里发生的情况是您的mail
程序使用 uuencode 格式发送附件,同时mutt
以 MIME 格式发送附件。
uuencode 是一种过时的电子邮件格式,并且已基本上被 MIME 取代,因此 @kindle.com 的处理程序无法识别 uuencode 格式,只能识别 MIME,我不会感到惊讶。
很难判断您的mail
命令将如何表现(从您的问题来看),因为mail
不同的 Linux 发行版提供了许多实现(其中许多甚至根本不支持附件)。如果您提供有关 Linux 发行版、拥有mail
二进制文件的软件包的更多详细信息,以及一些来自的参考man mail
,我们可以尝试确认这一点。(此外,也许手册页可能包含有关使用 uuencode 格式的附件或 MIME 支持或不支持的详细信息。请查看那里以查看是否找到更多信息。)
确认这一点的一种方法是使用mail
和mutt
查看原始电子邮件正文向自己发送带有附件的邮件。您应该能够判断它是像 uuencode 还是 MIME。
uuencode 看起来像这样:
begin 644 myebook.pdf
虽然 MIME 看起来像这样:
Content-Type: application/pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=myebook.pdf
更新:从您包含的标题来看,它看起来像您的邮件程序是使用 MIME,但正如您自己所注意到的,它不是将文件作为附件发送(该附件将被标记为Content-Disposition: attachment
),而是作为电子邮件的主体发送(忽略您提供的正文。)
GNU 邮件实用程序MIME 文档意味着这应该按您的预期工作,例如它指出:
上面的所有示例都将进入通常的交互式 shell,允许您撰写消息正文。如果不需要,可以通过将 /dev/null 重定向到标准输入来强制非交互式使用,例如:
$ mail --attach=archive.tar < /dev/null
我对“交互式 shell”的理解是,它正在等待您输入消息正文,但接受以特殊字符 (~) 开头的命令,这使得它也是一个命令解释器。
也许尝试mail
在不将正文通过管道传输到其中的情况下使用,看看它是否需要一些输入,然后看看如果您直接键入它是否接受电子邮件正文?
答案2
有许多不同名称的程序mail
。假设你有nail
,后来变成了“传家宝邮件”,那么看起来你已经用过-A
并-a
倒退了。大写字母用于帐户,小写字母用于附加文件。我同意 Mark Plotnik 的评论,即您应该提供标题。 Kindle 也可能忽略某些 MIME 类型并且mail
工作mutt
方式不同。