web-dev-qa-db-fra.com

Sendmail Errno [61] Connexion refusée

J'ai essayé d'obtenir mon application pour envoyer du texte sorti à un email. Pour simplifier, j'ai isolé le script:

import smtplib
import sys
import os

SERVER = "localhost"

FROM = os.getlogin()
TO = [raw_input("To : ")]

SUBJECT = "Message From " + os.getlogin()

print "Message : (End with ^D)"
TEXT = ''
while 1:
    line = sys.stdin.readline()
    if not line:
        break
    TEXT = TEXT + line

# Prepare actual message

message = """\
From: %s
To: %s
Subject: %s

%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)

# Send the mail

server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO, message)
server.quit()

Ce script affiche:

    Traceback (most recent call last):
  File "/Users/christianlaustsen/Dropbox/Apps - Python/mail/smtplib_mail.py", line 32, in <module>
    server = smtplib.SMTP(SERVER)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/smtplib.py", line 239, in __init__
    (code, msg) = self.connect(Host, port)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/smtplib.py", line 295, in connect
    self.sock = self._get_socket(Host, port, self.timeout)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/smtplib.py", line 273, in _get_socket
    return socket.create_connection((port, Host), timeout)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/socket.py", line 512, in create_connection
    raise error, msg
error: [Errno 61] Connection refused

Comme vous pouvez le constater, la connexion est refusée. J'utilise Python 2.6 sur Mac OS X Snow Leopard (si cela est pertinent).

J'ai souvent essayé de chercher, mais je n'ai pas trouvé de solution. Toute aide serait appréciée.

34
Tehnix

À mon avis, aucun serveur SMTP n'est installé sur votre ordinateur local.

Si vos courriels ne sont pas sensibles, ouvrez un compte Gmail et envoyez vos courriels avec Python .

16
Adam Matan

Si vous démarrez un serveur local comme suit:

python -m smtpd -n -c serveur de débogage localhost: 1025

Veillez à modifier le code d'envoi du courrier pour utiliser le numéro de port non standard:

server = smtplib.SMTP(SERVER, 1025)
server.sendmail(FROM, TO, message)
server.quit()
55
Gabriel Ferrer

Démarrez un serveur SMTP simple avec Python comme ceci:

python -m smtpd -n -c DebuggingServer localhost:1025
12
Raj

Si vous ne souhaitez pas exécuter un serveur distinct et que vous utilisez uniquement Unix, vous pouvez utiliser cette technique, copiée depuis http://www.yak.net/fqa/84.html à l'origine de la FAQ Python:

Sous Unix, c'est très simple, en utilisant sendmail. L'emplacement du programme sendmail varie selon les systèmes. parfois c'est/usr/lib/sendmail, parfois/usr/sbin/sendmail. La page de manuel de sendmail vous aidera. Voici un exemple de code:

SENDMAIL = "/usr/sbin/sendmail" # sendmail location
import os
p = os.popen("%s -t" % SENDMAIL, "w")
p.write("To: [email protected]\n")
p.write("Subject: test\n")
p.write("\n") # blank line separating headers from body
p.write("Some text\n")
p.write("some more text\n")
sts = p.close()
if sts != 0:
    print "Sendmail exit status", sts
4

Je voulais créer quelque chose afin que vous puissiez simplement copier-coller et le faire fonctionner, mais c'est le plus proche que j'ai eu:

from email.message import EmailMessage
import smtplib
import os

def send_email(message,destination):
    # important, you need to send it to a server that knows how to send e-mails for you
    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    # don't know how to do it without cleartexting the password and not relying on some json file that you dont git control...
    server.login('[email protected]', 'password_for_gmail')
    msg = EmailMessage()
    msg.set_content(message)

    msg['Subject'] = 'TEST'
    msg['From'] = '[email protected]'
    msg['To'] = destination
    server.send_message(msg)

if __== '__main__':
    send_email('msg','destination@email')

Je pense que le tutoriel est trompeur car il suppose sans vous dire que vous avez déjà un serveur actif qui envoie des e-mails pour vous ... c’est étrange. Le seul problème avec mon script est que je ne sais pas comment le faire fonctionner sans avoir le mot de passe en clair qui y est écrit, mais hélas ... au moins, il l'envoie? Il suffit de créer une fausse adresse e-mail ou quelque chose comme ça ...

1
Charlie Parker

Pour une raison quelconque, j'avais des difficultés à transmettre le serveur et le port au constructeur, mais pas à la fonction de connexion. Cela a fini par travailler pour moi:

    s = smtplib.SMTP(timeout=30) #seconds
    s.connect(EMAIL_Host, EMAIL_PORT)
    m = MIMEText('see subject')
    m['subject'] = 'sweet subject'
    m['from'] = EMAIL_FROM
    m['to'] = to_list  # comma-separated list of emails
    s.sendmail(m['from'], m['to'].split(','), m.as_string())
    s.quit()
0
Blaskovicz

Si vous êtes root sur votre système, vous voudrez peut-être installer opensmtpd. Premièrement, vous n'avez pas besoin d'exécuter le serveur manuellement (ce service est activé par défaut. Après l'installation de smtpd, démarrez-le manuellement ou redémarrez votre ordinateur). Deuxièmement, vous n'avez pas besoin de changer la ligne server = smtplib.SMTP(SERVER). Pour conclure, utilisez yum install opensmtpd ou la commande équivalente apt-get.

0
e271p314