使用 gmail 通过命令行发送单行邮件的最简单方法?

SDs*_*lar 43 debian ssmtp lubuntu raspbian gmail

使用 Raspbian 和 Ubunntu 16.04 LTS 所以需要一个通用的 Linux 解决方案。

要求很简单:

我需要一种从命令行发送单行电子邮件的方法。

我已经为这个特定的 Rpi3 设置了一个 gmail 帐户,地址为 rpi3abc@gmail.com - 没有 2FA

所以现在我需要能够在没有用户干预的情况下从任何地方(包括 cron)发送单行邮件消息。


我也希望它能够发送文本文件;基本上,任何来自stdin.

SDs*_*lar 44


通过 gmail 发送单行消息的最简单的答案是使用 ssmtp


使用以下命令安装它:

sudo apt-get update
sudo apt-get install ssmtp
Run Code Online (Sandbox Code Playgroud)

编辑/etc/ssmtp/ssmtp.conf看起来像这样:

root=rpi3abc@gmail.com
mailhub=smtp.gmail.com:465
FromLineOverride=YES
AuthUser=rpi3abc@gmail.com
AuthPass=testing123
UseTLS=YES
Run Code Online (Sandbox Code Playgroud)

像这样发送单行:

echo "Testing...1...2...3" | ssmtp myusername@gmail.com
Run Code Online (Sandbox Code Playgroud)

或者

printf "Subject: Test\n\nTesting...1...2...3" | ssmtp myusername@gmail.com
Run Code Online (Sandbox Code Playgroud)

然后,对于 *nix,您只需在几秒钟内返回提示。

检查您的 myusername@gmail.com 帐户,瞧,它就在那里!


这在发送文件时也很有效,如下所示:

cat program.py | ssmtp myotherusername@yahoo.com
Run Code Online (Sandbox Code Playgroud)

并且程序会出现在邮箱中

如果文件是一个文本文件,它可以有第一行说 Subject: xxxxxx

这可以与各种 cron 作业一起使用,可以向我发送带有指示内容的主题行的数据。


这将适用于任何准备通过标准输入管道传输到 ssmtp 的消息。


有关更多详细信息,例如保护这些文件免受其他用户的侵害等,请访问这篇文章:

从 Raspberry Pi 命令行发送电子邮件


如有必要,请务必查看下方Rui关于锁定FROM:可能在格式化消息文件中更改的地址所发布的答案。


现在,如果我能弄清楚如何以同样的方式发送短信就好了。

  • 对于 Gmail,您现在需要 `UseSTARTTLS=Yes` 和 `mailhub=smtp.gmail.com:587` 以及 `hostname=localhost`。我花了几个小时才把它做好:) (4认同)
  • 一直在尝试设置 postix,这很管用!给阅读本文的任何人的一个说明,conf 有一个错字,根参数应该是 gmail.com 而不是 gmail。 (2认同)

tri*_*eee 9

ssmtp只是许多 Sendmail 包装器之一。所有这些都接受标准输入上的消息,以及可选的地址列表作为命令行参数,并且它们都提供一个名为的二进制文件sendmail,它实现了(至少是基本功能)传统的 Sendmail 命令行 API。但正确地说,该消息需要格式良好的 RFC822 消息。至少,它应该有一个Subject:标题。

ssmtp address@example.com <<<$'Subject: testing 1...2...3'
Run Code Online (Sandbox Code Playgroud)

(使用ssmtp,sendmail只是到ssmtp.Postfix、Exim的符号链接,我相信其他所有Provides: mail-transport-agent具有类似安排的MTA,当然sendmailsendmail二进制文件是“真实的东西”除外。)

更常见的是,您可以将简单的电子邮件信息与此处的文档拼凑在一起。

/usr/lib/sendmail -oi -t <<____HERE
Subject: testing
To: recipient@example.net

Here we interpolate the shell variable $result
____HERE
Run Code Online (Sandbox Code Playgroud)

(Sendmail-t选项表示从您在标准输入上收到的邮件标题中获取收件人列表。Sendmail 的精确路径因平台而异。)

另一个常见的变体是组合几个命令的输出。注意标题和消息正文之间有一个空行(“脖子”)。

( printf "Subject: random number\n\n"
  dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -D -An ) |
sendmail elsewhere@example.org
Run Code Online (Sandbox Code Playgroud)

对于非常简单的 ASCII 纯文本消息之外的任何内容,您需要了解如何编写正确的 MIME 消息,此时使用像mutt. 一些平台有一个mailormailx知道如何发送附件和非 ASCII 文本,但这不是完全可移植的。

这里的挑战不是找到可以接收电子邮件并尝试发送它的客户端,而是针对 Gmail 的具体情况对其进行配置,这需要 MTA 知道用于远程服务器的用户名和密码,以便于能够将其用作传出智能主机。

在幕后,大多数客户端(如muttmailx等)通常只是sendmail在幕后运行以从系统中获取消息。


Rui*_*iro 8

添加到OP自己的答案:

配置时ssmtp,也可以禁止或允许用户定义From,也可以覆盖域;您可能出于多种原因想要这样做,包括邮件未落入垃圾邮件文件夹。

您可以添加到/etc/ssmtp/ssmtp.conf

# Where will the mail seem to come from?
rewriteDomain=my_internet_domain.uk

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES
Run Code Online (Sandbox Code Playgroud)

请注意,虽然 YES 可用于家庭树莓派,但从安全角度来看,它可能不适用于多用户系统。


Edh*_*dil 5

“邮件”有什么问题?

echo "你好" | mail -s "重要邮件" user@example.com

“邮件”是从 bsd-mailx 包到 /usr/bin/bsd-mailx 的 /etc/alternative 链接。我相信默认情况下它就在那里。例如,用于从 cron 脚本发送邮件的强大实用程序。

也适用于 Ubuntu 和 FreeBSD。

  • `mailx` 只是一个前端。它需要配置一些 MTA 才能真正从本地系统获取消息。有多个常用的不兼容版本,但如果您的目标平台仅为 Debian,则您可以依赖最近的 BSD 行为。 (4认同)