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)
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()
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"
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.
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.
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"