从 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 中使用干净简单的方法,并且不想使用 catecho 等,最简单的方法是:

mail -s "subject here" email@address.com <<< "message"

&lt;&lt;&lt; 用于重定向标准输入。长期以来,它一直是 bash 的一部分。

【讨论】:

echo -e "Some\nMultiline and tab\t msg"|mail -s "subject" your@email.com cat &lt;&lt; END ... END | mail -s "subject" test@example.com 嘿,这对我很有用,谢谢!我将如何指定多个送货地址? @E.Owen 可以使用 -t 选项发送到多个用空格分隔的地址【参考方案3】:

如果 exim 和 ssmtp 都在运行,你可能会遇到麻烦。所以如果你只是想运行一个简单的 MTA,只是为了有一个简单的 smtp 客户端来发送电子邮件通知以供坚持,你应该清除最终预安装的 MTA,如 eximpostfix首先并重新安装 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"

somehostsomeportsomeaccount@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

还需要配置文件ma​​ster.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 上,ma​​il 实用程序可用于发送带有选项“-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就发送个邮件

shell 脚本自动配置发送qq邮件

利用linux mutt 发送邮件(在Shell脚本中使用比较方便)

linux下发送邮件过程

Linux中使用Shell把报警信息发送至邮件和微信上