أحاول إرسال بريد إلكتروني (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()
عليك أن تقول 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"
])
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
باختصار ، لا تسمح لك google بتسجيل الدخول عبر smtplib لأنه أشار إلى أن هذا النوع من تسجيل الدخول "أقل أمانًا" ، لذلك ما عليك فعله هو الانتقال إلى هذا الرابط أثناء تسجيل الدخول إلى حساب google الخاص بك ، والسماح بالوصول:
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" مرة أخرى. من تجربة المستخدم ، قد يستغرق التغيير ما يصل إلى ساعة واحدة ، ثم حاول إجراء عملية تسجيل الدخول مرة أخرى.
#!/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!')
للحصول على الحزمة/التثبيت ، يرجى الاطلاع على git أو pip ، المتاحة لكل من Python 2 و 3.
بعد إنشاء ذلك ، قم بإنشاء ملف يسمى 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)
لذلك ، إذا نجحت ، فسترى صورة مثل هذا:
لقد اختبرت عن طريق إرسال بريد إلكتروني من وإلى نفسي.
ملاحظة: لدي التحقق بخطوتين تمكين على حسابي. كلمة مرور التطبيق تعمل مع هذا!
هذا الإعداد غير متاح للحسابات مع تمكين التحقق بخطوتين. تتطلب هذه الحسابات كلمة مرور خاصة بالتطبيق للوصول إلى التطبيقات الأقل أمانًا.
إجابة رائعة من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()
هناك واجهة برمجة تطبيقات gmail الآن ، والتي تتيح لك إرسال البريد الإلكتروني وقراءة البريد الإلكتروني وإنشاء المسودات عبر REST. على عكس مكالمات بروتوكول نقل البريد الإلكتروني (SMTP) ، فإن عدم حظره يمكن أن يكون شيئًا جيدًا لخوادم الويب المستندة إلى سلاسل الرسائل التي ترسل بريدًا إلكترونيًا في سلسلة رسائل الطلب (مثل خوادم الويب بيثون). API هي أيضا قوية جدا.
من الأسهل الإعداد إذا كان لديك حقوق مسؤول تطبيقات Google في المجال ، لأنه بعد ذلك يمكنك منح إذن بطاريتك لعميلك. بخلاف ذلك ، يتعين عليك تخطي مصادقة OAuth وإذنه.
هنا هو Gist يدل على ذلك:
يبدو وكأنه مشكلة smtplib
القديمة. في python2.7
كل شيء يعمل بشكل جيد.
تحديث : نعم ، server.ehlo()
أيضا يمكن أن تساعد.