46


20

シェルスクリプトを使用してHTMLメールを送信する

シェルスクリプトを使用してHTMLメールを送信するにはどうすればよいですか?

10 Answer


57


まず、メッセージを作成する必要があります。 最低限は、次の2つのヘッダーで構成されます。

MIME-Version: 1.0
Content-Type: text/html
  1. および適切なメッセージ本文:

Hello, world!

入手したら、適切な情報をhttp://unixhelp.ed.ac.uk/CGI/man-cgi?mail[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でスクリプトを記述できます。

更新

シェルスクリプトは基本的に、http://en.wikipedia.org/wiki/Shebang_%28Unix%29 [shebang]という行で始まるUnixの行末を持つテキストファイルであり、ファイルに渡す必要があるインタープリターをシェルに指示します。 、インタープリターが理解し、実行許可を持っている言語のいくつかのコマンドに従います(Unixではファイル属性です)。 たとえば、次を「hello-world」として保存するとします。

#!/bin/sh

echo Hello, world!

次に、実行許可を割り当てます。

chmod +x hello-world

そして最終的にそれを実行できます:

./hello-world

いずれにせよ、これは元の質問とは無関係です。 高度なタスクを実行する前に、基本的なシェルスクリプトに慣れる必要があります。 ここに、人気のシェルである* bash *に関するリンクがいくつかあります。


44


タグには「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 E-mail


Click Here

"
echo "------some.unique.value.ABC123/server.xyz.com--"
) | sendmail -t

sendmailのラッパーは、たとえばhttp://www.mutt.org/[mutt]のように、この作業を簡単にすることができます。

mutt -e 'set content_type="text/html"' [email protected] -s "subject" <  message.html


37


これまでのところ、cmd linuxで2つの簡単な方法を見つけました

  1. 古い学校のメールを使用する

mail -s" $(echo -e "これはSubject \ nContent-Type:text / html") "[email protected] <mytest.html

  1. muttを使用する

mutt -e" my_hdr Content-Type:text / html "[email protected] -s" subject "<mytest.html


2


別のオプションは、sendEmailスクリプトhttp://caspian.dotconf.net/menu/Software/SendEmail/です。また、メッセージタイプをhtmlに設定し、メッセージ本文としてファイルを含めることもできます。 詳細はリンクを見てください。


2


別のオプションは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
logfile ~/.msmtp.log

それからちょうど呼んでください:

(echo "Subject: "; echo; echo "") | msmtp

あなたのスクリプトで

更新:HTMLメールの場合は、ヘッダーも配置する必要があるため、次のようなファイルを作成できます。

From: [email protected]
To: [email protected]
Subject: Important message
Mime-Version: 1.0
Content-Type: text/html

Mail body will be here
The mail body should start after one blank line from the header.

そして次のように郵送します

cat email-template | msmtp [email protected]

同じことはコマンドラインでも実行できますが、ファイルを使用する方が簡単かもしれません。


0


cat > mail.txt <
Subject:
Content-Type: text/html


$(cat )
This report in SVN


EOL

その後:

sendmail -t < mail.txt


0


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

Mail body will be here
The mail body should start after one blank line from the header.

サンプルコードはこちら:http://sugunan.net/git/slides/shell/cpu.php


0


Heres mine(「メール」が正しく設定されている場合):

scanuser @ owncloud:〜$ vi sendMailAboutNewDocuments.sh

mail -s "You have new mail" -a "Content-type: text/html" -a "From: [email protected]" $1 << EOF


Neues Dokument: $2

Hier anschauen



EOF

実行可能にする:

chmod +x sendMailAboutNewDocuments.sh

それから電話してください。

./sendMailAboutNewDocuments.sh [email protected] test.doc


0


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

--000000000000f3b2130570186a0c
Content-Type: text/html; charset="UTF-8"


This is my HTML version of the email


My Link Here



--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に変換します。

さらに、メッセージの終わりを示すために、このエコーの終わりに境界クローズステートメントを追加しました。

これは、先祖伝来の問題を回避し、実質的にスクリプトレスです。

エコーは、代わりにフィードにすることも、他の任意の数のメソッドにすることもできます。


-1


mdmaによる正解に加えて、次のようにmailコマンドを使用することもできます。

mail [email protected] -s"Subject Here" -a"Content-Type: text/html; charset=\"us-ascii\""

探しているものが手に入ります。 置くことを忘れないでください

および ``電子メールで。 以下は、HTMLで日次レポートをメールで送信するために使用する簡単なスクリプトです。

#!/bin/sh
(cat /path/to/tomorrow.txt mysql -h mysqlserver -u user -pPassword Database -H -e "select statement;" echo "") | mail [email protected] -s"Tomorrow's orders as of now" -a"Content-Type: text/html; charset=\"us-ascii\""