【问题标题】:Trying to send an email with python [duplicate]尝试用python发送电子邮件[重复]
【发布时间】:2012-08-02 08:39:28
【问题描述】:

可能重复:
Send email with python

我正在尝试使用 python 发送电子邮件,但是当我运行脚本时需要一两分钟,然后我收到此错误:

Traceback (most recent call last):
File "./emailer", line 19, in <module>
server = smtplib.SMTP(SERVER)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/smtplib.py", line 239, in __init__
(code, msg) = self.connect(host, port)
File "/System/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 "/System/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 "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/socket.py", line 512, in create_connection
raise error, msg
socket.error: [Errno 60] Operation timed out

这是脚本:

#!/usr/bin/env python

import smtplib

SERVER = 'addisonbean.com'

FROM = 'myemail@gmail.com'
TO = ['myemail@gmail.com']

SUBJECT = 'Hello!'

message = """\
Bla
Bla Bla 
Bla Bla Bla
Bla Bla Bla Bla
"""

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

我也尝试将我的站点 IP 地址作为服务器,但结果相同。

谁能告诉我为什么会这样以及如何解决这个问题?谢谢!

【问题讨论】:

  • SMTP 服务器不需要任何身份验证吗?因为他们通常会这样做
  • 您需要使用实际的邮件服务器作为服务器地址。您不能随便输入任何主机名。

标签: python email


【解决方案1】:

这是关键:

return socket.create_connection((port, host), timeout)
socket.error: [Errno 60] Operation timed out

Python 说:我无法连接到该服务器,我尝试过但它似乎没有响应

这是第二个关键位:

SERVER = 'addisonbean.com'

那不是邮件服务器吧?

【讨论】:

  • 不是。我真的不知道邮件服务器是什么......
  • 不幸的是,在不知道邮件服务器是什么的情况下发送电子邮件非常困难。你会认为今天这些东西会很容易,但它还没有完全实现。您应该从了解电子邮件开始!
【解决方案2】:

虽然 addisonbean.com 确实监听 25 端口并回答 220 accra.dreamhost.com ESMTP - 你似乎在代理或某种防火墙后面。你能在你的控制台上做telnet addisonbean.com 25吗?

【讨论】:

  • 没有。它说这个 addisonbean: nodename nor servname provided, or not known
  • 不。它说:尝试 69.163.221.133... telnet:连接到地址 69.163.221.133:操作超时 telnet:无法连接到远程主机
  • 所以 - 你知道你的原因。这是与网络相关的问题,与您的应用程序无关。
  • @Victor Gavro:该死!!在我花了 20 分钟准备答案后,我看到了这个对话...... :D :D 真是浪费......祝你好运,顺便说一句(@user1525759)
【解决方案3】:

您的页面似乎在托管服务提供商dreamhost.com 中托管。

当您设置帐户时,他们可能让您有机会创建以您的域结尾的电子邮件帐户 (yaddayadda@addisonbean.com)

您可能想要创建一个,获取信息:SMTP(“邮件服务器”)所在的主机、用户名、密码...您必须在脚本中填写所有这些信息。

我建议您使用另一个常规帐户(Gmail.com、Hotmail Outlook.com)开始测试,并且您阅读(相当多)什么是 SMTP 服务器(即服务器您必须与您交谈才能发送您的电子邮件)

这是一个应该使用 gmail 帐户发送电子邮件的简单脚本。用您的数据填写带有星号的信息,看看它是否有效:

#!/usr/bin/env python

import traceback
from smtplib import SMTP
from email.MIMEText import MIMEText

smtpHost = "smtp.gmail.com"
smtpPort = 587
smtpUsername = "***@gmail.com"
smtpPassword = "***"
sender = "***@gmail.com"

def sendEmail(to, subject, content):
    retval = 1
    if not(hasattr(to, "__iter__")):
        to = [to]
    destination = to

    text_subtype = 'plain'
    try:
        msg = MIMEText(content, text_subtype)
        msg['Subject'] = subject
        msg['From'] = sender # some SMTP servers will do this automatically, not all

        conn = SMTP(host=smtpHost, port=smtpPort)
        conn.set_debuglevel(True)
        #conn.login(smtpUsername, smtpPassword)
        try:
            if smtpUsername is not False:
                conn.ehlo()
                if smtpPort != 25:
                    conn.starttls()
                    conn.ehlo()
                if smtpUsername and smtpPassword:
                    conn.login(smtpUsername, smtpPassword)
                else:
                    print("::sendEmail > Skipping authentication information because smtpUsername: %s, smtpPassword: %s" % (smtpUsername, smtpPassword))
            conn.sendmail(sender, destination, msg.as_string())
            retval = 0
        except Exception, e:
            print("::sendEmail > Got %s %s. Showing traceback:\n%s" % (type(e), e, traceback.format_exc()))
            retval = 1
        finally:
            conn.close()

    except Exception, e:
        print("::sendEmail > Got %s %s. Showing traceback:\n%s" % (type(e), e, traceback.format_exc()))
        retval = 1
    return retval

if __name__ == "__main__":
    sendEmail("***@gmail.com", "Subject: Test", "This is a simple test")

一旦您获得了与您的域(smtpHost、smtpPort、smtpUsername...)相同的信息,它也可以正常工作(取决于他们使用的端口,它可能是 25,即是非加密连接的默认值...或不是...您必须与 dreamhost.com 检查)

请注意(因为您使用的主机可能与其他人共享其 SMTP 服务器)您的“发件人”可能是 yaddayadda@addisonbean.com,但实际信息是连接到dreamhost.com SMTP 服务器可能不同:我猜“smtpUsername”可能是您用于登录站点管理员的用户名,“smtpHost”可能会更改为类似smtp.dreamhost.com 之类的……我真的不知道。

你有一个lot of resources 来告诉你怎么做。

您似乎也是一名设计师或摄影师...其中一个 dudes 关注屏幕上的事物的外观以及所有...然后您可能想调查MiME emails 是什么.你知道...所以电子邮件不是仅以文本形式发送的,但您可以在其中放入精美的 HTML...你知道我在说什么吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2020-04-24
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多