正在尝试使用python发送电子邮件

正在尝试使用python发送电子邮件,python,email,Python,Email,可能重复: 我正在尝试使用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.

可能重复:

我正在尝试使用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
我还尝试将我的站点IP地址用作服务器,但效果相同

有人能告诉我为什么会这样以及如何修复吗?谢谢

这里是关键点:

return socket.create_connection((port, host), timeout)
socket.error: [Errno 60] Operation timed out
Python说:我无法连接到该服务器,我已经尝试过了,但它似乎没有响应

这是第二个关键点:

SERVER = 'addisonbean.com'

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

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

看起来您正在一个托管提供商中托管您的页面

当你设置帐户时,他们可能会给你机会创建以你的域结尾的电子邮件帐户(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
之类的内容。。。我真的不知道

你对如何做到这一点有自己的看法


你似乎也是一名设计师或摄影师。。。其中一个家伙,人们关心的是屏幕上的东西是什么样子的。。。那你可能想调查一下你的想法。你知道的。。。因此,电子邮件不是只发送文本,但你可以把花哨的HTML。。。你知道我在说什么吗?

SMTP服务器不需要任何身份验证吗?因为它们通常不需要,所以您需要使用实际的邮件服务器作为服务器地址。你不能随便输入任何主机名,它不是。我真的不知道什么是邮件服务器……不幸的是,在不知道什么是邮件服务器的情况下发送电子邮件是非常困难的。你可能会认为这些东西到今天会很容易,但它还没有完全实现。你应该从学习电子邮件开始!不。它说这个addisonbean:nodename或servname提供,或者不知道。上面写着:尝试69.163.221.133。。。telnet:连接到地址69.163.221.133:操作超时telnet:无法连接到远程主机所以-您知道原因。这是与网络有关的问题,而不是您的应用程序。@Victor Gavro:Dang!!在我花了20分钟准备答案之后,我看到了这段对话…:多浪费啊。。。祝你好运,顺便说一句(适用于@user1525759)
#!/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")