使用 GNU 邮件将附件发送至 @kindle.com

使用 GNU 邮件将附件发送至 @kindle.com

背景:我正在尝试设置一个服务器来定期提取 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 支持或不支持的详细信息。请查看那里以查看是否找到更多信息。)

确认这一点的一种方法是使用mailmutt查看原始电子邮件正文向自己发送带有附件的邮件。您应该能够判断它是像 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方式不同。

相关内容