web-dev-qa-db-fra.com

Python: "sujet" non affiché lors de l'envoi d'e-mails à l'aide du module smtplib

J'ai réussi à envoyer des e-mails à l'aide du module smtplib. Mais lorsque l'emial est envoyé, il n'inclut pas le sujet dans l'e-mail envoyé.

import smtplib

SERVER = <localhost>

FROM = <from-address>
TO = [<to-addres>]

SUBJECT = "Hello!"

message = "Test"

TEXT = "This message was sent with Python's smtplib."
server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO, message)
server.quit()

Comment dois-je écrire "server.sendmail" pour inclure également le SUJET dans l'e-mail envoyé.

Si j'utilise server.sendmail (FROM, TO, message, SUBJECT), cela donne une erreur sur "smtplib.SMTPSenderRefused"

51
nsh

Attachez-le comme en-tête:

message = 'Subject: {}\n\n{}'.format(SUBJECT, TEXT)

et alors:

server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO, message)
server.quit()

Pensez également à utiliser le standard Python email - cela vous aidera beaucoup lors de la composition des e-mails.

120
Roman Bodnarchuk

essaye ça:

import smtplib
from email.mime.multipart import MIMEMultipart
msg = MIMEMultipart()
msg['From'] = 'sender_address'
msg['To'] = 'reciver_address'
msg['Subject'] = 'your_subject'
server = smtplib.SMTP('localhost')
server.sendmail('from_addr','to_addr',msg.as_string())
13
Hackaholic

Vous devriez probablement modifier votre code en quelque chose comme ceci:

from smtplib import SMTP as smtp
from email.mime.text import MIMEText as text

s = smtp(server)

s.login(<mail-user>, <mail-pass>)

m = text(message)

m['Subject'] = 'Hello!'
m['From'] = <from-address>
m['To'] = <to-address>

s.sendmail(<from-address>, <to-address>, m.as_string())

De toute évidence, le <> les variables doivent être des valeurs de chaîne réelles ou des variables valides, je les ai simplement remplies en tant que marques de réservation. Cela fonctionne pour moi lors de l'envoi de messages avec des sujets.

6
g.d.d.c

Je pense que vous devez l'inclure dans le message:

import smtplib

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test

This is an e-mail message to be sent in HTML format

<b>This is HTML message.</b>
<h1>This is headline.</h1>
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

code de: http://www.tutorialspoint.com/python/python_sending_email.htm

4
Martin

Cela fonctionnera avec Gmail et Python 3.6+ en utilisant le nouvel objet "EmailMessage":

import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg.set_content('This is my message')

msg['Subject'] = 'Subject'
msg['From'] = "[email protected]"
msg['To'] = "[email protected]"

# Send the message via our own SMTP server.
server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.login("[email protected]", "password")
server.send_message(msg)
server.quit()
2
emehex

Voir la note au bas de la documentation de smtplib:

In general, you will want to use the email package’s features to construct an email message, which you can then convert to a string and send via sendmail(); see email: Examples.

Voici le lien vers la section des exemples de la documentation de email, qui montre en effet la création d'un message avec une ligne d'objet. http://docs.python.org/library/email-examples.html#email-examples

Il semble que smtplib ne supporte pas directement l'ajout de sujet et s'attend à ce que le msg soit déjà formaté avec un sujet, etc. C'est là que le module email entre en jeu.

2
jeffcook2150
 import smtplib

 # creates SMTP session 

List item

 s = smtplib.SMTP('smtp.gmail.com', 587)

 # start TLS for security   
 s.starttls()

 # Authentication  
 s.login("login mail ID", "password")


 # message to be sent   
 SUBJECT = "Subject"   
 TEXT = "Message body"

 message = 'Subject: {}\n\n{}'.format(SUBJECT, TEXT)

 # sending the mail    
 s.sendmail("from", "to", message)

 # terminating the session    
 s.quit()
1
King_Avi