Linuxの「メール」コマンドを使用してHTMLメールを送信するにはどうすればよいですか?


66

mail -s "subject" xxxxx@gmail.com <test.html 動作しますが、プレーンテキストメールのみです。

Linuxコマンドを使用してHTMLメールを送信する正しい方法は何mailですか?

回答:


61

mailaroundには多くの異なるバージョンがあります。mail -s subject to1@address1 to2@address2 <body(送信に関しては、これはすべてPOSIXの保証-sであり、は存在しませんでした)を超えると、コマンドラインオプションが異なる傾向があります。追加のヘッダーを追加するのは必ずしも簡単ではありません。

  • UbuntuDebianなどからのいくつかのmailx実装では、そのためのオプションがあるため、簡単です。mailutilsbsd-mailx

    mailx -a 'Content-Type: text/html' -s "Subject" to@address <test.html
    
  • では家宝 mailx、便利な方法はありません。任意のヘッダーを挿入する1つの可能性はeditheaders=1、外部エディター(スクリプトの場合もある)を設定して使用することです。

    ## Prepare a temporary script that will serve as an editor.
    ## This script will be passed to ed.
    temp_script=$(mktemp)
    cat <<'EOF' >>"$temp_script"
    1a
    Content-Type: text/html
    .
    $r test.html
    w
    q
    EOF
    ## Call mailx, and tell it to invoke the editor script
    EDITOR="ed -s $temp_script" heirloom-mailx -S editheaders=1 -s "Subject" to@address <<EOF
    ~e
    .
    EOF
    rm -f "$temp_script"
    
  • 一般的なPOSIXではmailx、ヘッダーを取得する方法がわかりません。

mailまたはを使用する場合はmailx、次のことに注意してください。

  • これは、特定のLinuxディストリビューション内でも移植できません。たとえば、UbuntuとDebianの両方にとのいくつかの選択肢がmailありmailxます。
  • メッセージを作成するとき、コマンドで始まる行mailmailx扱い~ます。テキストをパイプする場合はmail、このテキストがで始まる行を含まないように調整する必要があります~

とにかくソフトウェアをインストールする場合は、mail/ Mail/ よりも予測可能なものをインストールすることもできmailxます。たとえば、muttです。Muttを使用すると、入力でほとんどのヘッダーに-Hオプションを指定できますContent-Type、muttオプションを使用して設定する必要があるには指定できません

mutt -e 'set content_type=text/html' -s 'hello' 'to@address' <test.html

または、sendmail直接呼び出すことができます。そこにはいくつかのバージョンがありますsendmailが、それらはすべてsendmail -t、最も簡単な方法でメールを送信することをサポートし、メールから受信者のリストを読み取ります。(すべてをサポートしているわけではないと思いますBcc:。)ほとんどのシステムでsendmailは、通常$PATHではなく、/usr/sbinまたはにあり/usr/libます。

cat <<'EOF' - test.html | /usr/sbin/sendmail -t
To: to@address
Subject: hello
Content-Type: text/html

EOF

上記のmuttの例を使用してみました。ファイル名の実際の値を電子メールアドレスなどに置き換えますが、「受信者が指定されていません」というメッセージが表示されます。(osxマウンテンライオン、ホームブリュー経由でインストールされるmutt 1.5.21)
チャックヴァンデルリンデン

2行目は「To:myaddress@mycompany.com」でした(書式設定ができず申し訳ありませんが、実際のテキストは引用符ではありません)。EOFを挿入する前に空白行を含めました。muttに必要な設定はありますか?あなたが与えた例を試す前に(適切な値に置き換えて)私がやったのは 'brew install mutt'
チャック・ファン・デル・リンデン

@ChuckvanderLinden新しい質問をします。実行した正確なコマンドと完全なエラーメッセージをコピーして貼り付けます。インタラクティブインターフェイスを使用してmuttからメールを送信できるかどうかを確認します。
ジル 'SO-悪であるのをやめる'

私は「インタラクティブ」インターフェースを介して何かを送信することができました。最初はメールディレクトリが見つからないと文句を言い、それを作成するように申し出ました。私はvimがどれほど嫌いなのかを思い出しました;-) 書式設定などが簡単なため、新しい質問を開始します。正確なエラーメッセージは、「受信者が指定されていません」とだけ言ったものです。
チャック・ファン・デル・リンデン


13
#!/bin/sh

(
echo "To: me@example.com"
echo "Subject: hello"
echo "Content-Type: text/html"
echo
echo "<html><b><font size='7'>H</font>ello</b></html>"
echo
) | /usr/sbin/sendmail -t

5
それはacuallyを使用しませんmail

3
@ user16144いいえ、しかし、OPが検討したいと思うかもしれない素晴らしい選択肢です。
trusktr 14

はい、メールは使用しませんが、私が試したすべての場所で機能します。
user1683793

Macでも同様に動作します。
Asim Jalis

7

家宝のmailxでは、便利な方法は

mailx -s "$(echo -e "Newsletter issue 3\nContent-Type: text/html")" user@server.com < /tmp/htmlmail.txt

ありがとう、Dude
はFedora 17でテストを行い、働いた


1
生意気。私はそれが好きです。:-]
アラステアアーバイン

1
この解決策は「Content-Type:text / html」と「Content-Type:text / plain」の両方を含む電子メールにつながる可能性があり、この方法を使用して文字セットを指定すると不整合が生じる可能性があることに注意してください。
スキッピールグラングロウ

5

Content-Typeこれを実現するには、メールにヘッダーを追加する必要があります。

echo "<html><b>Hello</b></html>" | mail -a "Content-type: text/html;" -s "Testing" me@example.com

動作します


2
メール:違法オプション
-a

ありますmailxか?それにはオプションがあるかもしれません。それが機能しない場合。それが上手く行かない場合は、muttを使用することを検討できますが、コマンドラインがそれを実行するために何を切り替えるのかはわからないのですが。
ヌファルイブラヒム

1
メールがマスタードをカットしていない場合、python ... docs.python.org/library/email-examples.htmlを使用してください。
卑劣な

Pythonでは、スクリプトを作成(および保守)する必要があります。コマンドライン1ライナーにはさまざまな利点があります。
ヌファルイブラヒム

mailxがありますが、「オプション-a」が機能しない、まだshow:mail:不正なオプション-a
pyth0ner

3

heirloom-mailxを使用すると、sendmailプログラムをフックスクリプトに変更し、そこでヘッダーを置き換えてから、sendmailを使用できます。

私が使用するスクリプト(~/bin/sendmail-mailx-hook):

#!/bin/bash

sed '1,/^$/{
s,^\(Content-Type: \).*$,\1text/html; charset=utf-8,g
s,^\(Content-Transfer-Encoding: \).*$,\18bit,g
}' | sendmail $@

このスクリプトは、メールヘッダーの値を次のように変更します。

  • Content-Type:text/html; charset=utf-8
  • Content-Transfer-Encoding:to 8bit(これが本当に必要かどうかわからない)。

HTMLメールを送信するには:

mailx -Ssendmail='~/bin/sendmail-mailx-hook' -s "subject" xxxxx@gmail.com < test.html

この方法は、一時ファイルを作成せず、ストリームをオンザフライで修正するため、@ Gillesが提案するよりも効果的です。


1

私は以下のスクリプトを使用して発生しました

#!/bin/ksh

(
echo "To: yourmail@domain.com"
echo "Subject: Job Status"
echo "Content-Type: text/html"
echo
echo "<html>
<head>
<title>Status of the jobs during the day</title>
<style>
table, th, td {
    border: 1px solid blue;
    border-collapse: collapse;
}
th, td {
    padding: 5px;
}
</style>
</head>
<body>
<table style='width:100%'>
<tr bgcolor='#808080'>
    <th>Job Name</th>
    <th>System name</th>
    <th>Status</th>
  </tr>
  <tr>
    <td>Job-1</td>
    <td>Sys</td>
    <td>Sucess</td>
  </tr>
  <tr>
    <td>Job-2</td>
    <td>sys</td>
    <td>Failure</td>
  </tr>
  <tr>
    <td>Job-3</td>
    <td>sys</td>
    <td>Sucess</td>
  </tr>
 </table>
</body></html>"
echo
) | /usr/sbin/sendmail -t

0

私にとっては、SMTPサーバーなどの変数を指定する必要があったため、メールコマンドは以下のように機能しました。私は多くの投稿を検索しましたが、本文をtext / htmlに変換するプロパティの下に見つかりました。これで、受信したメールはHTML形式になりました。

コンテンツの処理:インライン

Unixバージョン:Red Hat Enterprise Linux Serverリリース6.6(サンティアゴ)

最初。必要な情報をスクリプトに作成します(testSql.sh)

echo "<html><body><pre>"
mysql -u USERNAME -pPASSWORD -P PORTNUMBER -h HOSTNAME DBNAME --table -e "select columns from tablename where member in ('value1','value2')"
echo "</pre></body></html>"

第二に。そのスクリプトをメールコマンドにパイプする

./testSql.sh  | mail -v -S smtp=smtp://IP:PORTNUMBER -s "$(echo -e "This is the subject\nContent-Type: text/ht ml\nMIME-Version: 1.0\nContent-Disposition: inline")" userid@email.com

これを行うことにより、私は以下のような情報をメールで受け取ります:

Content-Disposition:インラインMessage-ID:User-Agent:Heirloom mailx 12.4 7/29/08 MIME-Version:1.0 Content-Type:text / plain; charset = us-ascii Content-Transfer-Encoding:7ビット

値1値2

testSql.shで行われるHTMLタグ付けによるValue1およびValue2


-5
cat htmlfile.html | mail -s "subject" xx@example.com

5
いや。これにより、本文にHTMLを含むテキストメールが送信されます。
ヌファルイブラヒム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.