web-dev-qa-db-ja.com

SMTP経由でbashスクリプトでメールを送信することは可能ですか?

Postfix + dovecotがあります。これにSMTPを使用できるbashスクリプトを作成したいと思います。 sendmailを使いたくありません。

出来ますか?誰かがコードの例を持っているかもしれませんか?

12
Jason

少年、そのガントレットが投げられると、いつも頭の真上でbashesされます。 :-)

#!/bin/sh

function checkStatus {
  expect=250
  if [ $# -eq 3 ] ; then
    expect="${3}"
  fi
  if [ $1 -ne $expect ] ; then
    echo "Error: ${2}"
    exit
  fi
}

MyHost=`hostname`

read -p "Enter your mail Host: " MailHost
MailPort=25

read -p "From: " FromAddr

read -p "To: " ToAddr

read -p "Subject: " Subject

read -p "Message: " Message

exec 3<>/dev/tcp/${MailHost}/${MailPort}

read -u 3 sts line
checkStatus "${sts}" "${line}" 220

echo "HELO ${MyHost}" >&3

read -u 3 sts line
checkStatus "$sts" "$line"

echo "MAIL FROM: ${FromAddr}" >&3

read -u 3 sts line
checkStatus "$sts" "$line"

echo "RCPT TO: ${ToAddr}" >&3

read -u 3 sts line
checkStatus "$sts" "$line"

echo "DATA" >&3

read -u 3 sts line
checkStatus "$sts" "$line" 354

echo "Subject: ${Subject}" >&3
echo "${Message}" >&3
echo "." >&3

read -u 3 sts line
checkStatus "$sts" "$line"
16
dldnh

Gmailでテストされ、現在は機能しています。

#!/bin/bash
# Use "Host -t mx yourispdomain" to find out yourispmailserver
exec 1<>/dev/tcp/yourispmailserver/25
a=$(cat <<"MAILEND"
HELO local.domain.name
MAIL FROM: <[email protected]>
RCPT TO: <[email protected]>
DATA
From: [email protected]
To: [email protected]
Subject: test
send your orders for pizza to the administrator.
.
QUIT
.
MAILEND
)
IFS='
'
declare -a b=($a)
for x in "${b[@]}"
 do
   echo $x
   sleep 1
 done
8
pizza

この小さいながらもすばらしいユーティリティsendemailsendmailではありません)を見つけました。構文が単純すぎて説明できません。

例:

SERVER="smtp.company.com"
FROM="[email protected]"
TO="[email protected]"
SUBJ="Some subject"
MESSAGE="Some message"
CHARSET="utf-8"

sendemail -f $FROM -t $TO -u $SUBJ -s $SERVER -m $MESSAGE -v -o message-charset=$CHARSET

ヘルプまたは作成者のサイトで入手できる詳細情報: http://caspian.dotconf.net/menu/Software/SendEmail/

6
n01d

bashがSMTPサーバーと直接通信するようにしたいですか?それは実際には起こりません。 bashで利用可能なネットワーク通信のサポートを使用して技術的に可能かもしれませんが、現実的にはその道をたどりたくありません。

つまり、本当に必要なのは、SMTPを使用する外部プログラムを呼び出すことです。通常、これはsendmailになりますが、これを回避しようとする場合は、他にも次のような選択肢がたくさんあります。

これらはどちらも、sendmailを使用せずにリモートSMTPサーバーとの通信を処理できます。

2
larsks

Sendmailを使いたくないと言ったとき、私にはわかりません。 sendmailプロセスを使用したくない場合があります。

Postfixには「sendmail」という実行可能ファイルがありますが、なぜそうすべきではないのかわからないので、使いたいと思うかもしれません。

#/bin/bash

FROM='[email protected]'
TO='[email protected]'
SUBJECT='This is a test message'

BODY="This is a test mail message body.
Hi there.
"

printf "From: <%s>\nTo: <%s>\nSubject: %s\n\n%s" "$FROM" "$TO" "$SUBJECT" "$BODY" | sendmail -f "$FROM"
1
dAm2K
  • たとえば、sSMTPをインストールします。

    apt-get install ssmtp

  • Ssmtpを構成します。

    Sudo nano /etc/ssmtp/ssmtp.conf

    ・サーバー:mailhub=smtp.1und1.de:587

    ・ホスト名:hostname=subdomain.domain.com

    ・ユーザー:[email protected]

    ・ パス: AuthPass=your_password

次に、shファイルで、必要なことを実行し、それをメールにパイプします。たとえば、次のようになります。

#!/bin/bash du -sh | mail -s "Disk usage report" [email protected]

OR

#!/bin/bash echo "Today's DB backup is ok." | mail -s "DB daily backup alert" [email protected]

1
achasinh

SSMTPを使用できます。多分これも役に立ちます:

http://tecadmin.net/send-email-smtp-server-linux-command-line-ssmtp/

1
Hafenkranich

dldnhの答えが大好きです!

専用のSMTPリレーを介して管理アラートを送信するための完璧なソリューション(私はあなたが持っていることを知っています)。 smtp/Postfix/etcを複数のサーバーに配置しても意味がありません。

私には1つの提案があります:メッセージテキストの前に1行の空白行を送信して、これ以上ヘッダーが来ないことをリレーに知らせます。空白行がないと、メッセージのテキストが送信されない場合があります。たとえば、メッセージの最初の行にコロンがある場合。

これが私が自由に取った小さな書き直しです:

#!/bin/bash
MyHost=$(hostname)
MailHost="mail"
MailPort=25

function checkStatus {
  read -u 3 sts line
  expect=250
  if [ $# -eq 1 ] ; then
    expect="${1}"
  fi
  if [ $sts -ne $expect ] ; then
    echo "Error: ${line}"
    exit
  fi
}

FromAddr="$(whoami)@${MyHost}"
ToAddr="[email protected]"
Subject="Status Alert"
Message='Msg: hello bozo!!'

# Brilliant!!
exec 3<>/dev/tcp/${MailHost}/${MailPort} ; checkStatus 220

echo "HELO ${MyHost}" >&3 ; checkStatus
echo "MAIL FROM: ${FromAddr}" >&3 ; checkStatus
echo "RCPT TO: ${ToAddr}" >&3 ; checkStatus
echo "DATA" >&3 ; checkStatus 354
echo "Subject: ${Subject}" >&3

# Insert one blank line here to let the relay know you are done sending headers
# Otherwise a colon ":" in the message text will result in no text being sent.
echo "" >&3

# Send the message text and close
echo "${Message}" >&3
echo "." >&3 ; checkStatus
0
Frobozz