web-dev-qa-db-fra.com

Comment obtenir des sauts de ligne dans les e-mails envoyés à l'aide de smtplib de Python?

J'ai écrit un script qui écrit un message dans un fichier texte et l'envoie également par e-mail. Tout se passe bien, sauf que l'e-mail semble finalement être tout sur une seule ligne.

J'ajoute des sauts de ligne par \n et cela fonctionne pour le fichier texte mais pas pour l'e-mail. Savez-vous quelle pourrait être la raison possible?


Voici mon code:

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)
26
f.ashouri

Vous avez déclaré que votre corps de message contient du contenu HTML ("Content-Type: text/html"). Le code HTML pour le saut de ligne est <br> . Vous devez soit changer votre type de contenu en text/plain ou utilisez le balisage HTML pour les sauts de ligne au lieu du simple \n car ce dernier est ignoré lors du rendu d'un document HTML.


En guise de remarque, jetez également un œil au paquet e-mail . Il existe certaines classes qui peuvent simplifier la définition des messages électroniques pour vous ( avec des exemples ).

Par exemple, vous pouvez essayer (non testé):

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

Malheureusement pour nous tous, tous les types de programmes ou d'applications n'utilisent pas la même normalisation que python.

En regardant votre question, je remarque que votre en-tête est: "Content-Type: text/html"

Ce qui signifie que vous devez utiliser des balises de style HTML pour vos nouvelles lignes, celles-ci sont appelées sauts de ligne. <br>

Votre texte doit être:

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

Si vous préférez utiliser des sauts de ligne de type caractère, vous devez modifier l'en-tête pour lire: "Content-Type: text/plain"

Vous devrez toujours changer le caractère de nouvelle ligne d'un seul \n au double \r\n qui est utilisé dans les e-mails.

Votre texte serait:

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

Dans mon cas '\r\n' n'a pas fonctionné, mais '\r\r\n' fait. Mon code était donc:

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'))

Le message est écrit sur plusieurs lignes et s'affiche correctement dans Outlook.

1
Shepherd

Définition de l'en-tête de type de contenu sur Content-Type: text/plain (avec \r\n à la fin) m'a permis d'envoyer des e-mails en texte brut sur plusieurs lignes.

0
chandradog

Outlook supprimera les sauts de ligne du texte brut qu'il considère comme des extras. https://support.Microsoft.com/en-us/kb/287816

Vous pouvez essayer la mise à jour ci-dessous pour que les lignes ressemblent à des puces. Cela a fonctionné pour moi.

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