2017-05-06 1 views
0

Voici 2 blocs de code. Le premier enverra un message à Gmail avec le sujet et l'expéditeur corrects. Cependant, quand je mets le premier code dans une fonction, l'email perd l'expéditeur et l'information de sujet.Utilisation de la fonction pour envoyer des gmails via python

Pourquoi est-ce et comment le réparer?

Je voudrais pouvoir appeler cette fonction à partir d'autres scripts python pour m'aviser lorsque mon travail est terminé. La fonction fonctionne et s'exécute sans erreur, et le courrier électronique le fait à ma boîte de réception, mais je perds l'information d'expéditeur et, plus important encore, l'en-tête de sujet.

1er code qui fonctionne comme prévu:

import smtplib 

gmail_user = '[email protected]' 
gmail_password = 'password' 

sent_from = gmail_user 
to = ['[email protected]'] 
subject = "job complete" 
body = "python script " + str(name) + " has finished" 

email_text = """\ 
From: %s 
To: %s 
Subject: %s 

%s 
""" % (sent_from, ", ".join(to), subject, body) 

server = smtplib.SMTP_SSL('smtp.gmail.com', 465) 
server.ehlo() 
server.login(gmail_user, gmail_password) 
server.sendmail(sent_from, to, email_text) 
server.close() 

Code 2 qui perd d'info sujet et expéditeur:

def mailer(subject, body): 
    import smtplib 

    gmail_user = '[email protected]' 
    gmail_password = 'password' 

    sent_from = gmail_user 
    to = ['[email protected]'] 
    subject = subject 
    body = body 

    email_text = """\ 
    From: %s 
    To: %s 
    Subject: %s 

    %s 
    """ % (sent_from, ", ".join(to), subject, body) 

    server = smtplib.SMTP_SSL('smtp.gmail.com', 465) 
    server.ehlo() 
    server.login(gmail_user, gmail_password) 
    server.sendmail(sent_from, to, email_text) 
    server.close() 

subject = "job complete" 
body = "python script " + str(name) + " has finished" 

mailer(subject, body) 
+0

Dans votre 2ème code, pourquoi faites-vous: 'subject = subject' et' body = body'? Cela devrait être redondant –

Répondre

1

Il est très probablement une ligne question de fin. Chaque en-tête de messagerie doit se terminer par CRLF (\r\n). La chaîne de message d'origine peut contenir les terminaisons correctes (invisibles dans l'éditeur) qui ont ensuite été perdues lors du copier/coller dans la version de la fonction. Pour vous assurer que chaque ligne est terminée correctement, essayez d'exprimer chacune d'elles en tant que chaîne distincte et de les joindre à \r\n.

email_text = '\r\n'.join([ 
    'From: %s' % sent_from, 
    'To: %s' % ', '.join(to), 
    'Subject: %s' % subject', 
    '', # Blank line to signal end of headers 
    body 
])