J'ai rapidement écrit ci-dessous le code pour envoyer les données envoyées au serveur distant REST pour le débogage, mais je reçois un e-mail vierge. maintenant sûr de ce qui ne va pas. dans le corps du terminal, le texte dict ou le texte converti json est imprimé mais ne reçoit rien dans le courrier électronique.

# For testing
def sendMail(usr, pwd, to, body):
    """ just for testing to send error via email
    """
    fromaddr = usr
    toaddr = to
    msg = MIMEMultipart()
    msg['From'] = fromaddr
    msg['To'] = toaddr
    msg['Subject'] = "Data add request"
    try:
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(usr, pwd)
        msg.attach(body)
        r = json.dumps(body)
        loaded_r = json.loads(r)
        print "json: ", str(loaded_r)
        server.sendmail("error-report@do_not_reply.com", to,  str(loaded_r))
    except Exception, err:
        print 'Error sending email: ', err
    finally:
        server.quit()

J'ai essayé d'envoyer server.sendmail("error-report@do_not_reply.com", to, body) mais cela envoie aussi des e-mails vierges sans objet. Qu'est-ce que je fais mal ?

0
Ciasto piekarz 9 mars 2019 à 16:00

2 réponses

Meilleure réponse

Le message que vous passez comme troisième argument à sendmail doit être un message RFC822 valide et correctement formaté. Un fichier JSON n'est, par définition, pas un message électronique valide.

def sendMail(usr, pwd, to, body):
    msg = MIMEText(body)
    msg['From'] = usr
    msg['To'] = to
    msg['Subject'] = "Data add request"
    try:
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(usr, pwd)
        server.send_message("error-report@do_not_reply.com", [to],  msg)
    except Exception, err:
        print 'Error sending email: ', err
    finally:
        server.quit()

Je suis passé à send_message ici, car il prend en charge le détail banal mineur de convertir à nouveau l'objet email.Message en objet chaîne avant d'appeler sendmail.

Il n'est pas clair si vous vous attendez à ce que le corps soit une partie de texte affichant le contenu de la chaîne body, ou une pièce jointe JSON contenant body en tant que JSON, ou peut-être les deux.

Si vous n'avez besoin que d'une partie du corps, il n'est évidemment pas nécessaire de créer le message en plusieurs parties. Si vous voulez plusieurs parties, chacune d'elles doit être un MIMEText distinct ou un autre type de conteneur MIME que vous pouvez msg.attach() à un niveau supérieur MIMEMultipart.

1
tripleee 10 mars 2019 à 10:17

Je pense que c'est le message: tu devrais mettre un message

text = loaded_r.as_string()

Et puis vous pouvez envoyer le courrier.

server.sendmail("error-report@do_not_reply.com", to,  text)
-1
Parzifal Kali 9 mars 2019 à 13:06