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


32

使用Raspbian和Ubunntu 16.04 LTS,因此需要通用的Linux解决方案。

要求很简单:

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

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

因此,现在我需要能够从任何地方(包括cron)发送单线邮件,而无需用户干预。


我也希望它能够发送文本文件。基本上,来自的任何东西stdin


您是否希望您的消息来自此特定地址rpi3abc@gmail.com还是可以的,您的消息来自your_username @ localhost?
约翰·史密斯,

它确实来自rpi3abc@gmail.com,所以我知道我的计算机正在与我通信。我主要在cron工作中使用它。
SDsolar

Answers:


33

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


使用以下命令安装它:

sudo apt-get update
sudo apt-get install ssmtp

编辑/etc/ssmtp/ssmtp.conf如下所示:

root=rpi3abc@gmail.com
mailhub=smtp.gmail.com:465
FromLineOverride=YES
AuthUser=rpi3abc@gmail.com
AuthPass=testing123
UseTLS=YES

发送这样的单线:

echo "Testing...1...2...3" | ssmtp myusername@gmail.com

要么

printf "Subject: Test\n\nTesting...1...2...3" | ssmtp myusername@gmail.com

然后,对* nix而言,您仅需几秒钟即可得到提示。

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


发送文件时,这也很好用:

cat program.py | ssmtp myotherusername@yahoo.com

程序将显示在邮箱中

如果文件是文本文件,则可以在第一行显示 Subject: xxxxxx

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


这将与任何准备通过stdin传递到ssmtp的消息一起使用。


有关更多详细信息,例如针对其他用户保护这些文件等,请访问本文:

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


必要时,还请确保在下面查找Rui有关通过锁定FROM:格式化邮件文件中可能更改的地址的答案。


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


1
我还在ssmtp我的VM中使用,非常轻巧。+1
Rui F Ribeiro

1
为什么不使用Python的sendmail API并直接发送呢?
Rui F Ribeiro

要更进一步,这里有一些非常简单的说明,其中包括将图像文件作为附件: unix.stackexchange.com/questions/381131/…– SDsolar
2017年

回答Rui的问题: sendmail单独没有MTA-邮件传输代理在机器外进行通信。默认情况下,由于Unixen在设计上是多用户的,因此sendmail它将在同一框中发送消息给其他用户,但不在外部。 ssmtp是我认为最容易为gmail配置的MTA。
SDsolar

1
花了很多时间尝试设置postix才有效!给任何读过此文件的人一个提示,conf有一个错字,root参数应该是gmail.com而不是gmail。
qodeninja

9

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

ssmtp address@example.com <<<$'Subject: testing 1...2...3'

(有ssmtpsendmail只是一个符号链接ssmtp。后缀,进出口,我相信这所有其他MTA Provides: mail-transport-agent也有类似的安排,当然除了sendmailsendmail二进制是“动真格的”。)

更常见的是,您可以将简单的电子邮件与here文档组合在一起。

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

Here we interpolate the shell variable $result
____HERE

(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

对于除非常简单的纯ASCII文本消息以外的任何内容,您都需要了解如何编写适当的MIME消息,这时通常使用诸如之类的工具更为有意义mutt。某些平台具有mailmailx,它们知道如何发送附件和非ASCII文本,但这不是完全可移植的。

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

在幕后,大多数客户(例如muttmailx等)通常只是sendmail在幕后运行,以使消息脱离系统。


我直接使用sendmail不会很幸运。因此转向ssmtp。支持您的答案。顺便说一句,为了将图像作为附件发送,我发现了最简单的方法。我什至不必考虑MIME。我只是使用mpack,如下所述: unix.stackexchange.com/questions/381131/…–
SDsolar

8

添加到OP自己的答案:

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

您可以添加到/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

请注意,虽然可以在家用树莓派中使用“是”,但从安全角度来看,在多用户系统中可能不建议使用。


赞成。极好的信息。
SDsolar

5

“邮件”有什么问题?

回声“你好” 邮件-s“重要邮件” user@example.com

“邮件”是从bsd-mailx包到/ usr / bin / bsd-mailx的/ etc /替代链接。我相信它默认存在。例如,从cron脚本发送邮件的实用工具。

也可以在Ubuntu和FreeBSD上使用。


3
mailx只是一个前端。它需要配置一些MTA才能从本地系统实际获取消息。尽管有很多不兼容的版本,但是如果您的目标平台仅是Debian,则可以依赖最近的BSD行为。
三胞胎

4

我真的很喜欢为此使用mailx

echo "Message body." | mailx -s "Subject line" -a /path/attachment.txt -r "Sender's Name<sender@email.com>" -c recipient2@email.com recipient1@email.com

1
在许多非Debian / BSD系统上,这里的一些选项将不可用。如果该-a选项得到了普遍支持,则特别好,但是只需浏览mailx此处的问题以查看肯定不是这种情况。
人间

2

我使用sendEmail通过外部提供商的SMTP服务器发送简单的自动电子邮件:

sendEmail -q -f "me@mail.com" -u "mySubject" -t "someone@mail.org" -s "my.smtp.com" -o tls=yes -xu "mySmtpUser" -xp "mySmtpPw" -m "myMessage"

我将所有内容都传递给了一行,因此,如果他们ps -ef在我运行命令的同时运行,那么在命令行上执行此操作可能会向所有用户显示所有参数(包括smtp密码)。我在外壳脚本中使用它。


1
这不是标准安装,并且有多个使用此名称的客户端。我猜您指的是en.wikipedia.org/wiki/SendEmail。它可以作为Debian软件包使用吗?
三点三分

像在多用户系统上一样,对shell脚本的思考要好。我喜欢我的密码保存在机器内胆的文件中。我只希望我可以存储哈希密码而不是明文。
SDsolar

我指的是这个软件包:packages.debian.org/search?
keywords = sendemail

1
我没有看到此答案表明它可以与原始问题中指定的gmail一起使用。
SDsolar

这确实适用于gmail,例如:--s smtp.gmail.com -o tls = yes -xp your_gmail_password -s smtp.gmail.com:587`
rogerdpack

1

我的服务器是CEntOS 7,具有sendmail但没有mailx等。不是直接安装使用sendmail测试的新程序,而是发现它可以正常工作:

echo -e "From: you@whatever\nTo: you@gmail.com\nSubject: this is the subject\n\nThis is the body,\nwith multiple lines." | sendmail -t

对我来说,这似乎是发送短电子邮件的最简单方法,因为它不需要运行或配置服务器或守护程序,并且可以在单个命令行中完成。

想法是,一条消息只会警告我某个程序抛出了错误,而没有透露任何潜在的机密信息,然后我将通过SSH到服务器以检查其日志。这样一来,您就不必麻烦附加文件或对传输进行加密等麻烦了。

笔记:

  • -e 告诉echo解释'\ n'和其他转义符。
  • -t 告诉sendmail从邮件标题中的“收件人:”获取收件人地址。
  • 如果邮件未到达,请使用tail /var/log/maillog来查看错误消息。
  • 如果发送到您的gmail地址,请在gmail处进行过滤,以将其排除在垃圾文件夹之外。
  • 这个sendmail实际上是'sendmail.postfix'(可能很正常);有一个人页面点击这里

1
您的系统必须安装了可以使用的sendmail
MTA-

@SDsolar你是对的。Postfix正在我的服务器上运行,我不知道。似乎是Centos安装的标准配置。也许DigitalOcean配置了它。它不在公共端口上监听。至于通过gmail发送,我的意思是您不需要,如果只发送给自己,则可以直接从自己的服务器发送。(如果这里不适合,我可能会问自己一个问题,并将此答案移到此处。)
j77h
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.