-1

可能重复:
使用 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 地址作为服务器,但它做了同样的事情。

有人可以告诉我为什么会这样以及如何解决这个问题吗?谢谢!

4

3 回答 3

2

这是关键点:

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

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

这是第二个关键位:

SERVER = 'addisonbean.com'

那不是邮件服务器,是吗?

于 2012-08-01T23:45:01.957 回答
1

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

于 2012-08-01T23:52:00.740 回答
0

看起来您正在托管服务提供商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 服务器)您的“发件人”可能是yadddayadda@addisonbean.com但连接到dreamhost.com SMTP 服务器的实际信息可能不同:我我猜 ' smtpUsername' 可能是您用于登录站点管理员的用户名, ' smtpHost' 可能会更改为类似的东西smtp.dreamhost.com......我真的不知道。

你有很多关于如何做到这一点的资源。

您似乎也是一名设计师或摄影师...其中一个人们关心屏幕上的内容以及所有内容...然后您可能想调查什么是MiME电子邮件。你知道...所以电子邮件不只发送文本,但您可以在其中放入精美的 HTML...您知道我在说什么吗?

于 2012-08-02T00:39:28.630 回答