【发布时间】:2011-07-06 13:40:15
【问题描述】:
我想通过 Linux Shell 脚本发送电子邮件。执行此操作的标准命令是什么?我需要设置任何特殊的服务器名称吗?
【问题讨论】:
-
尝试询问超级用户 [superuser.com],或者更好的是 Unix 和 Linux SE [unix.stackexchange.com]。
标签: linux email shell sendmail
我想通过 Linux Shell 脚本发送电子邮件。执行此操作的标准命令是什么?我需要设置任何特殊的服务器名称吗?
【问题讨论】:
标签: linux email shell sendmail
如果服务器配置良好,例如它有一个启动并运行的 MTA,您可以使用 mail 命令。
例如,要发送文件的内容,您可以这样做:
$ cat /path/to/file | mail -s "your subject" your@email.com
man mail了解更多详情。
【讨论】:
sudo apt-get install mailutils 并选择 Internet 站点:使用 SMTP 直接发送和接收邮件。 .
如果您想在 bash 中使用干净简单的方法,并且不想使用 cat、echo 等,最简单的方法是:
mail -s "subject here" email@address.com <<< "message"
<<< 用于重定向标准输入。长期以来,它一直是 bash 的一部分。
【讨论】:
cat << END ... END | mail -s "subject" test@example.com
如果 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)。
【讨论】:
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。 【讨论】:
一般来说,您会希望使用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 等。
【讨论】:
承认你想使用一些 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怎么办?
使用后缀
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%)时,脚本会发送一封电子邮件。
【讨论】:
mail 命令可以做到这一点(谁会猜到 ;-)。打开您的 shell 并输入 man mail 以获取所有可用选项的 mail 命令的手册页。
【讨论】:
您甚至不需要 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
【讨论】:
在 linux 上,mail 实用程序可用于发送带有选项“-a”的附件。浏览手册页以阅读有关该选项的信息。例如,以下代码将发送附件:
mail -s "THIS IS SUBJECT" -a attachment.txt name@domain.com
【讨论】:
您可以使用“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'
【讨论】: