problèmes de script smtplib et gmail - 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('myname@gmail.com','mypass')
server.sendmail('myname@gmail.com','somename@somewhere.com',msg)
server.close()

j'essaie juste d'envoyer un e-mail depuis mon compte gmail. Le script utilise des starttl à cause des exigences de gmail. J'ai essayé sur deux hébergeurs, 1and1 et webfaction. 1and1 me donne une erreur 'connection refused' et webfaction ne signale aucune erreur, mais n'envoie tout simplement pas l'e-mail. Je ne vois rien de mal avec le script, donc je pense que ça pourrait être lié aux serveurs web. Toutes les pensées et les commentaires seront beaucoup apprécier.

EDIT: j'ai activé le mode de débogage. De la sortie, il semble qu'il a envoyé le message avec succès...Je ne le reçois jamais.

send: 'ehlo web65.webfaction.comrn'
reply: '250-mx.google.com at your service, [174.133.21.84]rn'
reply: '250-SIZE 35651584rn'
reply: '250-8BITMIMErn'
reply: '250-STARTTLSrn'
reply: '250-ENHANCEDSTATUSCODESrn'
reply: '250 PIPELININGrn'
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84]
SIZE 35651584
8BITMIME
STARTTLS
ENHANCEDSTATUSCODES
PIPELINING
send: 'STARTTLSrn'
reply: '220 2.0.0 Ready to start TLSrn'
reply: retcode (220); Msg: 2.0.0 Ready to start TLS
send: 'ehlo web65.webfaction.comrn'
reply: '250-mx.google.com at your service, [174.133.21.84]rn'
reply: '250-SIZE 35651584rn'
reply: '250-8BITMIMErn'
reply: '250-AUTH LOGIN PLAINrn'
reply: '250-ENHANCEDSTATUSCODESrn'
reply: '250 PIPELININGrn'
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 *****rn'
reply: '235 2.7.0 Acceptedrn'
reply: retcode (235); Msg: 2.7.0 Accepted
send: 'mail FROM:<myname@gmail.com> size=12rn'
reply: '250 2.1.0 OK 4sm652580yxq.48rn'
reply: retcode (250); Msg: 2.1.0 OK 4sm652580yxq.48
send: 'rcpt TO:<myname@gmail.com>rn'
reply: '250 2.1.5 OK 4sm652580yxq.48rn'
reply: retcode (250); Msg: 2.1.5 OK 4sm652580yxq.48
send: 'datarn'
reply: '354  Go ahead 4sm652580yxq.48rn'
reply: retcode (354); Msg: Go ahead 4sm652580yxq.48
data: (354, 'Go ahead 4sm652580yxq.48')
send: 'Hello world.rn.rn'
reply: '250 2.0.0 OK 1240421143 4sm652580yxq.48rn'
reply: retcode (250); Msg: 2.0.0 OK 1240421143 4sm652580yxq.48
data: (250, '2.0.0 OK 1240421143 4sm652580yxq.48')
24
demandé sur spencewah 2009-04-22 20:52:17

8 réponses

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é. Ceci est pour éviter que spammer n'utilise leur serveur SMTP comme un relais ouvert.

7
répondu Martin Cote 2009-04-22 16:57:05

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
répondu Toni Ruža 2009-04-23 06:33:55

Je ne sais pas si L'OP se soucie encore de cette réponse, mais ayant trouvé moi-même ici dans un effort pour résoudre un problème similaire, espérons que quelqu'un d'autre pourrait trouver cela utile. Comme il s'avère, Google a changé la façon dont ils permettent à leur serveur SMTP d'être utilisé. Vous voudrez vérifier quelques choses:

  1. que vous utilisez la même adresse que celle que vous avez utilisée pour authentifier. Si je ne me trompe pas il a utilisé pour être le cas où vous pourriez mettre à peu près tout ce que vous vouliez dans le champ from, mais pour des raisons de sécurité de nombreux sites hôtes SMTP (y compris google) maintenant restreindre cela à l'adresse qui a authentifié avec eux.

  2. permettent à votre compte d'être accédé par des" applications moins sûres " (Lire: applications à partir desquelles nous ne générons pas de revenus). Pour faire cette connexion dans votre compte et naviguer ici: https://www.google.com/settings/security/lesssecureapps

  3. utiliser le port 587 avec tls. Je ne sais pas vraiment pourquoi mais je n'ai jamais pu obtenir port 465 pour jouer gentil.

Espérons que cela aide quelqu'un d'autre.

7
répondu krayzk 2015-03-11 15:28:33

un peu d'auto-promotion ici, mais je me sens sur un terrain valide.

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

import yagmail
yag = yagmail.SMTP('myname@gmail.com')
yag.send('somename@somewhere.com', subject = None, contents = 'Hello')

ou une doublure:

yagmail.SMTP('myname@gmail.com').send('somename@somewhere.com', None, 'Hello world.')

ce qui est bien, c'est que je propose d'utiliser keyring pour stocker votre mot de passe, pour que vous n'ayez jamais de risque que les gens voient votre mot de passe dans votre script.

vous pouvez configurer ceci en exécutant une seule fois dans votre interpréteur:

import yagmail
yagmail.register("my@gmail.com", "mypassword")

et sortie. Alors vous pouvez juste utiliser:

import yagmail
yagmail.SMTP("my@gmail.com") # without password

si vous ajoutez .yagmail avec "my@gmail.com" dans votre home, puis il vous suffit de faire: yagmail.SMTP() , mais c'est plutôt inutile.

avertissement: si vous pensez sérieusement à envoyer beaucoup de messages, mieux vaut configurer OAuth2, yagmail peut vous aider.

yagmail.SMTP("my@gmail.com", oauth2_file="/path/to/save/creds.json")

la première fois, il vous guidera à travers le processus d'obtenir OAuth2 informations d'identification et les stocker dans le fichier, de sorte que la prochaine fois, vous n'avez pas besoin de faire quelque chose avec elle. Pensez-vous que quelqu'un ait trouvé vos références? Ils auront des permissions limitées, mais vous feriez mieux d'invalider leurs accréditations par gmail.

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

6
répondu PascalVKooten 2018-05-01 22:32:45

vous aurez besoin de vérifier votre dossier" envoyé " dans GMail, car c'est là qu'un message envoyé de votre compte vers votre compte apparaîtra très probablement.

2
répondu fucx 2009-08-17 12:12:20

je suis allé au lien mentionné ci-dessus et avait 3 adresses différentes à envoyer à, mais j'ai reçu trois e-mails à la même adresse et cela étant l'adresse #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), 'myusername@gmail.com', ['address1@gmail.com', 'address2@gmail.com', 'address3@gmail.com'], 'unable to find Error!', ('myusername@gmail.com', 'mypassword'))
gm.setLevel(logging.ERROR)

logger.addHandler(gm)

try:
    1/0
except:
    logger.exception('It NO work for me!!-')
1
répondu Jim 2014-06-23 06:11:24

Ça fonctionne

'''
Created on 2017/11/27

@author: devuser
'''

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

FROM_ADDRESS = 'sender@gmail.com'
MY_PASSWORD = 'password'
TO_ADDRESS = 'receiver@test.co.jp'
BCC = 'receiver2@test.net'
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 __name__ == '__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
répondu Ryosuke Hujisawa 2018-08-15 17:49:30