私は Bash Mac用のシェルスクリプトを書いています。このスクリプトは、Mail.appのデフォルトのメールアカウントでメールを送信するオートマトンアプリケーションを開くことでメール通知を送信します。オートマトルアプリケーションは、スクリプトが書き込んだテキストファイルも添付します。このソリューションの問題は
[〜#〜] smtp [〜#〜] settings、送信先アドレスなどをスクリプトに直接入力して、スクリプトから直接メールを送信する必要があるという欠点を回避するために考えています。問題は、コンピューターで Postfix を有効にせずに、このスクリプトを複数のコンピューター(10.5および10.6)に展開したいことです。スクリプトでこれを実行して、10.5の基本Mac OS Xインストールで実行することは可能ですか?と10.6?
更新:Sendmailの-bs
オプションを見つけましたが、これは必要なもののようですが、設定の指定方法がわかりません。
また、明確にするために、SMTP設定を指定する理由は、Postfix経由で送信されるポート25のローカルホストからのメールがほとんどの企業ファイアウォールによってブロックされるためですが、サーバーと代替ポートを指定すると実行されませんその問題に。
Mac OS XにはPythonが含まれているため、Bashスクリプトの代わりに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()
これがお役に立てば幸いです。
実際、「メール」も同様に機能します。
mail -s "subject line" [email protected] < filename
マシンにSMTPがセットアップされている限り、完全に機能します。ほとんどのMacはデフォルトでそうだと思います。
SMTPをお持ちでない場合、できることはMail.appを使用することだけです。 mail.appを経由する別の方法は、 AppleScript を使用することです。 AppleScript経由でメールを送信するようにMail.appに指示すると、ウィンドウをポップアップしないように指示できます...(これにはMail.appを構成する必要があります)。
スクリプトメールの概要には、AppleScriptでメールを操作する方法に関する適切な説明があります。
Sendmail というプログラムがあります。
Martinの例のように生のSMTPとして送信しない限り、おそらく-bs
コマンドを使用したくないでしょう。 -bs
は、SMTPサーバーをデーモンとして実行するためのものです。設定ファイルで上書きしない限り、Sendmailは受信メールサーバーに(ポート25で)直接送信します。 -C
パラメーターによって構成ファイルを指定できます。
構成では、中継サーバー(別のマシンで-bs
を実行しているメールサーバーまたはsendmail)を指定できます
適切に構成されたリレーサーバーを使用するのは、ITがメールサーバーを管理するときに [〜#〜] spf [〜#〜] および ドメインキー を実装するためです。これにより、メールがジャンクビンに入れられなくなります。
ポート25がブロックされている場合、2つのオプションが残っています。
sendmail -bd
を実行します。コマンドラインで設定パラメータを追加できると思います。必要なのはSMART_Hostオプションです。したがって、sendmail -OSMART_Host=nameofhost.com
のようなSendmailを呼び出します。
プログラムを自給自足させながらこれを行うことができる唯一の方法は、クライアントから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が作成されます。
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
Bashから1行でメールを送信します。
echo "your mail body" | mail -s "your subject" [email protected] -a "From: [email protected]"
これを行う簡単な 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に同梱されている他の言語も使用できます。
挑戦のためにこれをホイップしました。メールリレーを取得するために「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
sendmail
とpostfix
でさえ、スクリプトから数通のメールを送信するだけの場合、インストールするには大きすぎる場合があります。
たとえば、 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
を参照してください。
1)アウトバウンドメールのみを処理し、メールゲートウェイ経由でリレーするようにpostfix
を設定しないのはなぜですか?その最大の利点は、OS Xクライアントに既にインストールされていることです。
2)nullmailer
やssmtp
(MacPorts経由で利用可能)など、送信メールのみを処理する軽量MTAの1つをインストールして構成します。
どちらの場合も、mailx(1)
(または空想を得たい場合はmutt
)を使用して、シェルスクリプトからメールを送信します。
詳細については、サーバーフォールトに関するいくつかの質問があります。
これは、さまざまなUNIXシステムで使用した修正されたシェルスクリプトスニペットです... (echo "${MESSAGE}" | ${uuencode} ${ATTACHMENT}
$ basename $ {ATTACHMENT} ) | ${mailx} -s "${SUBJECT}" "${TO_LIST}"
uuencodeとmailxは実行可能ファイルに設定されます。その他の変数は、getoptsを使用して解析されたユーザー入力からのものです。
これは機能しますが、私は単純なJavaプログラムを使用してコンソールメールを送信することを頻繁に認めなければなりません。
Mtcmailを試してください。かなり完全なメール送信者で、完全にスタンドアロンです。