从 linux shell 脚本发送邮件
Posted
技术标签:
【中文标题】从 linux shell 脚本发送邮件【英文标题】:Sending a mail from a linux shell script 【发布时间】:2011-07-06 13:40:15 【问题描述】:我想通过 Linux Shell 脚本发送电子邮件。执行此操作的标准命令是什么?我需要设置任何特殊的服务器名称吗?
【问题讨论】:
尝试询问超级用户 [superuser.com],或者更好的是 Unix 和 Linux SE [unix.stackexchange.com]。 Shell script to send email的可能重复 【参考方案1】:如果服务器配置良好,例如它有一个启动并运行的 MTA,您可以使用 mail 命令。
例如,要发送文件的内容,您可以这样做:
$ cat /path/to/file | mail -s "your subject" your@email.com
man mail
了解更多详情。
【讨论】:
这里的“mta”是什么意思,有全名还是链接?作为一个初学者,这就是我想知道的。因为我缺乏这样做的经验。 @Zen MTA 代表邮件传输代理。 postfix、sendmail、qmail 等 @Zen 在大多数情况下,您可以将 MTA 视为 SMTP 或 IMAP 服务器。 如果您不确定如何安装/配置并且您使用的是 Ubuntu:sudo apt-get install mailutils
并选择 Internet 站点:使用 SMTP 直接发送和接收邮件。 .【参考方案2】:
如果您想在 bash 中使用干净简单的方法,并且不想使用 cat
、echo
等,最简单的方法是:
mail -s "subject here" email@address.com <<< "message"
<<<
用于重定向标准输入。长期以来,它一直是 bash 的一部分。
【讨论】:
echo -e "Some\nMultiline and tab\t msg"|mail -s "subject" your@email.comcat << END
... END | mail -s "subject" test@example.com
嘿,这对我很有用,谢谢!我将如何指定多个送货地址?
@E.Owen 可以使用 -t 选项发送到多个用空格分隔的地址【参考方案3】:
如果 exim 和 ssmtp 都在运行,你可能会遇到麻烦。所以如果你只是想运行一个简单的 MTA,只是为了有一个简单的 smtp 客户端来发送电子邮件通知以供坚持,你应该清除最终预安装的 MTA,如 exim 或 postfix首先并重新安装 ssmtp。
那么就很简单了,只配置 2 个文件(revaliases 和 ssmtp.conf) - 请参阅 ssmtp doc - ,在 bash 或 bourne 脚本中的用法如下:
#!/bin/sh
SUBJECT=$1
RECEIVER=$2
TEXT=$3
SERVER_NAME=$HOSTNAME
SENDER=$(whoami)
USER="noreply"
[[ -z $1 ]] && SUBJECT="Notification from $SENDER on server $SERVER_NAME"
[[ -z $2 ]] && RECEIVER="another_configured_email_address"
[[ -z $3 ]] && TEXT="no text content"
MAIL_TXT="Subject: $SUBJECT\nFrom: $SENDER\nTo: $RECEIVER\n\n$TEXT"
echo -e $MAIL_TXT | sendmail -t
exit $?
显然不要忘记打开防火墙输出到 smtp 端口 (25)。
【讨论】:
我在哪里可以更改此脚本中的端口号?在我的服务器中,smtp 端口在 8181 上工作。 我不会在这个 shell 中这样做,否则你迟早会被卡住。你可以在配置文件中做:见unix.stackexchange.com/a/132731 如果我制作简单的 echo $MAIL_TXT,为什么会输入换行符? @Marko:请查看带有 -e 选项的 man echo:启用反斜杠转义的解释 抱歉,确实错过了 -e 参数【参考方案4】:bash 脚本中的另一个选项:
mailbody="Testmail via bash script"
echo "From: info@myserver.test" > /tmp/mailtest
echo "To: john@mywebsite.test" >> /tmp/mailtest
echo "Subject: Mailtest subject" >> /tmp/mailtest
echo "" >> /tmp/mailtest
echo $mailbody >> /tmp/mailtest
cat /tmp/mailtest | /usr/sbin/sendmail -t
每次使用此脚本时都会覆盖文件/tmp/mailtest
。
sendmail 的位置可能因系统而异。
在 cron 脚本中使用它时,您必须使用 sendmail 命令的绝对路径。
【讨论】:
被否决,因为多个进程可以同时调用该脚本。这可能会导致 tmp 文件损坏/不正确。此外,/tmp 文件在每次使用时都不会被覆盖 - 它实际上会随着包含所有先前电子邮件的每封电子邮件而增长。不好。 对 /tmp/mailtest 的第一次写入是覆盖,因此它将删除之前的任何内容。尽管如此,由于您描述的其他原因,这种方法并不理想。【参考方案5】:一般来说,您会希望使用mail
命令使用本地 MTA 发送您的消息(这将使用 SMTP 将其传送到目的地,或者只是将其转发到一些更强大的 SMTP 服务器,例如,在您的 ISP 处)。如果您没有本地 MTA(尽管对于类似 UNIX 的系统来说省略一个有点不寻常),您可以使用一些简约的 MTA,例如 ssmtp。
ssmtp
很容易配置。基本上,您只需要指定提供商的 SMTP 服务器在哪里:
# The place where the mail goes. The actual machine name is required
# no MX records are consulted. Commonly mailhosts are named mail.domain.com
# The example will fit if you are in domain.com and you mailhub is so named.
mailhub=mail
另一种选择是使用无数脚本之一,直接连接到 SMTP 服务器并尝试在那里发布消息,例如Smtp-Auth-Email-Script、smtp-cli、SendEmail 等。
【讨论】:
"ssmtp" 已安装在机器上,所以我无法尝试,但还是谢谢【参考方案6】:承认你想使用一些 smtp 服务器,你可以这样做:
export SUBJECT=some_subject
export smtp=somehost:someport
export EMAIL=someaccount@somedomain
echo "some message" | mailx -s "$SUBJECT" "$EMAIL"
将somehost
、someport
和someaccount@somedomain
更改为您将使用的实际值。
本例中不进行加密和认证。
【讨论】:
如果没有安装mailx
怎么办?【参考方案7】:
从 LINUX 向 GMAIL 发送邮件
使用后缀
1: 安装软件
Debian 和 Ubuntu:
apt-get update && apt-get install postfix mailutils
OpenSUSE:
zypper update && zypper install postfix mailx cyrus-sasl
Fedora:
dnf update && dnf install postfix mailx
CentOS:
yum update && yum install postfix mailx cyrus-sasl cyrus-sasl-plain
Arch Linux:
pacman -Sy postfix mailutils
FreeBSD:
portsnap fetch extract update
cd /usr/ports/mail/postfix
make config
在配置中选择 SASL 支持
make install clean
pkg install mailx
2。配置 Gmail
/etc/后缀。创建或编辑密码文件:
vim /etc/postfix/sasl_passwd
我使用 vim 你可以使用任何文件编辑器,例如 nano、cat .....
>Ubuntu、Fedora、CentOS、Debian、OpenSUSE、Arch Linux:
添加这个
其中用户替换为您的 mailname,密码是您的 gmail 密码
[smtp.gmail.com]:587 user@gmail.com:password
保存并关闭文件并使其只能由 root 访问:因为它包含您的密码的敏感内容
chmod 600 /usr/local/etc/postfix/sasl_passwd
>FreeBSD:
目录/usr/local/etc/postfix。
vim /usr/local/etc/postfix/sasl_passwd
添加行:
[smtp.gmail.com]:587 user@gmail.com:password
保存并使其只能由 root 访问:
chmod 600 /usr/local/etc/postfix/sasl_passwd
3。后缀配置
配置文件main.cf
后缀中必须设置的6个参数
Ubuntu、Arch Linux、Debian:
编辑
vim /etc/postfix/main.cf
修改以下值:
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_sasl_security_options,在配置中将被设置为空,以确保不使用与 Gmail 不兼容的安全选项。
保存并关闭
就像
OpenSUSE:
vim /etc/postfix/main.cf
修改
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/ca-bundle.pem
还需要配置文件master.cf
修改:
vim /etc/postfix/master.cf
取消注释这一行(删除#)
#tlsmgr unix - - n 1000? 1 tlsmg
保存并关闭
Fedora、CentOS:
vim /etc/postfix/main.cf
修改
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt
FreeBSD:
vim /usr/local/etc/postfix/main.cf
修改:
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/usr/local/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/mail/certs/cacert.pem
保存并关闭
4.处理密码文件:
Ubuntu、Fedora、CentOS、OpenSUSE、Arch Linux、Debian:
postmap /etc/postfix/sasl_passwd
对于 freeBSD
postmap /usr/local/etc/postfix/sasl_passwd
4.1) 重启后缀
Ubuntu、Fedora、CentOS、OpenSUSE、Arch Linux、Debian:
systemctl restart postfix.service
对于 FreeBSD:
service postfix onestart
nano /etc/rc.conf
添加
postfix_enable=YES
保存然后运行开始
service postfix start
5.在 Gmail 中启用“不太安全的应用” 使用以下链接的帮助
https://support.google.com/accounts/answer/6010255
6.发送测试电子邮件
mail -s "subject" recever@domain.com
按回车
根据需要添加邮件正文按回车然后按ctrl+d正确终止
如果它不起作用再次检查所有步骤并检查如果您在您的 gmail 中启用“不太安全的应用程序”
如果你修改了其中的任何内容,则重新启动 postfix
对于 shell 脚本,创建 .sh 文件并根据需要添加 6 步命令
例如只是一个示例
#!/bin/bash
REALVALUE=$(df / | grep / | awk ' print $5' | sed 's/%//g')
THRESHOLD=80
if [ "$REALVALUE" -gt "$THRESHOLD" ] ; then
mail -s 'Disk Space Alert' mailid@domainname.com << EOF
Your root partition remaining free space is critically low. Used: $REALVALUE%
EOF
fi
当磁盘使用率超过 THRESHOLD 变量指定的百分比(此处为 80%)时,脚本会发送一封电子邮件。
【讨论】:
这个答案的名称不应该是“SEND MAIL FROM LINUX TO recever@domain.com VIA GMAIL”吗?【参考方案8】:mail
命令可以做到这一点(谁会猜到 ;-)。打开您的 shell 并输入 man mail
以获取所有可用选项的 mail
命令的手册页。
【讨论】:
我这样做了,但没有指定要使用的服务器的选项 这是您本地邮件传输代理配置的一部分,例如Sendmail 或 Postfix。【参考方案9】:您甚至不需要 MTA。 SMTP 协议非常简单,可以直接将其写入您的 SMTP 服务器。如果您安装了 OpenSSL 软件包,您甚至可以通过 SSL/TLS 进行通信。查看此帖子:https://33hops.com/send-email-from-bash-shell.html
以上是关于如何发送开箱即用的文本/html 电子邮件的示例。如果你想添加附件,事情会变得更复杂一些,你需要对二进制文件进行 base64 编码并将它们嵌入边界之间。这是开始调查的好地方:http://forums.codeguru.com/showthread.php?418377-Send-Email-w-attachments-using-SMTP
【讨论】:
【参考方案10】:在 linux 上,mail 实用程序可用于发送带有选项“-a”的附件。浏览手册页以阅读有关该选项的信息。例如,以下代码将发送附件:
mail -s "THIS IS SUBJECT" -a attachment.txt name@domain.com
【讨论】:
欢迎来到 SO。感谢您发布答案。请阅读有关how to write a good answer 的信息并进行相应修改。尽情享受吧 ;-)【参考方案11】:您可以使用“email”或“emailx”命令。
(1) $ vim /etc/mail.rc # 或 #vim /etc/nail.rc
set from = xxx@xxx.com #
set smtp = smtp.exmail.gmail.com #gmail's smtp server
set smtp-auth-user = xxx@xxx.com #sender's email address
set smtp-auth-password = xxxxxxx #get from gmail, not your email account passwd
set smtp-auth=login
因为如果不是从授权帐户发送,电子邮件将进入垃圾邮件列表。
(2) $ echo "请记得删除未使用的 ons 主题!" | mail -s "waste topics" -a a.txt developer@xxx.com #send to group user 'developer@xxxx.com'
【讨论】:
以上是关于从 linux shell 脚本发送邮件的主要内容,如果未能解决你的问题,请参考以下文章
Linux学习-->如何通过Shell脚本实现发送邮件通知功能?
Linux下shell脚本PING命令只要延迟高于100ms就发送个邮件