it-swarm.asia

كيفية إرسال بريد إلكتروني مع Gmail كمزود باستخدام Python؟

أحاول إرسال بريد إلكتروني (Gmail) باستخدام python ، لكنني أتلقى الخطأ التالي.

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.

السيناريو بيثون هو ما يلي.

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: ، مفصولة عن نص الرسالة بخط فارغ واستخدام CRLF كعلامات EOL.

مثلا.

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

باختصار ، لا تسمح لك google بتسجيل الدخول عبر smtplib لأنه أشار إلى أن هذا النوع من تسجيل الدخول "أقل أمانًا" ، لذلك ما عليك فعله هو الانتقال إلى هذا الرابط أثناء تسجيل الدخول إلى حساب google الخاص بك ، والسماح بالوصول:

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" مرة أخرى. من تجربة المستخدم ، قد يستغرق التغيير ما يصل إلى ساعة واحدة ، ثم حاول إجراء عملية تسجيل الدخول مرة أخرى.

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

للحصول على الحزمة/التثبيت ، يرجى الاطلاع على git أو pip ، المتاحة لكل من Python 2 و 3.

11
PascalVKooten

هذا يعمل

إنشاء كلمة مرور التطبيق Gmail!

بعد إنشاء ذلك ، قم بإنشاء ملف يسمى 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.

ملاحظة: لدي التحقق بخطوتين تمكين على حسابي. كلمة مرور التطبيق تعمل مع هذا!

هذا الإعداد غير متاح للحسابات مع تمكين التحقق بخطوتين. تتطلب هذه الحسابات كلمة مرور خاصة بالتطبيق للوصول إلى التطبيقات الأقل أمانًا.

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

5
JayRizzo

إجابة رائعة منDavid ، إليك برنامج 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 الآن ، والتي تتيح لك إرسال البريد الإلكتروني وقراءة البريد الإلكتروني وإنشاء المسودات عبر REST. على عكس مكالمات بروتوكول نقل البريد الإلكتروني (SMTP) ، فإن عدم حظره يمكن أن يكون شيئًا جيدًا لخوادم الويب المستندة إلى سلاسل الرسائل التي ترسل بريدًا إلكترونيًا في سلسلة رسائل الطلب (مثل خوادم الويب بيثون). API هي أيضا قوية جدا.

  • بالطبع ، يجب تسليم البريد الإلكتروني إلى قائمة انتظار بخلاف خادم الويب ، ولكن من الجيد أن يكون لديك خيارات.

من الأسهل الإعداد إذا كان لديك حقوق مسؤول تطبيقات Google في المجال ، لأنه بعد ذلك يمكنك منح إذن بطاريتك لعميلك. بخلاف ذلك ، يتعين عليك تخطي مصادقة OAuth وإذنه.

هنا هو Gist يدل على ذلك:

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

2
Tim Richardson

يبدو وكأنه مشكلة smtplib القديمة. في python2.7 كل شيء يعمل بشكل جيد.

تحديث : نعم ، server.ehlo() أيضا يمكن أن تساعد.

1
mega.venik