从linux shell脚本发送邮件


Answers:


119

如果服务器配置正确,例如它已启动并正在运行MTA,则可以只使用mail命令。

例如,要发送文件的内容,可以执行以下操作:

$ cat /path/to/file | mail -s "your subject" your@email.com

man mail 更多细节。


7
“ mta”在这里是什么意思,是否有全名或链接?作为初学者,这就是我想知道的。由于我缺乏经验,无法做到这一点。
2014年

5
@Zen MTA代表邮件传输代理。postfix,sendmail,qmail等
Francesco Laurita 2014年

在大多数情况下,@ Zen可以认为MTA表示SMTP或IMAP服务器。
user151841

1
如果不确定如何安装/配置,并且使用的是Ubuntu sudo apt-get install mailutils,请选择Internet站点:直接使用SMTP发送和接收邮件。
user1717828

86

如果你想在bash一个清洁,简单的方法,而你不想用catecho等等,最简单的方法是:

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

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


6
echo -e“ Some \ nMultiline and tab \ t msg” | mail -s“ subject” your@email.com
Pipo

cat << END...END | mail -s "subject" test@example.com
ulidtko

嘿,这对我来说很棒,谢谢!我将如何指定要发送到的多个地址?
E.Owen

1
@ E.Owen您可以使用-t选项发送到多个用空格隔开的地址
Jon

25

如果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
MANIX

我不会在此外壳中执行此操作,否则您迟早会陷入困境。您可以在配置文件中执行此操作:请参见unix.stackexchange.com/a/132731
hornetbzz 2014年

1
如果执行简单的echo $ MAIL_TXT,为什么换行符会被淹没?
KernelPanic 2014年

1
@Marko:请使用-e选项查看人的回声:启用反斜杠转义的解释
hornetbzz 2014年

抱歉,没有误-e参数
KernelPanic 2014年

10

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命令使用绝对路径。

1
之所以投票,是因为多个进程可以同时调用该脚本。这可能会导致tmp文件损坏/不正确。同样,/ tmp文件不会在每次使用时都被覆盖-实际上,它随包含内部所有以前电子邮件的每封电子邮件一起增长。不好。
泰特黑德

1
第一次写入/ tmp / mailtest是覆盖,因此它将删除以前的内容。但是,由于您描述的其他原因,该方法还是不理想的。
西蒙

8

通常,您希望使用mail命令通过本地MTA发送消息(这将使用SMTP将其传递到目标,或者仅将其转发到功能更强大的SMTP服务器,例如在ISP上)。如果您没有本地MTA(尽管对于类似UNIX的系统来说,省略一个MTA有点不寻常),则您可以使用一些简单的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-Scriptsmtp-cliSendEmail等。


“ ssmtp”已安装在计算机上,因此我无法尝试,但还是要感谢
appshare.co

5

承认要使用某些SMTP服务器,可以执行以下操作:

export SUBJECT=some_subject
export smtp=somehost:someport
export EMAIL=someaccount@somedomain
echo "some message" | mailx -s "$SUBJECT" "$EMAIL"

变化somehostsomeportsomeaccount@somedomain实际值,你会使用。在此示例中,不进行加密也不进行身份验证。


如果mailx未安装该怎么办?
2012年

2

mail命令将执行此操作(谁会猜到;-)。打开您的外壳并输入man mail以获取该mail命令的手册页,其中包含所有可用选项。


2
我这样做了,但是没有选择要使用的服务器的选择
appshare.co

1
这是本地邮件传输代理配置的一部分,例如Sendmail或Postfix。
DarkDust 2011年

2

您甚至不需要MTA。SMTP协议非常简单,可以直接将其写入SMTP服务器。如果您安装了OpenSSL软件包,则甚至可以通过SSL / TLS进行通信。检查此帖子:https : //33hops.com/send-email-from-bash-shell.html

上面是有关如何发送开箱即用的text / html电子邮件的示例。如果要添加附件,事情可能会变得更加复杂,您将需要对二进制文件进行base64编码并将其嵌入边界之间。这是开始调查的好地方:http ://forums.codeguru.com/showthread.php?418377-Send-Email-w-attachments-using-SMTP


2

在linux上,可以使用mail实用程序发送带有选项“ -a”的附件。浏览手册页以了解有关该选项的信息。例如,以下代码将发送附件:

邮件-s“这是主题” -a attachment.txt name@domain.com <<<“嗨,朋友,请查找失败报告。”


欢迎来到SO。感谢您发布答案。请阅读有关如何写一个好的答案并进行相应修改的信息。享受SO ;-)
ZF007

2

从LINUX发送邮件到GMAIL

使用后缀

1: 安装软件

Debian和Ubuntu:

apt-get update && apt-get install postfix mailutils

OpenSUSE:

zypper update && zypper install postfix mailx cyrus-sasl

软呢帽:

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 / postfix。创建或编辑密码文件:

vim /etc/postfix/sasl_passwd

我使用vim可以使用任何文件编辑器,例如nano,cat .....

> Ubuntu,Fedora,CentOS,Debian,OpenSUSE,Arch Linux:

加上这个

用户用您的邮件名和密码替换的位置是您的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

我们必须在Postfix中设置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在配置中将设置为empty,以确保没有与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

对于免费的BSD

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

按Enter

根据需要添加邮件正文,按Enter键,然后按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 varialbe指定的百分比(此处为80%)时,脚本将发送电子邮件。


这个答案的名称不应该是“通过GMAIL从LINUX发送邮件到recever@domain.com”吗?
卡梅伦·哈德森

1

您可以使用'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“请记住要删除未使用的主题!” | 邮件-s“浪费主题” -a a.txt developer@xxx.com#发送给组用户'developer@xxxx.com'

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.