5

我正在尝试从一本书(“Hello!Python”)中学习 python。根据这本书,这段代码应该发送一封电子邮件。到目前为止没有运气。

import os

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib

def send_message(message):
    s = smtplib.SMTP('smtp.me.com')
    s.sendmail(message['From'], message['To'], message.as_string())
    s.quit()

def mail_report(to, ticker_name):
    outer = MIMEMultipart()
    outer['Subject'] = "Stock report for " + ticker_name
    outer['From'] = "myemail@mac.com"
    outer['To'] = to

    # Internal text container
    inner = MIMEMultipart('alternative')
    text = "Here is the stock report for " + ticker_name
    html = """\
    <html>
      <head></head>
      <body>
        <p>Here is teh stock report for
          <b> """ + ticker_name + """ </b>
        </p>
      </body>
    </html>
    """
    part1 = MIMEText(text, 'plain')
    part2 = MIMEText(html, 'html')
    inner.attach(part1)
    inner.attach(part2)
    outer.attach(inner)

    filename = 'stocktracker-%s.csv' % ticker_name
    csv_text = ''.join(file(filename).readlines())
    csv_part = MIMEText(csv_text, 'csv')
    csv_part.add_header('Content-Disposition', 'attachment', filename=filename), outer.attach(csv_part)
    return outer

if __name__ == '__main__':
    email = mail_report('myemail@mac.com', 'GOOG')
    send_message(email)

我没有收到错误消息,但我也没有收到电子邮件。(不用说,我使用的是我的实际电子邮件,而不是'myemail@mac.com')所有建议和建议阅读都表示赞赏。

4

2 回答 2

2

您可以运行本地 smtp 调试服务器。找到 smtpd.py 所在的位置,然后运行命令:

$ python /usr/lib/python2.7/smtpd.py -n -c DebuggingServer localhost:8025

然后在第二个终端屏幕上运行 Python 解释器:

>>> import smtplib
>>> s = smtplib.SMTP('localhost', 8025)
>>> s.sendmail('me', 'you', 'Hi!')

你应该看到“嗨!” 在第一个屏幕中。

于 2012-09-06T20:29:56.297 回答
0

如果smtplib.sendmail无法发送邮件,它最终应该会引发异常 - 由于连接被防火墙断开,超时可能只需要一段时间。给它几分钟。同时,请阅读下文,了解可能出现的问题。

该代码尝试直接连接到smtp.me.com并通过 SMTP(端口 25)发送邮件。这仅在以下情况下有效:

  • 您的互联网设置允许您在端口 25 上建立传出连接
  • smtp.me.com 在端口 25 上侦听(确实如此)
  • 收件人电子邮件是以@mac.com结尾的有效地址(myemail@mac.com无效550 5.1.1 unknown or illegal alias: myemail@mac.com :)
  • smtp.me.com 仍在处理@mac.com 的电子邮件(Mobile Me 前段时间被 iCloud 关闭,所以我不确定@mac.com 地址是否仍然有效)

您可以将任何其他邮件服务器替换为smtp.me.com,最好是您的 ISP 的,它应该愿意将电子邮件中继到任何地址(与 smtp.me.com 不同,它只关心 mac.com 域)。

于 2012-09-06T20:22:49.493 回答