5

本からPythonを学ぼうとしています(「Hello! 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

次に、2 番目の端末画面で 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 のメール サーバーを使用してください。ISP のメール サーバーは、任意のアドレスに電子メールを中継してくれるはずです (mac.com ドメインのみを気にする smtp.me.com とは異なります)。

于 2012-09-06T20:22:49.493 に答える