私は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.Message
3.3で導入され、3.5で正式にリリースされた精密検査と近代化の代わりに主にレガシークラスを使用するEmailMessage
)。
答え3
私はちょうどそれを見つけました。最初のケースに戻り、件名フィールドにヘッダーを挿入すると、mailxで作成されたヘッダー(通常のテキストヘッダー)を本文にプッシュします。つまり、本文が実際のヘッダーの終わりから始まり、プッシュされたヘッダーを受け入れると思います。これは、HTMLを使用して問題を解決できることを意味します。
注入ヘッダーの末尾に次のように入力します。
<html><!--
HTMLコメントが始まります!
本当の意図した体の始まりに
-->
コメントが閉じました!これにより、押し出したヘッダーが体から隠れます!