Question

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()

Je suis juste essayer d'envoyer un e-mail de mon compte gmail. Le script utilise starttls en raison de l'exigence de gmail. J'ai essayé cela sur deux hébergeurs, 1and1 et webfaction. 1and1 me donne une « connexion refusée » les rapports d'erreur et webfaction aucune erreur, mais ne vient pas envoyer l'e-mail. Je ne vois rien de mal avec le script, donc je pense qu'il pourrait être lié aux hébergeurs. Toutes les pensées et les commentaires seraient appréciés.

EDIT: Je me suis tourné sur le mode de débogage. De la sortie, on dirait qu'il a envoyé le message avec succès ... Je viens de recevoir 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:<myname@gmail.com> 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:<myname@gmail.com>\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')
Était-ce utile?

La solution

Je pense que le serveur SMTP GMail effectue une recherche DNS inversée sur l'adresse IP que vous connectez à partir, et refuse la connexion si aucun domaine ne peut être trouvé. Ceci permet d'éviter spammeur d'utiliser leur serveur SMTP comme un relais ouvert.

Autres conseils

Avez-vous essayé la construction d'un message valide?

from email.MIMEText import MIMEText

msg = MIMEText('body')
msg['Subject'] = 'subject'
msg['From'] = "..."
msg['Reply-to'] = "..."
msg['To'] = "..."

Je ne sais pas si OP se soucie encore de cette réponse, mais ayant moi-même trouvé ici dans un effort pour résoudre un problème similaire, nous espérons que quelqu'un d'autre pourrait trouver cela utile. Il se trouve que, Google a changé la façon dont ils permettent leur serveur SMTP à utiliser. Vous voulez vérifier deux choses:

  1. Que vous utilisez la même adresse que vous avez utilisé pour authentifier comme adresse « de ». Si je ne me trompe pas, il l'habitude d'être le cas que vous pourriez mettre à peu près tout ce que vous vouliez dans le champ, mais pour des raisons de sécurité de nombreux sites d'accueil SMTP (y compris Google) limitent maintenant ce à l'adresse qui a authentifié avec eux.

  2. Permettez à votre compte à accéder par les applications moins sûres »(lire: des applications que nous ne générons pas de revenus de). Pour ce faire connecter à votre compte et naviguez ici: https://www.google.com/settings/security/lesssecureapps

  3. Utiliser le port 587 avec tls. Pas vraiment sûr pourquoi, mais je ne pourrais jamais obtenir le port 465 pour jouer bien.

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

Certains auto-promotion, mais je me sens sur un motif valable.

Vous ne 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 seule ligne:

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

Ce qui est bien est que je vous propose d'utiliser pour stocker votre trousseau de clés mot de passe, vous n'avez un risque de voir les gens de votre mot de passe dans votre script.

Vous pouvez régler cela en cours d'exécution une fois dans votre interprète:

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

et la sortie. Ensuite, vous pouvez simplement utiliser:

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

Si vous ajoutez .yagmail avec « my@gmail.com » dans votre répertoire personnel, vous pouvez juste faire: yagmail.SMTP(), mais c'est plutôt inutile maintenant

.

Attention: Si vous sérieux au sujet de l'envoi d'un grand nombre de messages, mieux mis en place OAuth2, yagmail peut aider avec cette

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

La première fois couru, il vous guidera à travers le processus d'obtention des informations d'identification OAuth2 et les stocker dans le fichier afin que la prochaine fois que vous n'avez pas besoin de faire quelque chose avec elle. Est-ce que vous pensez que quelqu'un a trouvé vos informations d'identification? Ils ont des autorisations limitées, mais vous feriez mieux de invalident leurs informations d'identification via gmail.

Pour l'ensemble / l'installation s'il vous plaît regarder git ou readthedocs , disponible pour Python 2 et 3.

Vous devez vérifier votre dossier « Envoyé » dans GMail, comme c'est là un message envoyé à partir de votre compte à votre compte affichera le plus probablement.

Je suis allé le lien mentionné ci-dessus et avait 3 différentes adresses pour envoyer à mais je reçu trois e-mails à la même adresse et é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!!-')

Il est des œuvres

'''
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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top