试图用python发送电子邮件

时间:2012-08-01 23:42:43

标签: python email

  

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

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

3 个答案:

答案 0 :(得分:2)

这是关键位:

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

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

这是第二个关键位:

SERVER = 'addisonbean.com'

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

答案 1 :(得分:1)

虽然addisonbean.com会侦听25端口并回答220 accra.dreamhost.com ESMTP - 但您似乎落后于代理或某种防火墙。你可以从你的控制台做telnet addisonbean.com 25吗?

答案 2 :(得分: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服务器),您的“发件人”可能是 yaddayadda@addisonbean.com 但是要连接到 dreamhost.com SMTP服务器可能有所不同:我猜测“smtpUsername”可能是您用来登录网站管理员的用户名,“smtpHost”可能改为像smtp.dreamhost.com这样的东西......我真的不知道。

你有lot of resources如何做到这一点。

你似乎也是一名设计师或摄影师......其中一个 dudes 让人关注屏幕上的事物以及所有......然后你可能想要调查一下{{3} } 是。你知道......所以电子邮件不会只发送文字,但你可以把精美的HTML放进去...... 你知道我在说什么吗?