linux 使用Bash和ssmtp将变量发送到电子邮件时出现问题

ruyhziif  于 2023-11-17  发布在  Linux
关注(0)|答案(2)|浏览(113)

我尝试使用Bash和ssmtp发送电子邮件。我已经从/var/log/auth.log文件中收集了登录数据并生成了电子邮件内容。但是,当我尝试发送电子邮件时,变量没有被发送。
下面是我使用的脚本:

#!/bin/bash

# Gather login data
login_data=$(journalctl -u dropbear.service | grep "Password")

# Generate email content
email_content="Login Data:\n${login_data}"

# Send email using ssmtp
sync
ssmtp -m no[email protected] < <(echo "${email_content}")

字符串
我试过使用flush命令代替sync命令,但没有区别。我也试过使用wait命令等待ssmtp命令退出后再退出脚本,但也没有区别。
我还尝试过使用mail命令代替ssmtp命令,它可以正常工作

echo "${email_content}" | mail -s "hey" "[email protected]"


我很高兴它能与邮件一起工作,但我想更好地理解ssmtp命令,我读的更可靠
我在Stack Overflow上发现了一个类似的问题,但解决方案并不相关:ssmtp cannot email my bash variable received from python subprocess
操作系统:dietpi
详细信息:

  • 使用ssmtp的消息完全是空的,甚至连“登录数据”的标签都没有
  • 回显\n不会生成新行。使用mail命令发送的邮件将更改为\n
  • 在顶部使用set -x输出:
Nov 07 19:48:18 DietPi dropbear[15323]: [15323] Nov 07 19:48:18 Password auth succeeded for '\''root'\'' from ip:12342
Nov 07 22:56:28 DietPi dropbear[18942]: [18942] Nov 07 22:56:28 Password auth succeeded for '\''root'\'' from from ip:12342
Nov 08 10:59:19 DietPi dropbear[24025]: [24025] Nov 08 10:59:19 Password auth succeeded for '\''root'\'' from from ip:12342
Nov 08 19:14:44 DietPi dropbear[30112]: [30112] Nov 08 19:14:44 Password auth succeeded for '\''root'\'' from from ip:12342

  • 该脚本在bash中运行。版本:5.2.15(1)-release
  • echo -e不会进行更改。

我认为问题出在sstmp命令上。邮件功能在相同的echo命令下运行良好

echo  "$failed_login" | mail -s "failed" "[email protected]"


不带变量的ssmtp发送文本:

echo  "login_data" | ssmtp - m [email protected]

k7fdbhmy

k7fdbhmy1#

ssmtp的输入应该是一个格式良好的RFC 5322消息,而不是一些随机的字符串数据。试试这个:

ssmtp - m [email protected] <<____here
Subject: no subject
From: yourself <[email protected]>
To: recipient <[email protected]>

$email_content
____here

字符串
将输出收集到一个字符串变量中,以便您可以立即将其插入一次,这只是浪费内存;这里有一种更有效的方法。

( printf '%s\n' "Subject: Login data" \
    "From: yourself <[email protected]>" \
    "To: recipient <[email protected]>" \
    "" \
    "Login Data:"
    journalctl -u dropbear.service | grep "Password"
) | ssmtp -m [email protected]


一般来说,如果可以避免的话,你不想把电子邮件消息从一段一段的字符串拼凑在一起;有许多角落的情况下,你需要深入了解相关的RFC和MIME标准等。
sync与此无关;它(需要root权限)将任何挂起的磁盘写入写入到您的硬盘驱动器。
另外,字符串中的\n只是\n;但例如printf解释了这个和其他一些转义码。Bash也有$'C-style strings\nwhere\tthis\a works'echo -e(但可能更喜欢printf,它更易于移植,也更优雅和通用)。

  • 有些 * 邮件服务器会假设你的邮件头是空的,并人为地添加一个空行(或语法化的头),但这是不可靠的(而“明显格式错误”通常意味着“在第一个标记之后没有冒号”,令人惊讶的是,格式错误的消息也会有冒号;例如,这就是你发现的几乎重复的问题的问题)。
jaql4c8m

jaql4c8m2#

您发布的脚本中的问题似乎与您尝试使用ssmtp发送电子邮件的方式有关。ssmtp命令需要接收收件人电子邮件的命令行参数,或者从邮件正文的标准输入(stdin)读取。以下是您可以如何纠正它的方法:

#!/bin/bash

# Gather login data
login_data=$(journalctl -u dropbear.service | grep "Password")

# Generate email content
email_content="Subject: Login Data\n\nLogin Data:\n${login_data}"

# Send email using ssmtp
echo -e "$email_content" | ssmtp [email protected]

字符串
确保将[[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection)替换为实际收件人的电子邮件地址。echo-e选项允许对新行进行反斜杠转义(如\n)。Subject:行将直接添加到电子邮件内容中,以指定发送电子邮件时的主题。
让我知道这是否有帮助,或者我是否可以回答有关此的任何其他问题!

相关问题