私はpythonを使用してEメール(Gmail)を送信しようとしていますが、私は以下のエラーを得ています。
Traceback (most recent call last):
File "emailSend.py", line 14, in <module>
server.login(username,password)
File "/usr/lib/python2.5/smtplib.py", line 554, in login
raise SMTPException("SMTP AUTH extension not supported by server.")
smtplib.SMTPException: SMTP AUTH extension not supported by server.
Pythonスクリプトは次のとおりです。
import smtplib
fromaddr = '[email protected]'
toaddrs = '[email protected]'
msg = 'Why,Oh why!'
username = '[email protected]'
password = 'pwd'
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
EHLO
に直接入る前に、STARTTLS
を言う必要があります。
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()
また、From:
、To:
、Subject:
のメッセージヘッダをメッセージ本文から空白行で区切って作成し、EOLマーカーとしてCRLF
を使用する必要があります。
例えば。
msg = "\r\n".join([
"From: [email protected]",
"To: [email protected]",
"Subject: Just a message",
"",
"Why, oh why"
])
def send_email(user, pwd, recipient, subject, body):
import smtplib
FROM = user
TO = recipient if isinstance(recipient, list) else [recipient]
SUBJECT = subject
TEXT = body
# Prepare actual message
message = """From: %s\nTo: %s\nSubject: %s\n\n%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)
try:
server = smtplib.SMTP("smtp.gmail.com", 587)
server.ehlo()
server.starttls()
server.login(user, pwd)
server.sendmail(FROM, TO, message)
server.close()
print 'successfully sent the mail'
except:
print "failed to send mail"
ポート465を使用したい場合はSMTP_SSL
オブジェクトを作成する必要があります。
# SMTP_SSL Example
server_ssl = smtplib.SMTP_SSL("smtp.gmail.com", 465)
server_ssl.ehlo() # optional, called by login()
server_ssl.login(gmail_user, gmail_pwd)
# ssl server doesn't support or need tls, so don't call server_ssl.starttls()
server_ssl.sendmail(FROM, TO, message)
#server_ssl.quit()
server_ssl.close()
print 'successfully sent the mail'
私は同様の問題に遭遇し、この質問につまずいた。 SMTP認証エラーが発生しましたが、ユーザー名/パスは正しかったです。これはそれを修正したものです。私はこれを読みました:
https://support.google.com/accounts/answer/6010255
一言で言えば、グーグルはsmtplib経由でログインを許可していません。なぜなら、それはこの種のログインを「安全性が低い」とフラグを立てているからです。そしてアクセスを許可します。
https://www.google.com/settings/security/lesssecureapps
それが設定されると(下の私のスクリーンショットを見て)、それはうまくいくはずです。
今すぐログインが動作します。
smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo()
smtpserver.login('[email protected]', 'me_pass')
変更後の対応
(235, '2.7.0 Accepted')
前の応答:
smtplib.SMTPAuthenticationError: (535, '5.7.8 Username and Password not accepted. Learn more at\n5.7.8 http://support.google.com/mail/bin/answer.py?answer=14257 g66sm2224117qgf.37 - gsmtp')
まだ動かない? それでもSMTPAuthenticationErrorを受け取るがコードが534の場合は、場所が不明なためです。このリンクをたどってください。
https://accounts.google.com/DisplayUnlockCaptcha
[続行]をクリックすると、新しいアプリを登録するのに10分かかります。そのため、今度は別のログインを試みるとうまくいくはずです。
_ update _ :smptlibでこのエラーが発生してしばらくの間動かなくなる可能性があるので、これはすぐにはうまくいかないようです。
235 == 'Authentication successful'
503 == 'Error: already authenticated'
メッセージは、ブラウザを使用してサインインするように指示しています。
SMTPAuthenticationError: (534, '5.7.9 Please log in with your web browser and then try again. Learn more at\n5.7.9 https://support.google.com/mail/bin/answer.py?answer=78754 qo11sm4014232igb.17 - gsmtp')
'lesssecureapps'を有効にした後、コーヒーを飲みに戻って、 'DisplayUnlockCaptcha'リンクをもう一度試してください。ユーザーエクスペリエンスから、変更が反映されるまでに最大1時間かかる場合があります。その後、サインインプロセスをもう一度試してください。
#!/usr/bin/env python
import smtplib
class Gmail(object):
def __init__(self, email, password):
self.email = email
self.password = password
self.server = 'smtp.gmail.com'
self.port = 587
session = smtplib.SMTP(self.server, self.port)
session.ehlo()
session.starttls()
session.ehlo
session.login(self.email, self.password)
self.session = session
def send_message(self, subject, body):
''' This must be removed '''
headers = [
"From: " + self.email,
"Subject: " + subject,
"To: " + self.email,
"MIME-Version: 1.0",
"Content-Type: text/html"]
headers = "\r\n".join(headers)
self.session.sendmail(
self.email,
self.email,
headers + "\r\n\r\n" + body)
gm = Gmail('Your Email', 'Password')
gm.send_message('Subject', 'Message')
あなたはそれをここで見つけることができます: http://jayrambhia.com/blog/send-emails-using-python
smtp_Host = 'smtp.gmail.com'
smtp_port = 587
server = smtplib.SMTP()
server.connect(smtp_Host,smtp_port)
server.ehlo()
server.starttls()
server.login(user,passw)
fromaddr = raw_input('Send mail by the name of: ')
tolist = raw_input('To: ').split()
sub = raw_input('Subject: ')
msg = email.MIMEMultipart.MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = email.Utils.COMMASPACE.join(tolist)
msg['Subject'] = sub
msg.attach(MIMEText(raw_input('Body: ')))
msg.attach(MIMEText('\nsent via python', 'plain'))
server.sendmail(user,tolist,msg.as_string())
直接の関係はありませんが、それでも指摘しておく価値があるのは、私のパッケージはgmailメッセージの送信を本当に迅速かつ容易にすることです。それはまたエラーのリストを維持しようとし、直ちに解決策を指すように試みます。
あなたが書いたことを正確に実行するためには、文字通りこのコードだけが必要です。
import yagmail
yag = yagmail.SMTP('[email protected]')
yag.send('[email protected]', 'Why,Oh why!')
またはワンライナー:
yagmail.SMTP('[email protected]').send('[email protected]', 'Why,Oh why!')
それを作成したら、sendgmail.py
という名前のファイルを作成します。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# =============================================================================
# Created By : Jeromie Kirchoff
# Created Date: Mon Aug 02 17:46:00 PDT 2018
# =============================================================================
# Imports
# =============================================================================
import smtplib
# =============================================================================
# SET EMAIL LOGIN REQUIREMENTS
# =============================================================================
gmail_user = '[email protected]'
gmail_app_password = 'YOUR-GOOGLE-APPLICATION-PASSWORD!!!!'
# =============================================================================
# SET THE INFO ABOUT THE SAID EMAIL
# =============================================================================
sent_from = gmail_user
sent_to = ['[email protected]', '[email protected]']
sent_subject = "Where are all my Robot Women at?"
sent_body = ("Hey, what's up? friend!\n\n"
"I hope you have been well!\n"
"\n"
"Cheers,\n"
"Jay\n")
email_text = """\
From: %s
To: %s
Subject: %s
%s
""" % (sent_from, ", ".join(sent_to), sent_subject, sent_body)
# =============================================================================
# SEND EMAIL OR DIE TRYING!!!
# Details: http://www.samlogic.net/articles/smtp-commands-reference.htm
# =============================================================================
try:
server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.ehlo()
server.login(gmail_user, gmail_app_password)
server.sendmail(sent_from, sent_to, email_text)
server.close()
print('Email sent!')
except Exception as exception:
print("Error: %s!\n\n" % exception)
だから、あなたが成功した場合、このような画像が表示されます。
私は自分自身との間で電子メールを送信することによってテストしました。
注:アカウントで 2段階認証プロセス が有効になっています。アプリパスワードはこれで動作します!
この設定は、2段階認証プロセスが有効になっているアカウントには使用できません。このようなアカウントでは、安全性が低いアプリへのアクセスにアプリケーション固有のパスワードが必要です。
@ Davidからの素晴らしい答え、これは一般的なtry-exceptのないPython 3用です:
def send_email(user, password, recipient, subject, body):
gmail_user = user
gmail_pwd = password
FROM = user
TO = recipient if type(recipient) is list else [recipient]
SUBJECT = subject
TEXT = body
# Prepare actual message
message = """From: %s\nTo: %s\nSubject: %s\n\n%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)
server = smtplib.SMTP("smtp.gmail.com", 587)
server.ehlo()
server.starttls()
server.login(gmail_user, gmail_pwd)
server.sendmail(FROM, TO, message)
server.close()
現在、Gmail APIがあります。これを使用すると、RESTを介してEメールの送信、Eメールの読み取り、およびドラフトの作成を行うことができます。 SMTP呼び出しとは異なり、これは非ブロッキングであり、スレッドベースのWebサーバーがリクエストスレッドで電子メールを送信するのに適しています(python Webサーバーなど)。 APIも非常に強力です。
ドメインにGoogle Apps管理者権限がある場合は設定が最も簡単です。クライアントに包括的な権限を付与できるからです。そうでなければ、OAuth認証と許可をいじる必要があります。
これがそれを説明する要点です。
古いsmtplib
の問題のようです。 python2.7
ではすべてがうまくいきます。
更新 :うん、server.ehlo()
も助けになるだろう。