web-dev-qa-db-fra.com

Comment envoyer un mail directement au serveur SMTP sans authentification?

Je souhaite envoyer un e-mail directement depuis un script vers un compte de messagerie Gmail, en me connectant directement à smtp.gmail.com.

Cependant, je préférerais ne pas avoir le mot de passe gmail dans le script. D'après ce que j'ai lu, il semble que Gmail nécessite une authentification avant de livrer tout courrier, y compris à ses propres utilisateurs.

Ma question est de savoir comment le courrier provenant d'un autre serveur SMTP est jamais livré, car ce serveur SMTP n'aura pas les informations d'identification Gmail. Gmail nécessite-t-il uniquement une authentification pour les expéditeurs "anonymes", et puisque mon script s'exécute sur un ordinateur personnel, il est soumis à une sécurité plus élevée? Voici le script python que j'exécute:

import smtplib
import email
msg = email.message.Message()
msg["From"] = "[email protected]"
msg["To"] = "[email protected]"
msg["Subject"] = "Test message"
server = smtplib.SMTP("smtp.gmail.com",587)
server.starttls()
server.ehlo_or_helo_if_needed()
try:
    failed = server.sendmail("[email protected]","[email protected]", msg.as_string())
    server.close()
except Exception as e:
    print(e)

Lorsque j'exécute ce script, la sortie est:

(530, b'5.5.1 Authentication Required. Learn more at
5.5.1 http://support.google.com/mail/bin/answer.py?answer=14257 fw5sm21125889wib.0', '[email protected]')

Ma question est, comment les serveurs SMTP externes évitent-ils ce problème? Et tout ce qu'ils font est-il réplicable dans un script local, ou cela nécessite-t-il des enregistrements DNS inversés, des enregistrements SPF, etc. corrects?

19
janak

Vous pouvez utiliser certains serveurs SMTP externes sans authentification (ou un SMTP local), mais le message envoyé sera capturé par le filtre anti-spam de Google car le msg ["From"] est @ google. com, alors que le SMTP réel n'est pas smtp.gmail.com.

Ces serveurs SMTP doivent également avoir une zone inverse correcte dans le DNS du FAI et sinon ce smtp sera bloqué par google.

10
maxsocl

C'est une très bonne question, et je réponds en ligne.

Je souhaite envoyer un e-mail directement depuis un script vers un compte de messagerie Gmail, en me connectant directement à smtp.gmail.com.

Tout d'abord smtp.gmail.com n'est pas un serveur de messagerie qui accepte le courrier (provenant d'autres serveurs de messagerie), mais autorise plutôt Gmail les utilisateurs à se connecter et donc à envoyer ou vérifier des e-mails. Si nous voulons découvrir les serveurs de messagerie Gmail qui acceptent les messages provenant d'autres serveurs de messagerie. Nous pouvons exécuter la cmd suivante sur le terminal:

Dig mx gmail.com +short

sortie:

10 alt1.gmail-smtp-in.l.google.com.
40 alt4.gmail-smtp-in.l.google.com.
5 gmail-smtp-in.l.google.com.
30 alt3.gmail-smtp-in.l.google.com.
20 alt2.gmail-smtp-in.l.google.com. 

Puisque gmail-smtp-in.l.google.com. a la valeur la plus basse de 5 nous l'utilisons comme serveur de messagerie préféré

Cependant, je préférerais ne pas avoir le mot de passe gmail dans le script. D'après ce que j'ai lu, il semble que Gmail nécessite une authentification avant de livrer tout courrier, y compris à ses propres utilisateurs.

Exactement, on utilise smtp.gmail.com pour se connecter et envoyer/vérifier des e-mails vers/depuis leurs comptes respectifs, nous avons donc besoin des informations d'identification de l'utilisateur. Cependant, nous n'avons pas besoin d'informations d'identification pour envoyer des e-mails à son serveur de messagerie, c'est-à-dire gmail-smtp-in.l.google.com (exemple ci-dessous)

Ma question est de savoir comment le courrier provenant d'un autre serveur SMTP est jamais livré, car ce serveur SMTP n'aura pas les informations d'identification Gmail. Gmail nécessite-t-il uniquement une authentification pour les expéditeurs "anonymes" et, comme mon script s'exécute sur un ordinateur personnel, il est soumis à une sécurité accrue? Voici le script python que j'exécute:

Comme je l'ai dit clairement à partir de la discussion ci-dessus, nous n'avons pas besoin d'informations d'identification Gmail pour se connecter à serveurs de messagerie Gmail, mais si nous nous connectons à serveurs de messagerie Gmail en utilisant des ordinateurs personnels, nous pouvons s'en tirer avec l'envoi de quelques courriels, mais pour envoyer plus de courriels, nous devons bâtir une réputation de domaine et une responsabilisation en utilisant DKIM, SPF, etc. (c'est un tout autre spectre).

Le script python envoie un e-mail à un compte Gmail sans authentification.

import smtplib

fromaddr = '[email protected]'
toaddrs  = ['[email protected]']
msg = '''
    From: {fromaddr}
    To: {toaddr}
    Subject: testin'     
    This is a test 
    .
'''

msg = msg.format(fromaddr =fromaddr, toaddr = toaddrs[0])
# The actual mail send
server = smtplib.SMTP('gmail-smtp-in.l.google.com:25')
server.starttls()
server.ehlo("example.com")
server.mail(fromaddr)
server.rcpt(toaddrs[0])
server.data(msg)
server.quit()  

Ou essayez l'extrait Telnet suivant

telnet gmail-smtp-in.l.google.com 25

HELO sendingdomain.com

MAIL FROM:<[email protected]>

RCPT TO:<[email protected]>

DATA
From: <[email protected]>
To: <[email protected]>
Subject: Just a test email

The body of the mail goes here.          
.

QUIT
32
MaK

Vous ne pouvez pas utiliser gmail smtp-server sans authentification. C'est une politique google. Vous devez saisir le mot de passe de votre compte. Mais il y a un autre chemin. Vous pouvez utiliser GAE (Google App Engine) avec l'API Gmail. De cette façon, vous pouvez envoyer des messages directement.

1
SkyFox