へのmsg
引数sendmail
はメッセージ本文ではなく、メッセージ全体です。したがって、有効な RFC(2)822 メッセージでなければなりません。
ドキュメントの最後にある注に次のように記載されています。
一般に、メール パッケージの機能を使用してメール メッセージを作成し、それを文字列に変換して sendmail(); 経由で送信することをお勧めします。電子メールを参照してください: 例。
ただし、上記の例は、単純なメッセージを自分で生成する方法を示しています。
# Add the From: and To: headers at the start!
msg = ("From: %s\r\nTo: %s\r\n\r\n"
% (fromaddr, ", ".join(toaddrs)))
有効な電子メール メッセージを構成するものを知りたい場合は、RFC 2822 (およびRFC 822を参照してください。RFC 822は 2822 に置き換えられましたが、有用な異なる説明と例がいくつかあります)。しかし、短いバージョンは次のとおりです。これは一連のヘッダー行であり、それぞれが で終わり\r\n
、その後に空白行 (意味\r\n\r\n
) が続き、その後にメッセージ本文が続きます。
したがって、技術的に言えば、プレフィックスの\n
代わりに aがあるだけなので、コードは機能しないはずです。\r\n
さらに重要なことは、ヘッダーがまったくないメッセージを送信していることです。あなたがおそらくあなたが含めていると思うものでさえありませんFrom:
。のドキュメントにあるTo:
ように:sendmail
from_addr および to_addrs パラメータは、トランスポート エージェントが使用するメッセージ エンベロープを構築するために使用されます。SMTP がメッセージ ヘッダーを変更することはありません。
これは、さまざまなサーバーによって無効 (またはスパム) と見なされる場合とされない場合があります。
一方、最後に余分な改行があるのは、すべての行が , で終わる必要があり\r\n
、SMTP が行指向のプロトコルであるためです。メッセージが改行で終わらない場合、メッセージが完了したことを知らせる方法はありません。
詳細を理解したい場合は、SMTP プロトコルについて説明しているRFC2821を参照してください。特に、2.3.1 メール オブジェクト、2.3.7 行、および 4.1.1.4 データ (DATA) を見てください。しかし、短いバージョンでは、メッセージを送信するには DATA コマンドが必要であり、これは で終わる必要があり\r\n.\r\n
、「この終了シーケンスの最初の行は、データ (メッセージ テキスト) の最終行を終了する 」でもあります。これは、改行で終わらないメッセージを送信する方法がないことを意味します。
本当にやりたい場合は、本文を MIME メッセージにカプセル化することでこれを回避できます。もちろん、MIME メッセージ自体は改行で終了しますが、カプセル化された本文には影響しません。これを行う方法はいくつかありますが、送信するものは何でも受信者が処理できるようにする必要があります。これらの方法のいずれも、電子メール SMS ゲートウェイ (ましてや SMS 受信エンドポイント) では機能しないと思います。 )。