web-dev-qa-db-ja.com

Pythonの新機能、GMailSMTPエラー

簡単なsendmail関数を自分自身に書き込んでいますが、次のエラーが発生し続けます。

NameError:名前 'SMTPException'が定義されていません

私のコードの何が問題になっていますか?助言がありますか?

import smtplib

sender = "[email protected]"
receiver = ["[email protected]"]
message = "Hello!"

try:
    session = smptlib.SMTP('smtp.gmail.com',587)
    session.ehlo()
    session.starttls()
    session.ehlo()
    session.login(sender,'password')
    session.sendmail(sender,receiver,message)
    session.quit()
except SMTPException:
    print('Error')
15
eatonphil

Pythonでは、名前の前にモジュールを付けて、名前を完全修飾する必要があります。

except smtplib.SMTPException:

これは、修飾されていない名前を具体的にインポートしない限り当てはまります(ただし、プログラムでこれを行うことはお勧めしません。可能なことを示すだけです)。

from smtplib import SMTPException
29
Greg Hewgill

そのスペルミスは私にも何度も起こりました!この「問題」を回避する1つの方法は、 yagmail を使用することです。

冗談はさておき、私は最近、メールの送信を簡単にするためにyagmailを作成しました。

例えば:

import yagmail
yag = yagmail.SMTP('[email protected]', 'password')
yag.send(contents = "Hello!")

ここではいくつかの短縮形を使用しています。たとえば、Toが定義されていない場合、サーバーに登録したのと同じ電子メールにメールを送信します。また、ポートとホストがデフォルトであるため、非常に簡潔になっています。

実際、すぐに接続を閉じたいように思われるので、次のワンライナーを使用することもできます。

yagmail.SMTP('[email protected]', 'password').send(contents = "Hello!")

セキュリティのために、パスワードをkeyring(ドキュメントを参照)に保持して、スクリプトに個人パスワードを保持する必要がないようにすることができます。これは非常に重要です。それはあなたにもっと貴重なスクリーン不動産を節約するでしょう。

パッケージにオールインする(@gmail.comがデフォルトです)、次の方法で回避できます。

yagmail.SMTP('user').send('', 'Hello!')

幸運を。

1
PascalVKooten