Sendmail Errno[61] Connection Refused

2019-03-09 00:12发布

I've been trying to get my application to mail some outputted text to an email. For simplification I have isolated the 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()

This script outputs :

    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

So as you can see, the connection is being refused. I'm running Python 2.6 on Mac OS X Snow Leopard (if that's relevant).

I have tried searching around a lot, but haven't been able to find a solution. Any help will be appreciated.

7条回答
孤傲高冷的网名
2楼-- · 2019-03-09 00:44

If you start a local server as follows:

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

Make sure to modify the mail-sending code to use the non-standard port number:

server = smtplib.SMTP(SERVER, 1025)
server.sendmail(FROM, TO, message)
server.quit()
查看更多
做个烂人
3楼-- · 2019-03-09 00:51

Start a simple SMTP server with Python like so:

python -m smtpd -n -c DebuggingServer localhost:1025
查看更多
时光不老,我们不散
4楼-- · 2019-03-09 00:53

If you are root on your system then you may want to install opensmtpd. First this way you don't need to run the server manually (this service is enabled by default so after smtpd installation either start it manually or reboot your machine). Second, you don't need to change the line server = smtplib.SMTP(SERVER). To conclude, use yum install opensmtpd or the equivalent apt-get command.

查看更多
冷血范
5楼-- · 2019-03-09 00:55

I wanted to create something so that you could just copy paste it and have it work but this is the closest I got:

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('valid.username@gmail.com', 'password_for_gmail')
    msg = EmailMessage()
    msg.set_content(message)

    msg['Subject'] = 'TEST'
    msg['From'] = 'valid.username@gmail.com'
    msg['To'] = destination
    server.send_message(msg)

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

I feel the tutorial is misleading because it assumes without telling you very well that you already have a running server that sends e-mails for you...its odd. The only issue with my script is that I dont know how to make it work without having the cleartext password just written there but alas...at least it sends it? Just make a fake e-mail address or something...

查看更多
成全新的幸福
6楼-- · 2019-03-09 00:55

For whatever reason, I had difficulty passing server and port to the constructor, but not the connect function. This ended up working for me:

    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()
查看更多
仙女界的扛把子
7楼-- · 2019-03-09 01:01

My guess is that you do not have any SMTP server installed on your local machine.

If your emails are not sensitive, open a Gmail account and send your emails using it with Python.

查看更多
登录 后发表回答