web-dev-qa-db-ja.com

Pythonを使用してGmailをプロバイダとして電子メールを送信する方法

私は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()
257
Mahori

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"
  ])
197
MattH
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'
277
David Okwii

私は同様の問題に遭遇し、この質問につまずいた。 SMTP認証エラーが発生しましたが、ユーザー名/パスは正しかったです。これはそれを修正したものです。私はこれを読みました:

https://support.google.com/accounts/answer/6010255

一言で言えば、グーグルはsmtplib経由でログインを許可していません。なぜなら、それはこの種のログインを「安全性が低い」とフラグを立てているからです。そしてアクセスを許可します。

https://www.google.com/settings/security/lesssecureapps

それが設定されると(下の私のスクリーンショットを見て)、それはうまくいくはずです。

enter image description here

今すぐログインが動作します。

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時間かかる場合があります。その後、サインインプロセスをもう一度試してください。

123
radtek

あなたはOOPでダウンしますか?

#!/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')
16
Ricky Wilson

あなたはそれをここで見つけることができます: 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())
14
Froyo

直接の関係はありませんが、それでも指摘しておく価値があるのは、私のパッケージは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!')

パッケージ/インストールについては、Python 2と3の両方で利用可能な git または pip をご覧ください。

11
PascalVKooten

この作品

Gmail APPパスワードを作成します。

それを作成したら、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)

だから、あなたが成功した場合、このような画像が表示されます。

私は自分自身との間で電子メールを送信することによってテストしました。

Successful email sent.

注:アカウントで 2段階認証プロセス が有効になっています。アプリパスワードはこれで動作します!

この設定は、2段階認証プロセスが有効になっているアカウントには使用できません。このようなアカウントでは、安全性が低いアプリへのアクセスにアプリケーション固有のパスワードが必要です。

Less secure app access... This setting is not available for accounts with 2-Step Verification enabled.

5
JayRizzo

@ 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()
2
juan Isaza

現在、Gmail APIがあります。これを使用すると、RESTを介してEメールの送信、Eメールの読み取り、およびドラフトの作成を行うことができます。 SMTP呼び出しとは異なり、これは非ブロッキングであり、スレッドベースのWebサーバーがリクエストスレッドで電子メールを送信するのに適しています(python Webサーバーなど)。 APIも非常に強力です。

  • もちろん、電子メールはWebサーバ以外のキューに渡されるべきですが、選択肢があるのはいいことです。

ドメインにGoogle Apps管理者権限がある場合は設定が最も簡単です。クライアントに包括的な権限を付与できるからです。そうでなければ、OAuth認証と許可をいじる必要があります。

これがそれを説明する要点です。

https://Gist.github.com/timrichardson/1154e29174926e462b7a

2
Tim Richardson

古いsmtplibの問題のようです。 python2.7ではすべてがうまくいきます。

更新 :うん、server.ehlo()も助けになるだろう。

1
mega.venik