【问题标题】:Sendmail Errno[61] Connection RefusedSendmail Errno[61] 连接被拒绝
【发布时间】:2011-08-02 22:59:29
【问题描述】:

我一直在尝试让我的应用程序将一些输出的文本邮寄到电子邮件中。为简化起见,我隔离了脚本:

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

此脚本输出:

    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

如您所见,连接被拒绝。我在 Mac OS X Snow Leopard 上运行 Python 2.6(如果相关)。

我已经尝试了很多搜索,但一直无法找到解决方案。任何帮助将不胜感激。

【问题讨论】:

  • 你调试的第一步...转到shell并输入'telnet localhost 25' 如果这不起作用,则问题不属于SO
  • @MikePennington 或者他们可以使用加布里埃尔的答案,这非常有帮助。 ;)
  • 我不明白,docs.python.org/3/library/email.examples.html这是google搜索给出的第一个链接,这个问题没有明确的答案?一个副本如何粘贴一段 100% 有效的代码并发送电子邮件?

标签: python smtp smtplib


【解决方案1】:

如果按如下方式启动本地服务器:

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

请务必修改邮件发送代码以使用非标准端口号:

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

【讨论】:

  • 在实际的 python 脚本启动之前是否可以不依赖运行某些东西?
  • 我这样做了,当我运行我的脚本时,我看到了输出,这让我认为它成功了,但电子邮件从未出现在我的收件箱中。有什么调试技巧吗?我运行脚本时的输出是--MESSAGE FOLLOWS-- ... --END MESSAGE--
【解决方案2】:

我猜你的本地机器上没有安装任何 SMTP 服务器。

如果您的电子邮件不敏感,请打开一个 Gmail 帐户和send your emails using it with Python

【讨论】:

  • 谢谢,我只是被跺脚(对 smtp 不太了解),因为我可以使用 sendmail 和 os.popen 发送邮件,我不明白为什么会这样不同,但我猜你的回答澄清了它:)......谢谢......
【解决方案3】:

使用 Python 启动一个简单的 SMTP 服务器,如下所示:

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

【讨论】:

  • 它的工作完成后你会如何关闭它?
  • @j413254,让它在一个终端中运行,完成后按 ctrl+c
【解决方案4】:

如果您不想运行单独的服务器,并且仅使用 Unix,则可以使用此技术,该技术复制自 http://www.yak.net/fqa/84.html,最初来自 Python 常见问题解答:

在 Unix 上,使用 sendmail 非常简单。 sendmail 程序的位置因系统而异。有时是 /usr/lib/sendmail,有时是 /usr/sbin/sendmail。 sendmail 手册页将为您提供帮助。下面是一些示例代码:

SENDMAIL = "/usr/sbin/sendmail" # sendmail location
import os
p = os.popen("%s -t" % SENDMAIL, "w")
p.write("To: cary@ratatosk.org\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

【讨论】:

    【解决方案5】:

    我想创建一些东西,这样你就可以复制粘贴它并让它工作,但这是我得到的最接近的:

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

    我觉得该教程具有误导性,因为它假设没有很好地告诉您您已经有一个正在运行的服务器为您发送电子邮件......这很奇怪。我的脚本的唯一问题是我不知道如何在没有明文密码的情况下使它工作,但是唉......至少它发送它?只是制作一个虚假的电子邮件地址或其他东西......


    很久以前就提过这个问题,所以我不记得这是什么意思了,把它放在这里以防万一:

    仅当您为不太安全的应用启用访问权限时才有效: myaccount.google.com/lesssecureapps 。我认为您应该将其作为答案。

    我可能通过使用虚假电子邮件来解决这个问题,或者类似的东西,或者来自我的组织的电子邮件不记得了。祝你好运!

    【讨论】:

    • 这真的不是那么容易做到的:smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8 https://support.google.com/mail/?p=BadCredentials p25sm6790964edm.60 - gsmtp') 你会得到正确的 usr/pss 组合。
    • @Harvey 你指的是什么?几个月来我一直在使用我的解决方案……每天……
    • 只有在您启用对不太安全的应用程序的访问时才有效:myaccount.google.com/lesssecureapps。我认为你应该把它作为答案。
    • 确定为什么不,粘贴您的评论并为您的评论点赞。
    • 是的,它只有在我为不太安全的应用启用访问权限后才起作用。
    【解决方案6】:

    如果您是系统上的 root 用户,那么您可能需要安装 opensmtpd。首先,您不需要手动运行服务器(默认情况下启用此服务,因此在安装smtpd 之后手动启动它或重新启动您的机器)。其次,您不需要更改server = smtplib.SMTP(SERVER) 行。最后,使用yum install opensmtpd 或等效的apt-get 命令。

    【讨论】:

      【解决方案7】:

      无论出于何种原因,我都难以将服务器和端口传递给构造函数,但不是连接函数。这最终对我有用:

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

      【讨论】:

      • “EMAIL_HOST, EMAIL_PORT”应该是什么?你能举个例子吗?
      猜你喜欢
      • 2014-09-28
      • 1970-01-01
      • 2017-04-10
      • 2019-08-07
      • 2013-02-24
      • 1970-01-01
      • 2017-12-15
      • 2014-03-01
      • 2012-09-24
      相关资源
      最近更新 更多