Linuxシェルスクリプトからメールを送信する


120

Linuxシェルスクリプトからメールを送信したい。これを行うための標準コマンドは何ですか?特別なサーバー名を設定する必要がありますか?


8
スーパーユーザー[ superuser.com ]または、さらに良いことに、UnixおよびLinux SE [ unix.stackexchange.com ]で質問してみてください。
Dan Molding

回答:


119

サーバーが適切に構成されている場合、たとえば、稼働中のMTAがある場合は、mailコマンドを使用するだけで済みます。

たとえば、ファイルのコンテンツを送信するには、次のようにします。

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

man mail 詳細については。


7
ここで「mta」とはどういう意味ですか、フルネームまたはリンクはありますか?初心者として、それが知りたいことです。私にはそれをする経験がないので。
Zen

5
@Zen MTAは、メール転送エージェントの略です。postfix、sendmail、qmailなど
Francesco Laurita 2014年

@Zenの大部分は、MTAはSMTPまたはIMAPサーバーを意味すると見なすことができます。
user151841 2015

1
インストール/設定の方法がわからない場合で、Ubuntuを使用している場合:インターネットサイトsudo apt-get install mailutilsを選択: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クライアントが支援のために電子メール通知を送信するようにするには、最初にeximpostfixのような最終的にプレインストールされたMTAを削除し、ssmtpを再インストールします。

次に、2つのファイル(revaliasesとssmtp.conf)のみを構成します。ssmtpdocを参照してください。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

1
単純なエコー$ MAIL_TXTを実行すると、改行が無視されるのはなぜですか?
KernelPanic 2014年

1
@Marko:Plsは-eオプションでman echoを参照します:バックスラッシュエスケープの解釈を有効にします
hornetbzz '23 / 11/14

-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ファイルは、これが使用されるたびに上書きされることはありません。実際には、以前のすべての電子メールが含まれる電子メールごとにファイルが大きくなります。良くない。
Taterhead、2018年

1
/ tmp / mailtestへの最初の書き込みは上書きであるため、以前そこにあったものはすべて削除されます。それでも、この方法は、説明した他の理由から理想的ではありません。
Simon、

8

一般的には、使用したい mailコマンドを使用してローカルMTAを使用してメッセージを送信します(これは、SMTPを使用して宛先に配信するか、ISPなどのより強力なSMTPサーバーに転送するだけです)。ローカルMTAがない場合(UNIXのようなシステムでは省略されることは少し珍しいのですが)、ssmtpのような最小限のMTAを使用することができます。

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-メールスクリプトSMTP-CLIのsendEmailなど、


「ssmtp」がマシンにインストールされたので、試すことができませんでしたが、とにかくありがとう
appshare.co

5

あなたがいくつかのSMTPサーバーを使いたいと認めているなら、あなたは次のことができます:

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

変更somehostsomeportおよびsomeaccount@somedomainあなたが使用する実際の値に。この例では、暗号化と認証は行われません。


mailxインストールされていない場合はどうすればよいですか?
nalply

2

mailコマンドは(誰が;-)推測しているであろうとしません。シェルを開いて入力man mailmail、使用可能なすべてのオプションのコマンドのマニュアルページを取得します。


2
私はそれをしましたが、使用するサーバーを指定するオプションはありません
appshare.co

1
これは、SendmailやPostfixなどのローカルメール転送エージェント構成の一部です。
DarkDust

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では、メールユーティリティを使用して、オプション「-a」で添付ファイルを送信できます。オプションについて読むには、manページを参照してください。たとえば、次のコードは添付ファイルを送信します。

mail -s "THIS IS SUBJECT" -a attachment.txt name@domain.com <<< "Hi Buddy、Please find failure reports。"


SOへようこそ。回答を投稿していただきありがとうございます。良い答えを書く方法についての情報を読み、それに応じて修正してください。SOをお楽しみください;-)
ZF007 2018

2

LinuxからGmailにメールを送信する

POSTFIXの使用

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 / postfix。パスワードファイルを作成または編集します。

vim /etc/postfix/sasl_passwd

vimを使用するim uは、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. Postfixの設定

設定ファイル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

以下のためのFreeBSD

postmap /usr/local/etc/postfix/sasl_passwd

4.1)postfixを再起動します

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を再起動します

シェルスクリプトの場合、.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%)を超えたときにメールを送信します。


この回答の名前は、「Linuxからrecever@domain.comにメールを送信してGMAIL経由で送信する」のようにすべきではありませんか?
キャメロンハドソン

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 "Plsは未使用のトピックを削除することを忘れないでください!" | メール-s「廃棄物トピック」-a a.txt developer@xxx.com#グループユーザー 'developer@xxxx.com'に送信

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.