LinuxのHeirloom mailxのHTMLメール

LinuxのHeirloom mailxのHTMLメール

私はLinuxサーバーのmailxからhtmlメールを送信しようとしました。

参考にするいくつかの点:

  • sendmailを使用できないようにsmtpサーバーを指定する必要があります(変更できるものではありません)。
  • muttなどのサードパーティ製品をインストールできません。メールまたはmailxを使用する必要があります。
  • 私のバージョンのmail / xは家に見えるので、--appendまたは-a(ヘッダー追加オプション)はありません。
  • これが役に立つかどうかはわかりませんが、私のLinuxディストリビューションは7.3(Maipo)です。

私のイベントに関して、stackoverflowのほとんどの投稿で見たものは次のとおりです。

mailx -v -S smtp=SERVER -s "$(echo -e "This is the subject\nContent-Type: text/html")" -r FROM TO < htmlmail.txt

私の場合は、プレーンテキストの電子メールのみを返します。

だから今まで私が試したことは次のとおりです。

1を試してください:

Content-Disposition:inlineを追加する記事を見ました。

mailx -v -S smtp=SERVER -s "$(echo -e "This is the subject v1\nContent-Type: text/html\nMIME-Version: 1.0\nContent-Disposition: inline")" -r FROM TO < htmlmail.txt

これによりhtmlメールが送信されますが、本文にヘッダーが含まれているため、出力は次のようになります。

コンテンツ処理:インラインメッセージID:ユーザーエージェント:Heirloom mailx 12.5 7/5/10 MIMEバージョン:1.0コンテンツタイプ:Text / Plain; Charset = us-asciiコンテンツ転送エンコーディング:7ビットこんにちは世界

2回試してください:

だから、タイトルが本文に印刷されたくありません。だからContent-Disposition:inlineを削除してみました。

mailx -v -S smtp=SERVER -s "$(echo -e "This is the subject v2\nContent-Type: text/html\nMIME-Version: 1.0")" -r FROM TO < htmlmail.txt

これにより、次の簡単なテストメールが送信されます。

<html> <b>Hello World</b> </html>

3回試してみてください:

コンテンツタイプと無言劇バージョンを変えてみてください。

mailx -v -S SERVER -s "$(echo -e "This is the subject v3\nMIME-Version: 1.0\nContent-Type: text/html")" -r FROM TO < htmlmail.txt

結局、このコードから電子メールを受信できませんでした。

4回試してみてください:

問題を見つけるのに役立つように、オンラインで別のタイトルを試してみました。そのため、Eメールの優先順位を設定するためのヘッダーオプションを追加しました。

mailx -v -S smtp=SERVER -s "$(echo -e "This is a subject v4\nContent-Type: text/html\nX-Priority: 1 (Highest)")" -r FROM TO < htmlmail.txt

結局、優先順位の高いメールが送信されましたが、すべてプレーンテキストでした。

5を試してください:

以前の試みでMIMEヘッダーを追加しました。

mailx -v -S smtp=SERVER -s "$(echo -e "This is a subject v5\nMIME-Version: 1.0\nContent-Type: text/html\nX-Priority: 1 (Highest)")" -r FROM TO < htmlmail.txt

これにより、本文にヘッダーを含む電子メールが送信され、優先順位が高く設定されなくなります。

X優先順位:1(ほとんど)ニュースID:ユーザーエージェント:Heirloom Mailx 12.5 7/5/10 MIMEバージョン:1.0コンテンツタイプ:テキスト/純粋なテキスト、文字セット= us-asciiコンテンツ転送コード:7桁こんにちは世界

結局、私は上記の試みをさまざまに適用してみましたが、新しい結果は出ませんでした。

したがって、私たちはどんな提案やアイデアでも喜んで受け入れます!上記の制限を念頭に置いてください。オプションが制限されていることを知っていますが、これは私が制御できないことです。

時間をいただきありがとうございます!

答え1

まず、いくつかのコンテキスト:私は次のスレッドのようにheirloom-mailxバージョンを使用しています。 https://serverfault.com/questions/136106/what-package-to-install-for-sending-emails-from-localhost-ubuntu

私はUbuntu 16.04 Xenialを使用しています。 Ubuntu Server 16.04でも試しました。

電子メールを送信するには、次の機能を使用してmailx(bashのheirloom mailx)を介してメールを送信します。

sendmail() {
#Sending Report Email
heirloom-mailx -a $2 -v -s ""$(echo -e "subject 3\nContent-Type: text/html")"" \
-S smtp-use-starttls \
-S ssl-verify=ignore \
-S smtp-auth=login \
-S smtp=smtp://mail.mymailserver:port \
-S from="[email protected]" \
-S [email protected] \
-S smtp-auth-password='password' \
-S ssl-verify=ignore \
$1 < body.html
}

ここで、$2 は添付ファイル、$1 は宛先です。注:1.添付ファイルも本文内で印刷されますが、添付ファイルなしでHTMLファイルのみを転送したい場合は、この方法が適している可能性があります。 2. "-v"オプションを使用すると詳細情報が印刷されるため、無視できる.mime.typesの問題が発生する可能性があります。 mailxに詳細が表示されたくない場合は、このオプションを削除してください。 3. "-a"オプションを使用している場合は、本文に次の内容が表示されます。これはMIME形式のマルチパートメッセージです。 --=-=fFPa7dLqoSF1TGj-YDc2k8bdvmjpix_4sKFT=-=コンテンツタイプ:テキスト/プレーンテキスト、文字セット= US-ASCIIコンテンツ処理:インライン

この場合は、プレーンテキストファイルを添付します。コマンドから「-a $2」を削除すると、htmlメッセージを印刷できます。したがって、最終結果は次のようになります。

sendmail() {
    #Sending Report Email
    heirloom-mailx -s ""$(echo -e "subject 3\nContent-Type: text/html")"" \
    -S smtp-use-starttls \
    -S ssl-verify=ignore \
    -S smtp-auth=login \
    -S smtp=smtp://mail.mymailserver:port \
    -S from="[email protected]" \
    -S [email protected] \
    -S smtp-auth-password='password' \
    -S ssl-verify=ignore \
    $1 < body.html
    }

それを試して教えてください。端末でテストしましたが、うまくいきます。

答え2

新しいソフトウェア(適切なMTAを含む)をインストールできないサーバーに閉じ込められた場合、おそらく最も簡単な解決策はSMTPライブラリを含む言語で簡単なスクリプトを書くことです。私の選択はPythonです。以下は、サンプルコードを簡単に適用したものです。文書。

#!/usr/bin/env python3

import smtplib
from argparse import ArgumentParser
from email.message import EmailMessage


def main():
    parser = ArgumentParser(description="""\
Quick and dirty mailx replacement for sending a HTML message via a
specific SMTP server. Based on examples from
https://docs.python.org/3/library/email.examples.html#email-examples
""")
    parser.add_argument('-H', '--html-file', required=True,
                        help="The HTML body to send (required)")
    parser.add_argument('-S', '--smtp-server', required=True,
                        help='The SMTP server to use (required)')
    parser.add_argument('-s', '--subject', required=True,
                        help='Subject (required)')
    parser.add_argument('-r', '--return-path', required=True,
                        help='Return-Path / envelope sender (required)')
    parser.add_argument('recipients', nargs='+')
    args = parser.parse_args()

    msg = EmailMessage()
    msg['Subject'] = args.subject
    msg['To'] = ', '.join(args.recipients)
    msg['From'] = args.return_path
    # The examples suggest you should mess with the preamble, but you should not

    with open(args.html_file, 'r') as html:
        msg.set_content(html.read(), subtype='html')

    with smtplib.SMTP(args.smtp_server) as s:
        s.send_message(msg)


if __name__ == '__main__':
    main()

使用法:

python3 path/to/script.py -S SERVER -s "This is the subject" \
    -r FROM -H htmlmail.html TO

これはPythonバージョン3用です。以前のプラットフォームを使用している場合はPython 2しかありませんが、それに適応する方法はかなり明らかです(email.message.Message3.3で導入され、3.5で正式にリリースされた精密検査と近代化の代わりに主にレガシークラスを使用するEmailMessage)。

答え3

私はちょうどそれを見つけました。最初のケースに戻り、件名フィールドにヘッダーを挿入すると、mailxで作成されたヘッダー(通常のテキストヘッダー)を本文にプッシュします。つまり、本文が実際のヘッダーの終わりから始まり、プッシュされたヘッダーを受け入れると思います。これは、HTMLを使用して問題を解決できることを意味します。

注入ヘッダーの末尾に次のように入力します。

<html><!--

HTMLコメントが始まります!

本当の意図した体の始まりに

-->

コメントが閉じました!これにより、押し出したヘッダーが体から隠れます!

関連情報