از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
روش ارسال ایمیل با جیمیل با استفاده از پایتون
سرفصلهای مطلب
راههای زیادی برای ارسال ایمیل با پایتون وجود دارد، چه از طریق یک کتابخانه شخص ثالث مانند بوتو و SES، یا از طریق یک پروتکل ایمیل مانند SMTP. در حالی که موضوع استفاده از پایتون برای ارسال ایمیل ممکن است به نظر برسد که این کار تا حد مرگ انجام شده است، روشهای بسیار متفاوتی برای انجام آن وجود دارد و مشکلات زیادی ممکن است پیش بیاید. فکر کردم نوشتن یک آموزش مفید باشد روی روش ارسال ایمیل با جیمیل به عنوان ارائه دهنده با استفاده از پایتون
پروتکل SMTP
این ممکن است تعجب آور نباشد، اما البته پایتون در حال حاضر یک کتابخانه دارد که به شما امکان می دهد به یک کتابخانه متصل شوید SMTP سرور، مانند چیزی که Gmail استفاده می کند. این کتابخانه به طور قابل پیش بینی نامیده می شود smtplib و همراه با پایتون است.
SMTP (پروتکل انتقال نامه ساده) یک پروتکل در سطح برنامه (روی بالای TCP) برای برقراری ارتباط با سرورهای ایمیل از سرویس های خارجی، مانند سرویس گیرنده ایمیل استفاده می شود روی گوشی خود را. SMTP فقط یک پروتکل تحویل است، بنابراین نمیتوانید ایمیل را با آن بازیابی کنید، فقط میتوانید ایمیل ارسال کنید، این همان چیزی است که ما روی آن تمرکز خواهیم کرد. روی در این مقاله. اگر می خواهید به جای آن ایمیل را بازیابی کنید، باید آن را بررسی کنید IMAP پروتکل (پروتکل دسترسی به پیام های اینترنتی).
باید توجه داشته باشم که بسیاری از خدمات ایمیل مانند جیمیل، معمولاً از SMTP استفاده نکنید روی سرورهای ایمیل داخلی آنها SMTP معمولاً فقط به عنوان یک رابط رو به بیرون از طریق سرویس آنها ارائه می شود smtp.gmail.com
سرور این بیشتر به منظور استفاده توسط مشتریان ایمیل است روی تلفن یا رایانه شما (مانند Outlook، Thunderbird و غیره). گاهی اوقات می توان از آن برای سایر خدمات شخص ثالث استفاده کرد. به عنوان مثال، فرض کنید یک برنامه Gmail را اجرا می کنید مسدود کردن فرستنده، که در آن باید ایمیل بفرستید روی از طرف کاربران برای انجام این کار، استفاده از پایتون و SMTP ممکن است یکی از گزینههای اتصال به حساب کاربر باشد.
باز کردن اتصال
همانطور که قبلا ذکر شد، پایتون به راحتی همراه با smtplib
، که تمام بخش های مختلف پروتکل مانند اتصال، احراز هویت، اعتبارسنجی و البته ارسال ایمیل را مدیریت می کند.
با استفاده از این کتابخانه، چند راه مختلف وجود دارد که می توانید به سرور ایمیل خود اتصال ایجاد کنید. در این بخش، ما تمرکز می کنیم روی ایجاد یک اتصال ساده و ناامن (که به ندرت باید استفاده شود). این اتصال رمزگذاری نشده است و به طور پیشفرض روی پورت 25 است. با این حال، پروتکل ارسال نامه در واقع از 587 استفاده میکند، که ما از آن استفاده خواهیم کرد.
ایجاد این اتصالات واقعاً ساده است smtplib
. نسخه رمزگذاری نشده را می توان با موارد زیر ایجاد کرد:
import smtplib
try:
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
except:
print 'Something went wrong...'
و بس. واقعاً چیزی بیشتر از ارسال آدرس سرور، پورت و تماس وجود ندارد .helo()
، که شما را در سرور SMTP شناسایی می کند. با استفاده از این server
اکنون می توانید از طریق یک اتصال ناامن ایمیل ارسال کنید.
توجه: ممکن است هنوز برای ارسال ایمیل آماده نباشید. جیمیل محدودیت هایی را اعمال می کند روی اتصالات SMTP مانند این است. برای اطلاعات بیشتر به بخش «احراز هویت با Gmail» در زیر مراجعه کنید.
با استفاده از یک اتصال امن
هنگامی که یک اتصال SMTP از طریق TLS/SSL ایمن می شود، از طریق پورت 465 انجام می شود و معمولا SMTPS نامیده می شود. نیازی به گفتن نیست، شما باید همیشه از اتصال ایمن استفاده کنید.
چند راه مختلف وجود دارد که می توانید اتصالات SMTP خود را در آن ایمن کنید smtplib
کتابخانه راه اول این است که ابتدا یک اتصال ناامن ایجاد کنید و سپس به TLS ارتقا دهید. این کار با استفاده از .starttls()
روش.
import smtplib
try:
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
except:
print 'Something went wrong...'
توجه داشته باشید که در حالی که این بسیار شبیه به اتصال ناامن قبلی است که ایجاد کردیم، تنها تفاوت این است که ما از .starttls()
روشی برای ارتقای اتصال به امن.
گزینه دیگر شما این است که از همان ابتدا یک اتصال SSL ایجاد کنید. در این مورد، شما می خواهید از آن استفاده کنید .SMTP_SSL()
روش در عوض:
import smtplib
try:
server_ssl = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server_ssl.ehlo()
except:
print 'Something went wrong...'
در میان تفاوتهای جزئی دیگر، ما از پورت SMTPS (465) فوراً استفاده میکنیم، اگرچه میتوانید پارامتر پورت را حذف کنید و smtplib
به هر حال پیش فرض 465 خواهد بود.
اکنون که اتصال خود را داریم، بیایید یک ایمیل ایجاد کنیم.
ایجاد ایمیل
ایمیلها، در اصل، فقط رشتههایی از متن هستند که با کاراکترهای خط جدید متصل شدهاند. اکثر ایمیلها حداقل دارای فیلدهای «از»، «به»، «موضوع» و یک متن هستند. در اینجا یک مثال ساده است:
From: (email protected)
To: (email protected), (email protected)
Subject: OMG Super Important Message
Hey, what's up?
- You
همانطور که می بینید، هر خط حاوی یک فیلد جدید با داده های خود است. بدون پروتکل باینری، بدون XML، بدون JSON، فقط رشته های جدا شده از خط.
یک راه ساده برای پارامترسازی این فیلدها استفاده از قالب بندی رشته در پایتون است:
sent_from = '(email protected)'
to = ('(email protected)', '(email protected)')
subject = 'OMG Super Important Message'
body = 'Hey, what's up?\n\n- You'
email_text = """\
From: %s
To: %s
Subject: %s
%s
""" % (sent_from, ", ".join(to), subject, body)
اکنون تنها کاری که باید انجام دهید این است که از آن عبور کنید email_text
رشته به smtplib
، که در بخش بعدی نشان خواهیم داد و شما آماده هستید.
احراز هویت با جیمیل
قبل از اینکه بتوانید از طریق Gmail با SMTP ایمیل بفرستید، باید چند مرحله را طی کنید و این به احراز هویت مربوط می شود. اگر از جیمیل بهعنوان ارائهدهنده استفاده میکنید، باید به Google بگویید که به شما اجازه دهد از طریق SMTP متصل شوید، که روشی «کمایمن» در نظر گرفته میشود.
واقعاً نمیتوانید Google را به خاطر راهاندازی آن به این روش سرزنش کنید، زیرا برنامه شما (یا برخی از برنامههای شخص ثالث دیگر) برای این کار باید رمز عبور متن ساده شما را داشته باشد، که قطعاً ایدهآل نیست. این مانند پروتکل OAuth نیست که در آن یک توکن قابل فسخ صادر می شود، بنابراین آنها باید راه دیگری برای اطمینان از اینکه هیچ طرف غیرمجاز به داده های شما دسترسی ندارند پیدا کنند.
برای بسیاری از ارائه دهندگان ایمیل دیگر، شما نیازی به انجام هیچ یک از مراحل اضافی که در اینجا توضیح می دهم نخواهید داشت.
ابتدا، باید به برنامههای با امنیت کمتر اجازه دسترسی به حساب شما را بدهید. برای دستورالعمل های دقیق روی چگونه این کار را انجام دهید، باید این را بررسی کنید page:
اجازه دادن به برنامههای کمتر امن برای دسترسی به حساب شما
اگر تأیید 2 مرحلهای را فعال کردهاید روی حساب کاربری خود را، پس باید برای برنامه هایی مانند این که امنیت کمتری دارند، یک رمز عبور مخصوص برنامه ایجاد کنید. در این صورت، باید دستورالعمل های اینجا را دنبال کنید:
با استفاده از رمزهای عبور برنامه وارد سیستم شوید
و در نهایت، اگر شما هستید هنوز گرفتن یک SMTPAuthenticationError
با کد خطای 534، پس باید یک مرحله دیگر را برای این کار انجام دهید.
من مجبور نبودم این مرحله آخر را برای حساب های خودم انجام دهم، اما خوانده ام که در واقع بلافاصله کار نمی کند. ظاهراً پس از فعال کردن برنامههای کمایمن، ممکن است لازم باشد چند دقیقه منتظر بمانید تا پیوند «Display Unlock Captcha» را امتحان کنید. اگر با این مشکل برخورد کردید و راه خوبی برای حل آن پیدا کردید، لطفاً در نظرات به ما اطلاع دهید!
در مورد کد واقعی پایتون، تنها کاری که باید انجام دهید این است که با آن تماس بگیرید login
روش:
import smtplib
gmail_user = '(email protected)'
gmail_password = 'P@ssword!'
try:
server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.ehlo()
server.login(gmail_user, gmail_password)
except:
print 'Something went wrong...'
ارسال ایمیل
اکنون که اتصال SMTP خود را راه اندازی کرده اید و برنامه خود را با Google مجاز کرده اید، در نهایت می توانید از Python برای ارسال ایمیل با Gmail استفاده کنید.
با استفاده از رشته ایمیلی که در بالا ساختیم، و متصل/تأیید شده server
شی، باید با آن تماس بگیرید .sendmail()
روش. در اینجا کد کامل شامل روش های بستن اتصال آمده است:
import smtplib
gmail_user = '(email protected)'
gmail_password = 'P@ssword!'
sent_from = gmail_user
to = ('(email protected)', '(email protected)')
subject = 'OMG Super Important Message'
body = 'Hey, what's up?\n\n- You'
email_text = """\
From: %s
To: %s
Subject: %s
%s
""" % (sent_from, ", ".join(to), subject, body)
try:
server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.ehlo()
server.login(gmail_user, gmail_password)
server.sendmail(sent_from, to, email_text)
server.close()
print 'Email sent!'
except:
print 'Something went wrong...'
نتیجه
جدای از مراحل مجوز اختصاصی Gmail (شامل برنامههای کمتر ایمن و غیره)، این کد باید تقریباً برای هر ارائهدهنده ایمیل دیگری که از دسترسی SMTP پشتیبانی میکند، با فرض داشتن آدرس سرور و پورت صحیح کار کند. اگر متوجه شدید که سایر ارائه دهندگان محدودیت های خاصی را اعمال می کنند روی دسترسی به SMTP مانند گوگل، به ما اطلاع دهید! ما می خواهیم تا آنجا که ممکن است اطلاعات را در اینجا قرار دهیم.
آیا از طریق برنامه نویسی ایمیل با SMTP ارسال می کنید؟ برای چه نوع برنامه هایی از آن استفاده می کنید؟ در نظرات به ما اطلاع دهید!
منابع
ویرایش کنید: با تشکر از cropr (در نظرات) برای اشاره به اینکه جیمیل تعدادی محدودیت را اعمال می کند روی افرادی که با SMTP ایمیل ارسال می کنند. اکانت های رایگان به 500 ایمیل در روز محدود می شوند و نرخ آن به حدود 20 ایمیل در ثانیه محدود می شود.
اگر فکر میکنید از این محدودیتها فراتر میروید، ممکن است بخواهید سرور SMTP خود را راهاندازی کنید یا از خدماتی مانند AWS SES یا Sendgrid استفاده کنید.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-30 05:32:04