it-swarm-tr.com

Python'u kullanarak Gmail’le sağlayıcı olarak nasıl e-posta gönderilir?

Python kullanarak e-posta (Gmail) göndermeye çalışıyorum, ancak hatayı alıyorum.

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 betiği aşağıdaki gibidir.

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()
264
Mahori

Doğrudan EHLO içine girmeden önce STARTTLS demelisin:

server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()

Ayrıca, mesaj gövdesinden boş bir satırla ayrılmış From:, To: ve Subject: ileti başlıklarını oluşturmalı ve EOL işaretleyicileri olarak CRLF kullanmalısınız.

Örneğin.

msg = "\r\n".join([
  "From: [email protected]",
  "To: [email protected]",
  "Subject: Just a message",
  "",
  "Why, oh why"
  ])
199
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 numaralı bağlantı noktasını kullanmak istiyorsanız, bir SMTP_SSL nesnesi oluşturmanız gerekir:

# 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'
280
David Okwii

Benzer bir sorunla karşılaştım ve bu soruya rastladım. SMTP Kimlik Doğrulama Hatası aldım ancak kullanıcı adım/şifrem doğruydu. İşte bunu düzeltti. Bunu okudum:

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

Özetle, google smtplib yoluyla giriş yapmanıza izin vermiyor çünkü bu tür girişleri "daha az güvenli" olarak işaretlemiş, bu nedenle yapmanız gereken şey google hesabınıza giriş yaparken bu linke gitmek, ve erişime izin ver:

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

Bu ayarlandıktan sonra (aşağıdaki ekran görüntüsüne bakın) çalışmalıdır.

enter image description here

Giriş şimdi çalışıyor:

smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo()
smtpserver.login('[email protected]', 'me_pass')

Değişiklikten sonraki yanıt:

(235, '2.7.0 Accepted')

Önceden yanıt:

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')

Hala çalışmıyor mu? SMTPAuthenticationError'ı yine de alıyorsanız, ancak şimdi kod 534'tür, bunun nedeni konumun bilinmemesidir. Bu bağlantıyı takip et:

https://accounts.google.com/DisplayUnlockCaptcha

Devam et düğmesini tıkladığınızda, yeni uygulamanızı kaydetmeniz için size 10 dakika verilmelidir. Yani şimdi başka bir giriş yapma girişiminde bulunun ve işe yaramalı.

UPDATE: Bu hemen işe yaramıyor gibi görünüyor. Bu hatayı smptlib'de alırken bir süre sıkışmış olabilirsiniz:

235 == 'Authentication successful'
503 == 'Error: already authenticated'

Mesaj, oturum açmak için tarayıcıyı kullandığını söylüyor:

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' seçeneğini etkinleştirdikten sonra, bir kahve için, geri dönün ve 'DisplayUnlockCaptcha' bağlantısını tekrar deneyin. Kullanıcı deneyiminden, değişikliğin başlaması için bir saat kadar sürebilir. Ardından oturum açma işlemini tekrar deneyin.

123
radtek

OOP ile birlikte misin?

#!/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

Burada bulabilirsiniz: 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

Doğrudan ilişkili değil ama yine de dikkat etmeye değer, paketimin gmail iletilerini göndermeyi gerçekten hızlı ve ağrısız hale getirmeye çalıştığı yönünde. Ayrıca bir hata listesi tutmaya çalışır ve hemen çözüme işaret eder.

Kelimenin tam anlamıyla, yazdığınızın aynısını yapmak için yalnızca bu koda ihtiyaç duyar:

import yagmail
yag = yagmail.SMTP('[email protected]')
yag.send('[email protected]', 'Why,Oh why!')

Veya bir astar:

yagmail.SMTP('[email protected]').send('[email protected]', 'Why,Oh why!')

Paket/kurulum için lütfen Python 2 ve 3 için mevcut olan git veya pip 'e bakın.

11
PascalVKooten

Bu çalışıyor

Gmail APP Şifre Oluştur!

Bunu oluşturduktan sonra sendgmail.py adlı bir dosya oluşturun.

Sonra bu kodu ekleyin :

#!/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)

Yani, eğer başarılı olursanız, şöyle bir resim göreceksiniz:

Kendime ve kendime bir e-posta göndererek test ettim.

Successful email sent.

Not: Hesabımda 2 Adımlı Doğrulama etkinleştirilmiş durumda. Uygulama Şifresi bununla çalışır!

Bu ayar, 2 Adımlı Doğrulamanın etkin olduğu hesaplar için kullanılamaz. Bu tür hesaplar daha az güvenli uygulamalara erişim için uygulamaya özel bir şifre gerektirir.

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

5
JayRizzo

@David'den büyük cevap, genel deneme hariç Python 3 için:

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

Artık, e-posta göndermenizi, e-postayı okumanızı ve REST yoluyla taslak oluşturmanızı sağlayan bir gmail API'si var. SMTP çağrılarının aksine, istek dizisinde e-posta gönderen iş parçacığı tabanlı web sunucuları için (python web sunucuları gibi) engelleyici değildir. API aynı zamanda oldukça güçlü.

  • Tabii ki, e-posta bir web sunucusu olmayan sırasına verilmelidir, ancak seçeneklerin olması güzel.

Etki alanında Google Apps yönetici haklarına sahipseniz kurulum yapmak kolaydır, çünkü istemcinize battaniye izni verebilirsiniz. Aksi takdirde, OAuth kimlik doğrulaması ve izniyle çalışmak zorundasınız.

İşte bunu gösteren bir Gist:

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

2
Tim Richardson

Eski smtplib sorunu gibi görünüyor. python2.7 içinde her şey iyi çalışır.

pdate: Evet, server.ehlo() ayrıca yardımcı olabilir.

1
mega.venik