シェルスクリプトを使用してHTMLメールを送信するにはどうすればよいですか?
まず、メッセージを作成する必要があります。最低限は、次の2つのヘッダーで構成されます。
MIME-Version: 1.0
Content-Type: text/html
...および適切なメッセージ本文:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title></title>
</head>
<body>
<p>Hello, world!</p>
</body>
</html>
入手したら、適切な情報を mail コマンドに渡すことができます。
body = '...'
echo $body | mail \
-a "From: [email protected]" \
-a "MIME-Version: 1.0" \
-a "Content-Type: text/html" \
-s "This is the subject" \
[email protected]
文字セット、エンコーディング、最大行長にも注意する必要があるため、これは単純化された例です。しかし、これは基本的にはアイデアです。
または、プレーンシェルではなく、PerlまたはPHPでスクリプトを記述できます。
シェルスクリプトは基本的に、 Shebang と呼ばれる行で始まるUnixの行末を持つテキストファイルであり、シェルにファイルを渡す必要があるインタープリターを伝え、インタープリターが理解し、持っている言語のいくつかのコマンドに従います実行許可(Unixではファイル属性です)。たとえば、次をhello-world
として保存するとします。
#!/bin/sh
echo Hello, world!
次に、実行許可を割り当てます。
chmod +x hello-world
そして最終的にそれを実行できます:
./hello-world
いずれにせよ、これは元の質問とは無関係です。高度なタスクを実行する前に、基本的なシェルスクリプトに慣れる必要があります。ここに、人気のシェルであるbashに関するリンクがいくつかあります:
http://www.gnu.org/software/bash/manual/html_node/index.html
タグには「sendmail」が含まれているため、これを使用したソリューションを次に示します。
(
echo "From: [email protected] "
echo "To: [email protected] "
echo "MIME-Version: 1.0"
echo "Content-Type: multipart/alternative; "
echo ' boundary="some.unique.value.ABC123/server.xyz.com"'
echo "Subject: Test HTML e-mail."
echo ""
echo "This is a MIME-encapsulated message"
echo ""
echo "--some.unique.value.ABC123/server.xyz.com"
echo "Content-Type: text/html"
echo ""
echo "<html>
<head>
<title>HTML E-mail</title>
</head>
<body>
<a href='http://www.google.com'>Click Here</a>
</body>
</html>"
echo "------some.unique.value.ABC123/server.xyz.com--"
) | sendmail -t
Sendmailのラッパーは、このジョブを簡単にすることができます。たとえば、 mutt :
mutt -e 'set content_type="text/html"' [email protected] -s "subject" < message.html
これまでのところ、cmd linuxで2つの簡単な方法を見つけました
mail -s "$(echo -e "This is Subject\nContent-Type: text/html")" [email protected] < mytest.html
mutt -e "my_hdr Content-Type: text/html" [email protected] -s "subject" < mytest.html
別のオプションはmsmtpの使用です。
必要なのは、次のようなもので.msmtprcを設定することです(例はgmailを使用しています):
account default
Host smtp.gmail.com
port 587
from [email protected]
tls on
tls_starttls on
tls_trust_file ~/.certs/equifax.pem
auth on
user [email protected]
password <password>
logfile ~/.msmtp.log
それから電話してください:
(echo "Subject: <subject>"; echo; echo "<message>") | msmtp <[email protected]>
あなたのスクリプトで
更新:HTMLメールの場合は、ヘッダーも配置する必要があるため、次のようなファイルを作成できます。
From: [email protected]
To: [email protected]
Subject: Important message
Mime-Version: 1.0
Content-Type: text/html
<h1>Mail body will be here</h1>
The mail body <b>should</b> start after one blank line from the header.
そして次のように郵送します
cat email-template | msmtp [email protected]
同じことはコマンドラインでも実行できますが、ファイルを使用する方が簡単かもしれません。
もう1つのオプションは、sendEmailスクリプト http://caspian.dotconf.net/menu/Software/SendEmail/ です。また、メッセージタイプをhtmlに設定し、メッセージ本文としてファイルを含めることもできます。詳細については、リンクを参照してください。
Mimeヘッダーとfrom、toアドレスは、htmlファイルにそれ自身を含めることもできます。
コマンド
cat cpu_alert.html | /usr/lib/sendmail -t
cpu_alert.htmlファイルのサンプル。
From: [email protected]
To: [email protected]
Subject: CPU utilization heigh
Mime-Version: 1.0
Content-Type: text/html
<h1>Mail body will be here</h1>
The mail body should start after one blank line from the header.
ここで利用可能なサンプルコード: http://sugunan.net/git/slides/Shell/cpu.php
cat > mail.txt <<EOL
To: <email>
Subject: <subject>
Content-Type: text/html
<html>
$(cat <report-table-*.html>)
This report in <a href="<url>">SVN</a>
</html>
EOL
その後:
sendmail -t < mail.txt
CentOS 7のデフォルトのmailx(heirloom-mailxとして表示)を使用して、必要なヘッダーと、multipart/mixedおよびmultipart/alternativeセットアップ用の静的境界を持つテキストファイルを使用するようにこれを単純化しました。
同じ設定で必要な場合は、multipart/relatedを理解できると確信しています。
test.txt:
--000000000000f3b2150570186a0e
Content-Type: multipart/alternative; boundary="000000000000f3b2130570186a0c"
--000000000000f3b2130570186a0c
Content-Type: text/plain; charset="UTF-8"
This is my plain text stuff here, in case the email client does not support HTML or is blocking it purposely
My Link Here <http://www.example.com>
--000000000000f3b2130570186a0c
Content-Type: text/html; charset="UTF-8"
<div dir="ltr">
<div>This is my HTML version of the email</div>
<div><br></div>
<div><a href="http://www.example.com">My Link Here</a><br></div>
</div>
--000000000000f3b2130570186a0c--
--000000000000f3b2150570186a0e
Content-Type: text/csv; charset="US-ASCII"; name="test.csv"
Content-Disposition: attachment; filename="test.csv"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_jj5qmzqz0
境界はマルチパートセグメントを定義します。
末尾にダッシュのない境界IDは、セグメントの開始点です。
末尾に2つのダッシュがあるものが終点です。
この例では、multipart/alternativeの場合、multipart/mixedメインセクション内にサブパートがあります。
Multipart/alternativeメソッドは、基本的に「優先部分が成功しない場合、これにフォールバックします」と言います-この例では、HTMLは通常、電子メールクライアントによって優先として扱われます。電子メールクライアントがHTMLを表示しない場合、プレーンテキストにフォールバックします。
このメッセージ全体をカプセル化するmultipart/mixedメソッドは、基本的にここに異なるコンテンツがあり、両方を表示すると言っています。
この例では、電子メールにCSVファイルの添付ファイルを配置しました。次のコマンドでbase64を使用して添付ファイルがプラグインされるのがわかります。
例として添付ファイルを投げました。添付ファイルに適切にコンテンツタイプを設定し、インラインかどうかを指定する必要があります。
一部のプロバイダーではX-Attachment-Idが必要です。設定したIDをランダム化します。
これをメールで送信するコマンドは次のとおりです。
echo -e "`cat test.txt; openssl base64 -e < test.csv`\n--000000000000f3b2150570186a0e--\n" | mailx -s "Test 2 $( echo -e "\nContent-Type: multipart/mixed; boundary=\"000000000000f3b2150570186a0e\"" )" -r [email protected] [email protected]
Mailx Subject行にあるように、マルチパート境界を静的に挿入します。これは、電子メールクライアントに表示される最初のヘッダーです。
その後、test.txtの内容がダンプされます。
添付ファイルに関しては、openssl(システムではかなり標準的)を使用して、添付ファイルをbase64に変換します。
さらに、メッセージの終わりを示すために、このエコーの終わりに境界クローズステートメントを追加しました。
これは、先祖伝来の問題を回避し、実質的にスクリプトレスです。
エコーは、代わりにフィードにすることも、他の任意の数のメソッドにすることもできます。
Heres mine(「メール」が正しく設定されている場合):
scanuser @ owncloud:〜$ vi sendMailAboutNewDocuments.sh
mail -s "You have new mail" -a "Content-type: text/html" -a "From: [email protected]" $1 << EOF
<html>
<body>
Neues Dokument: $2<br>
<a href="https://xxx/index.php/apps/files/?dir=/Post">Hier anschauen</a>
</body>
</html>
EOF
実行可能にする:
chmod +x sendMailAboutNewDocuments.sh
次に呼び出します:
./sendMailAboutNewDocuments.sh [email protected] test.doc
SendEmailでオプション-oを使用して、htmlメールを送信できます。
-o message-content-type = htmlは、電子メールのコンテンツタイプを指定します。
-o message-fileを使用して、HTMLファイルを電子メールのコンテンツに追加します。
このオプションをシェルスクリプトで試しましたが、動作します。
完全なコマンドは次のとおりです。
/usr/local/bin/sendEmail -f [email protected] -t "[email protected]" -s \
smtp.test.com -u "Title" -xu [email protected] -xp password \
-o message-charset=UTF-8 \
-o message-content-type=html \
-o message-file=test.html