web-dev-qa-db-ja.com

Bash Shellスクリプトからメールを送信する

私は Bash Mac用のシェルスクリプトを書いています。このスクリプトは、Mail.appのデフォルトのメールアカウントでメールを送信するオートマトンアプリケーションを開くことでメール通知を送信します。オートマトルアプリケーションは、スクリプトが書き込んだテキストファイルも添付します。このソリューションの問題は

  1. 送信時にGUIに表示されます
  2. Mailが現在のアプリケーションではない場合、フォーカスを奪います
  3. Mail.appのアカウント設定が将来有効になることに依存しています

[〜#〜] smtp [〜#〜] settings、送信先アドレスなどをスクリプトに直接入力して、スクリプトから直接メールを送信する必要があるという欠点を回避するために考えています。問題は、コンピューターで Postfix を有効にせずに、このスクリプトを複数のコンピューター(10.5および10.6)に展開したいことです。スクリプトでこれを実行して、10.5の基本Mac OS Xインストールで実行することは可能ですか?と10.6?

更新:Sendmailの-bsオプションを見つけましたが、これは必要なもののようですが、設定の指定方法がわかりません。

また、明確にするために、SMTP設定を指定する理由は、Postfix経由で送信されるポート25のローカルホストからのメールがほとんどの企業ファイアウォールによってブロックされるためですが、サーバーと代替ポートを指定すると実行されませんその問題に。

35
ridogi

Mac OS XにはPythonが含まれているため、Bashスクリプトの代わりにPythonスクリプトを使用することを検討してください。送信部分はテストしていませんが、 標準例 に従います。

Pythonスクリプト

# Settings

SMTP_SERVER = 'mail.myisp.com'
SMTP_PORT = 25
SMTP_USERNAME = 'myusername'
SMTP_PASSWORD = '$uper$ecret'
SMTP_FROM = '[email protected]'
SMTP_TO = '[email protected]'

TEXT_FILENAME = '/script/output/my_attachment.txt'
MESSAGE = """This is the message
to be sent to the client.
"""

# Now construct the message
import smtplib, email
from email import encoders
import os

msg = email.MIMEMultipart.MIMEMultipart()
body = email.MIMEText.MIMEText(MESSAGE)
attachment = email.MIMEBase.MIMEBase('text', 'plain')
attachment.set_payload(open(TEXT_FILENAME).read())
attachment.add_header('Content-Disposition', 'attachment', filename=os.path.basename(TEXT_FILENAME))
encoders.encode_base64(attachment)
msg.attach(body)
msg.attach(attachment)
msg.add_header('From', SMTP_FROM)
msg.add_header('To', SMTP_TO)

# Now send the message
mailer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
# EDIT: mailer is already connected
# mailer.connect()
mailer.login(SMTP_USERNAME, SMTP_PASSWORD)
mailer.sendmail(SMTP_FROM, [SMTP_TO], msg.as_string())
mailer.close()

これがお役に立てば幸いです。

53
Jason R. Coombs

実際、「メール」も同様に機能します。

mail -s "subject line" [email protected] < filename

マシンにSMTPがセットアップされている限り、完全に機能します。ほとんどのMacはデフォルトでそうだと思います。

SMTPをお持ちでない場合、できることはMail.appを使用することだけです。 mail.appを経由する別の方法は、 AppleScript を使用することです。 AppleScript経由でメールを送信するようにMail.appに指示すると、ウィンドウをポップアップしないように指示できます...(これにはMail.appを構成する必要があります)。

スクリプトメールの概要には、AppleScriptでメールを操作する方法に関する適切な説明があります。

38
Brian Postow

Sendmail というプログラムがあります。

Martinの例のように生のSMTPとして送信しない限り、おそらく-bsコマンドを使用したくないでしょう。 -bsは、SMTPサーバーをデーモンとして実行するためのものです。設定ファイルで上書きしない限り、Sendmailは受信メールサーバーに(ポート25で)直接送信します。 -Cパラメーターによって構成ファイルを指定できます。

構成では、中継サーバー(別のマシンで-bsを実行しているメールサーバーまたはsendmail)を指定できます

適切に構成されたリレーサーバーを使用するのは、ITがメールサーバーを管理するときに [〜#〜] spf [〜#〜] および ドメインキー を実装するためです。これにより、メールがジャンクビンに入れられなくなります。

ポート25がブロックされている場合、2つのオプションが残っています。

  1. 企業のSMTPサーバーを使用します。
  2. 25以外のポートでリッスンする企業ファイアウォールの外側のマシンでsendmail -bdを実行します。

コマンドラインで設定パラメータを追加できると思います。必要なのはSMART_Hostオプションです。したがって、sendmail -OSMART_Host=nameofhost.comのようなSendmailを呼び出します。

15
Byron Whitlock

プログラムを自給自足させながらこれを行うことができる唯一の方法は、クライアントからSMTPサーバーに直接アクセスできる場合です。

SMTPサーバーに直接アクセスできる場合は、ウィキペディアの SMTPの例 を使用して、次のように変換できます。

#!/bin/bash
telnet smtp.example.org 25 <<_EOF
HELO relay.example.org
MAIL FROM:<[email protected]>
RCPT TO:<[email protected]>
DATA
From: Joe <[email protected]>
To: Jane <[email protected]>
Subject: Hello

Hello, world!
.
QUIT
_EOF

エラーを処理するには、出力をtelnetからファイルにリダイレクトし、後で「成功メッセージ」を得るためにgrepします。メッセージの形式はわかりませんが、SMTPサーバーからの出力に「250 2.0.0 Ok:queued as D86A226C574」のようなメッセージが表示されます。これにより、「^ 250. * queued as」のgrepが作成されます。

10
Martin Olsen

sendEmailは、リモートsmtpサーバーへの接続など、より複雑な設定を使用してコマンドラインから電子メールを送信するために使用できるスクリプトです。 http://caspian.dotconf.net/menu/Software/SendEmail/ =

OSXでは、macportsを使用して簡単にインストールできます。 http://sendemail.darwinports.com/

以下はコマンドのヘルプページです。-s、-xu、-xpフラグに注意してください。

Synopsis:  sendEmail -f ADDRESS [options]

Required:
  -f ADDRESS                from (sender) email address
  * At least one recipient required via -t, -cc, or -bcc
  * Message body required via -m, STDIN, or -o message-file=FILE

Common:
  -t ADDRESS [ADDR ...]     to email address(es)
  -u SUBJECT                message subject
  -m MESSAGE                message body
  -s SERVER[:PORT]          smtp mail relay, default is localhost:25

Optional:
  -a   FILE [FILE ...]      file attachment(s)
  -cc  ADDRESS [ADDR ...]   cc  email address(es)
  -bcc ADDRESS [ADDR ...]   bcc email address(es)

Paranormal:
  -xu USERNAME              authentication user (for SMTP authentication)
  -xp PASSWORD              authentication password (for SMTP authentication)
  -l  LOGFILE               log to the specified file
  -v                        verbosity, use multiple times for greater effect
  -q                        be quiet (no stdout output)
  -o NAME=VALUE             see extended help topic "misc" for details

Help:
  --help TOPIC              The following extended help topics are available:
      addressing            explain addressing and related options
      message               explain message body input and related options
      misc                  explain -xu, -xp, and others
      networking            explain -s, etc
      output                explain logging and other output options
6
Mark Carey

Bashから1行でメールを送信します。

echo "your mail body" | mail -s "your subject" [email protected] -a "From: [email protected]"
5
Olivier

これを行う簡単な Ruby スクリプトを次に示します。 Rubyは、あなたが言及したMac OS Xバージョンに同梱されています。

「置換」とマークされたすべてのビットを置き換えます。失敗すると、ゼロ以外の終了コードとRubyバックトレースを返します。

require 'net/smtp'

SMTPHOST = 'replace.yoursmtpserver.example.com'
FROM = '"Your Email" <[email protected]>'

def send(to, subject, message)
  body = <<EOF
From: #{FROM}
To: #{to}
Subject: #{subject}

#{message}
EOF
  Net::SMTP.start(SMTPHOST) do |smtp|
    smtp.send_message body, FROM, to
  end
end

send('[email protected]', 'testing', 'This is a message!')

これを次のようにBashスクリプトに埋め込むことができます。

Ruby << EOF
 ... script here ...
EOF

Rubyメールを送信する他の方法については、Stack Overflowの質問Rubyプログラムからメールを送信するにはどうすればよいですか?

Mac OS Xに同梱されている他の言語も使用できます。

4
docwhat

挑戦のためにこれをホイップしました。メールリレーを取得するために「Dig」の呼び出しを削除すると、100%ネイティブのBashスクリプトになります。

#!/bin/bash
MAIL_FROM="[email protected]"
RCPT_TO="[email protected]"
MESSAGE=message.txt
SMTP_PORT=25
SMTP_DOMAIN=${RCPT_TO##*@}

index=1
while read PRIORITY RELAY
do
    RELAY[$index]=$RELAY
    ((index++))
done < <( Dig +short MX $SMTP_DOMAIN )

RELAY_COUNT=${#RELAY[@]}
SMTP_COMMANDS=( "HELO $HOSTNAME" "MAIL FROM: <$MAIL_FROM>" "RCPT TO: <$RCPT_TO>" "DATA" "." "QUIT" )
SMTP_REPLY=([25]=OK [50]=FAIL [51]=FAIL [52]=FAIL [53]=FAIL [54]=FAIL [55]=FAIL [45]=WAIT [35]=DATA [22]=SENT)

for (( i = 1 ; i < RELAY_COUNT ; i++ ))
do
    SMTP_Host="${RELAY[$i]}"
    echo "Trying relay [$i]: $SMTP_Host..."
    exec 5<>/dev/tcp/$SMTP_Host/$SMTP_PORT
    read HELO <&5
    echo GOT: $HELO
    for COMMAND_ORDER in 0 1 2 3 4 5 6 7
    do
            OUT=${SMTP_COMMANDS[COMMAND_ORDER]}
            echo SENDING: $OUT
            echo -e "$OUT\r" >&5

            read -r REPLY <&5
            echo REPLY: $REPLY
            # CODE=($REPLY)
            CODE=${REPLY:0:2}
            ACTION=${SMTP_REPLY[CODE]}
            case $ACTION in
                    WAIT )          echo Temporarily Fail
                                                    break
                                                    ;;
                    FAIL )          echo Failed
                                                    break
                                                    ;;
                    OK )                            ;;
                    SENT )          exit 0
                                                    ;;
                    DATA )          echo Sending Message: $MESSAGE
                                                    cat $MESSAGE >&5
                                                    echo -e "\r" >&5
                                                    ;;
                    * )         echo Unknown SMTP code $CODE
                                                    exit 2
            esac
    done
done
4
Orwellophile

sendmailpostfixでさえ、スクリプトから数通のメールを送信するだけの場合、インストールするには大きすぎる場合があります。

たとえば、 Gmail アカウントがある場合、Googleのサーバーを使用して [〜#〜] smtp [〜#〜] を使用してメールを送信できます。 gGoogleのサーバーを使用したくない場合は、何らかのSMTPサーバーにアクセスできる限り機能します。

これを簡単にする非常に軽量なプログラムは、 msmtp です。 ドキュメント設定ファイルの例 があります。

最も簡単な方法は、システム全体のデフォルトを設定することです。

account default
Host smtp.gmail.com
from [email protected]
user [email protected]
password XXX
port 587

msmtpは非常に簡単にインストールできます。実際、 ポート がありますので、port install msmtpと同じくらい簡単です。

msmtpをインストールして構成したら、次を使用して[email protected]にメールを送信できます。

mail -s <subject> [email protected] <<EOF
<mail text, as many lines as you want. Shell variables will be expanded>.
EOF

上記をスクリプトに入れることができます。詳細については、man mailを参照してください。

3
Alok Singhal

1)アウトバウンドメールのみを処理し、メールゲートウェイ経由でリレーするようにpostfixを設定しないのはなぜですか?その最大の利点は、OS Xクライアントに既にインストールされていることです。

2)nullmailerssmtp(MacPorts経由で利用可能)など、送信メールのみを処理する軽量MTAの1つをインストールして構成します。

どちらの場合も、mailx(1)(または空想を得たい場合はmutt)を使用して、シェルスクリプトからメールを送信します。

詳細については、サーバーフォールトに関するいくつかの質問があります。

3
user3850

これは、さまざまなUNIXシステムで使用した修正されたシェルスクリプトスニペットです... (echo "${MESSAGE}" | ${uuencode} ${ATTACHMENT} $ basename $ {ATTACHMENT} ) | ${mailx} -s "${SUBJECT}" "${TO_LIST}"

uuencodeとmailxは実行可能ファイルに設定されます。その他の変数は、getoptsを使用して解析されたユーザー入力からのものです。

これは機能しますが、私は単純なJavaプログラムを使用してコンソールメールを送信することを頻繁に認めなければなりません。

0
tmeisenh

Mtcmailを試してください。かなり完全なメール送信者で、完全にスタンドアロンです。

0
motobói