web-dev-qa-db-fra.com

smtplib et gmail - problèmes de script python

Voici mon script:

#!/usr/bin/python

import smtplib
msg = 'Hello world.'

server = smtplib.SMTP('smtp.gmail.com',587) #port 465 or 587
server.ehlo()
server.starttls()
server.ehlo()
server.login('[email protected]','mypass')
server.sendmail('[email protected]','[email protected]',msg)
server.close()

J'essaie juste d'envoyer un email à partir de mon compte gmail. Le script utilise des starttls en raison des exigences de gmail. J'ai essayé cela sur deux hôtes Web, 1and1 et Webfaction. 1and1 me donne une erreur de "connexion refusée" et webfaction ne signale aucune erreur mais n'envoie simplement pas le courrier électronique. Je ne vois rien d'anormal dans le script, je pense donc qu'il pourrait être lié aux hôtes Web. Toutes les pensées et les commentaires seraient très appréciés.

EDIT: J'ai activé le mode débogage. D'après la sortie, il semble que le message ait été envoyé avec succès ... Je ne le reçois jamais.

send: 'ehlo web65.webfaction.com\r\n'
reply: '250-mx.google.com at your service, [174.133.21.84]\r\n'
reply: '250-SIZE 35651584\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-STARTTLS\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250 PIPELINING\r\n'
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84]
SIZE 35651584
8BITMIME
STARTTLS
ENHANCEDSTATUSCODES
PIPELINING
send: 'STARTTLS\r\n'
reply: '220 2.0.0 Ready to start TLS\r\n'
reply: retcode (220); Msg: 2.0.0 Ready to start TLS
send: 'ehlo web65.webfaction.com\r\n'
reply: '250-mx.google.com at your service, [174.133.21.84]\r\n'
reply: '250-SIZE 35651584\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-AUTH LOGIN PLAIN\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250 PIPELINING\r\n'
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84]
SIZE 35651584
8BITMIME
AUTH LOGIN PLAIN
ENHANCEDSTATUSCODES
PIPELINING
send: 'AUTH PLAIN *****\r\n'
reply: '235 2.7.0 Accepted\r\n'
reply: retcode (235); Msg: 2.7.0 Accepted
send: 'mail FROM:<[email protected]> size=12\r\n'
reply: '250 2.1.0 OK 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.1.0 OK 4sm652580yxq.48
send: 'rcpt TO:<[email protected]>\r\n'
reply: '250 2.1.5 OK 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.1.5 OK 4sm652580yxq.48
send: 'data\r\n'
reply: '354  Go ahead 4sm652580yxq.48\r\n'
reply: retcode (354); Msg: Go ahead 4sm652580yxq.48
data: (354, 'Go ahead 4sm652580yxq.48')
send: 'Hello world.\r\n.\r\n'
reply: '250 2.0.0 OK 1240421143 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.0.0 OK 1240421143 4sm652580yxq.48
data: (250, '2.0.0 OK 1240421143 4sm652580yxq.48')
25
spencewah

Je pense que le serveur SMTP GMail effectue une recherche DNS inversée sur l'adresse IP à partir de laquelle vous vous connectez et refuse la connexion si aucun domaine ne peut être trouvé. Cela évite aux spammeurs d'utiliser leur serveur SMTP en tant que relais ouvert.

7
Martin Cote

Avez-vous essayé de construire un message valide?

from email.MIMEText import MIMEText

msg = MIMEText('body')
msg['Subject'] = 'subject'
msg['From'] = "..."
msg['Reply-to'] = "..."
msg['To'] = "..."
8
Toni Ruža

Je ne sais pas si OP se préoccupe toujours de cette réponse, mais après m'être retrouvé ici pour tenter de résoudre un problème similaire, j'espère que quelqu'un d'autre pourra trouver cela utile. En fin de compte, Google a modifié la manière dont il autorise l'utilisation de son serveur SMTP. Vous voudrez vérifier quelques points:

  1. Que vous utilisez la même adresse que vous avez utilisée pour vous authentifier en tant qu'adresse "De". Si je ne me trompe pas, jadis, vous pouviez mettre pratiquement tout ce que vous vouliez dans le champ from, mais pour des raisons de sécurité, de nombreux sites d’hôte SMTP (y compris Google) limitent maintenant cette possibilité à l’adresse qui s’est authentifiée avec eux.

  2. Autorisez l'accès à votre compte par des "applications moins sécurisées" (lire: applications pour lesquelles nous ne générons pas de revenus). Pour ce faire, connectez-vous à votre compte et naviguez ici: https://www.google.com/settings/security/lesssecureapps

  3. Utilisez le port 587 avec tls. Je ne sais pas trop pourquoi mais je n’aurais jamais pu avoir le port 465 pour jouer à Nice.

J'espère que cela aide quelqu'un d'autre.

7
krayzk

Certaines auto-promotion ici, mais je me sens sur un terrain valable.

Vous n'auriez littéralement besoin de ce code que pour faire exactement ce que vous avez écrit:

import yagmail
yag = yagmail.SMTP('[email protected]')
yag.send('[email protected]', subject = None, contents = 'Hello')

Ou un one liner:

yagmail.SMTP('[email protected]').send('[email protected]', None, 'Hello world.')

Ce qui est bien, c’est que je propose d’utiliser le trousseau de clés pour stocker votre mot de passe, afin que vous ne couriez jamais le risque que des personnes voient votre mot de passe dans votre script.

Vous pouvez le configurer en exécutant une fois dans votre interprète:

import yagmail
yagmail.register("[email protected]", "mypassword")

et sortir. Ensuite, vous pouvez simplement utiliser:

import yagmail
yagmail.SMTP("[email protected]") # without password

Si vous ajoutez .yagmail avec "[email protected]" dans votre répertoire personnel, vous pouvez simplement faire: yagmail.SMTP(), mais c'est plutôt inutile maintenant.

Avertissement: si vous envisagez sérieusement d’envoyer beaucoup de messages, configurez mieux OAuth2, yagmail peut vous aider.

yagmail.SMTP("[email protected]", oauth2_file="/path/to/save/creds.json")

La première fois, il vous guidera tout au long du processus d'obtention des informations d'identification OAuth2 et les stockera dans le fichier afin que vous n'ayez rien à faire avec la prochaine fois. Pensez-vous que quelqu'un a trouvé vos informations d'identification? Leurs autorisations sont limitées, mais vous devez invalider leurs informations d'identification via gmail. 

Pour le package/l'installation, veuillez consulter git ou readthedocs , disponible pour Python 2 et 3.

6
PascalVKooten
4
silent254

Vous devrez vérifier votre dossier "Envoyé" dans GMail, car c’est là qu’un message envoyé de votre compte à votre compte sera probablement affiché.

2
fucx

Je suis allé au lien mentionné ci-dessus et j'avais 3 adresses différentes à envoyer mais j'ai reçu trois courriels à la même adresse, l'adresse n ° 3. 

http://mynthon.net/howto/-/python/python%20-%20logging.SMTPHandler-how-to-use-gmail-smtp-server.txt

import logging
import logging.handlers

class TlsSMTPHandler(logging.handlers.SMTPHandler):
def emit(self, record):
    """
    Emit a record.

    Format the record and send it to the specified addressees.
    """
    try:
        import smtplib
        import string # for tls add this line
        try:
            from email.utils import formatdate
        except ImportError:
            formatdate = self.date_time
        port = self.mailport
        if not port:
            port = smtplib.SMTP_PORT
        smtp = smtplib.SMTP(self.mailhost, port)
        msg = self.format(record)
        msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\nDate: %s\r\n\r\n%s" % (
                        self.fromaddr,
                        string.join(self.toaddrs, ","),
                        self.getSubject(record),
                        formatdate(), msg)
        if self.username:
            smtp.ehlo() # for tls add this line
            smtp.starttls() # for tls add this line
            smtp.ehlo() # for tls add this line
            smtp.login(self.username, self.password)
        smtp.sendmail(self.fromaddr, self.toaddrs, msg)
        smtp.quit()
    except (KeyboardInterrupt, SystemExit):
        raise
    except:
        self.handleError(record)

logger = logging.getLogger()

gm = TlsSMTPHandler(("smtp.gmail.com", 587), '[email protected]', ['[email protected]', '[email protected]', '[email protected]'], 'unable to find Error!', ('[email protected]', 'mypassword'))
gm.setLevel(logging.ERROR)

logger.addHandler(gm)

try:
    1/0
except:
    logger.exception('It NO work for me!!-')
1
Jim

Ça marche

'''
Created on 2017/11/27

@author: devuser
'''

import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate

FROM_ADDRESS = '[email protected]'
MY_PASSWORD = 'password'
TO_ADDRESS = '[email protected]'
BCC = '[email protected]'
SUBJECT = 'GmailのSMTPサーバ経由'
BODY = 'pythonでメール送信'


def create_message(from_addr, to_addr, bcc_addrs, subject, body):
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Bcc'] = bcc_addrs
    msg['Date'] = formatdate()
    return msg


def send(from_addr, to_addrs, msg):
    smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
    smtpobj.ehlo()
    smtpobj.starttls()
    smtpobj.ehlo()
    smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
    smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
    smtpobj.close()


if __== '__main__':

    to_addr = TO_ADDRESS
    subject = SUBJECT
    body = BODY

    msg = create_message(FROM_ADDRESS, to_addr, BCC, subject, body)
    send(FROM_ADDRESS, to_addr, msg)

https://qiita.com/okhrn/items/630a87ce1a44778bbeb1

0
Ryosuke Hujisawa