web-dev-qa-db-ja.com

Pythonのsmtplibを使用して送信された電子メールで改行を取得する方法は?

テキストファイルにメッセージを書き込み、電子メールとして送信するスクリプトを作成しました。電子メールが最終的にすべて1行に表示されることを除き、すべてがうまくいきます。

\nで改行を追加すると、テキストファイルでは機能しますが、電子メールでは機能しません。考えられる理由を知っていますか?


ここに私のコードがあります:

import smtplib, sys
import traceback
def send_error(sender, recipient, headers, body):

    SMTP_SERVER = 'smtp.gmail.com'
    SMTP_PORT = 587
    session = smtplib.SMTP('smtp.gmail.com', 587)
    session.ehlo()
    session.starttls()
    session.ehlo
    session.login(sender, 'my password')
    send_it = session.sendmail(sender, recipient, headers + "\r\n\r\n" +  body)
    session.quit()
    return send_it


SMTP_SERVER = 'smtp.gmail.com'
SMTP_PORT = 587
sender = '[email protected]'
recipient = '[email protected]'
subject = 'report'
body = "Dear Student, \n Please send your report\n Thank you for your attention"
open('student.txt', 'w').write(body) 

headers = ["From: " + sender,
               "Subject: " + subject,
               "To: " + recipient,
               "MIME-Version: 1.0",
               "Content-Type: text/html"]
headers = "\r\n".join(headers)
send_error(sender, recipient, headers, body)
22
f.ashouri

HTMLコンテンツ("Content-Type: text/html")を持つように宣言されたメッセージ本文があります。改行のHTMLコードは <br> です。コンテンツタイプをtext/plainに変更するか、プレーン\nではなくHTMLマークアップを使用する必要があります。後者はHTMLドキュメントのレンダリング時に無視されるためです。


補足として、 電子メールパッケージ もご覧ください。メールメッセージの定義を簡単にするクラスがいくつかあります( with with) )。

たとえば、試してみることができます(テストされていません):

import smtplib
from email.mime.text import MIMEText

# define content
recipients = ["[email protected]"]
sender = "[email protected]"
subject = "report reminder"
body = """
Dear Student,
Please send your report
Thank you for your attention
"""

# make up message
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = ", ".join(recipients)

# sending
session = smtplib.SMTP('smtp.gmail.com', 587)
session.starttls()
session.login(sender, 'my password')
send_it = session.sendmail(sender, recipients, msg.as_string())
session.quit()
18
moooeeeep

残念ながら、すべての種類のプログラムやアプリケーションがpythonと同じ標準化を使用しているわけではありません。

あなたの質問を見ると、あなたのヘッダーは"Content-Type: text/html"です。

つまり、改行にはHTMLスタイルのタグを使用する必要があり、これらは改行と呼ばれます。 <br>

テキストは次のとおりです。

"Dear Student, <br> Please send your report<br> Thank you for your attention"

文字型の改行を使用する場合は、ヘッダーを変更して次のように変更する必要があります:"Content-Type: text/plain"

それでも、改行文字をシングル\nから電子メールで使用されるダブル\r\nに変更する必要があります。

あなたのテキストは次のようになります:

"Dear Student, \r\n Please send your report\r\n Thank you for your attention"
26
Inbar Rose

私の場合 '\r\n'は機能しませんでしたが、'\r\r\n' した。だから私のコードは:

from email.mime.text import MIMEText
body = 'Dear Student,\r\r\nPlease send your report\r\r\nThank you for your attention'
msg.attach(MIMEText(body, 'plain'))

メッセージは複数行で記述され、Outlookで正しく表示されます。

1
Shepherd

Content-typeヘッダーをContent-Type: text/plain(最後に\r\nを使用)に設定すると、複数行のプレーンテキストメールを送信できました。

0
chandradog

Outlookは、余分なものと思われるプレーンテキストから改行を削除します。 https://support.Microsoft.com/en-us/kb/287816

以下の更新を試して、行を箇条書きのように見せることができます。それは私のために働いた。

body = "Dear Student, \n- Please send your report\n- Thank you for your attention"
0
edW