در این مقاله به آموزش ارسال ایمیل با پایتون و چگونگی استفاده از SMTP در پایتون را با یکدیگر مورد بررسی قرار می دهیم..
عبارت Simple Mail Transfer Protocol یا به اختصار SMPT (پروتکل ارسال و انتقال ایمیل) معرفی پروتکلی است که ارسال ایمیل و آدرس دهی (routing) آن بین سرویس دهنده های ایمیل را مدیریت می کند.
پایتون ماژولی به نام smtplib در اختیار توسعه دهنده قرار می دهد که یک آبجکت حاوی اطلاعات session ( اطلاعات جلسه ی کاری کاربر یا client session object) را در خود به صورت کپسوله داشته و می توان از آن برای ارسال ایمیل به هر دستگاه آنلاینی که listener daemon (برنامه ی ای که به رخدادها گوش داده و در پس زمینه فعالیت می کند) SMTP یا ESMTP بر روی آن فعال است، استفاده نمود. در زیر نحوه ی ساخت یک آبجکت SMTP ساده که بعده ها جهت ارسال ایمیل مورد استفاده قرار می گیرد، را مشاهده می کنید :
import smtplib smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
در زیر شرح کاربرد هر یک از پارامترهای عنوان شده در قطعه کد بالا را مشاهده می کنید :
در آبجکت SMPT متدی تعبیه شده به نام sendmail که اغلب، توسعه دهنده با استفاده از آن کار عملیات ارسال پیغام مورد نظر را به انجام می رساند. متد نام برده در کل سه پارامتر ورودی دریافت می کند که به شرح زیر می باشند :
مثال :
در زیر یک اسکریپت ساده پایتون را مشاهده می کنید که ایمیلی را ارسال می کند.
#!/usr/bin/python import smtplib sender = 'from@fromdomain.com' receivers = ['to@todomain.com'] message = """From: From Person <from@fromdomain.com> To: To Person <to@todomain.com> Subject: SMTP e-mail test This is a test e-mail message. """ try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message) print "Successfully sent email" except SMTPException: print "Error: unable to send email" </to@todomain.com></from@fromdomain.com>
در تمرین جاری، یک ایمیل ساده داخل متغیر message و کوتیشن سه تایی درج گردید و همان طور که می بینید، هدرها به روش صحیح فرمت دهی شده اند. هر ایمیل، سه هدر به ترتیب From ،To و Subject که به وسیله ویرگول از هم و به وسیله خط سفید از بدنه پیغام جدا شده اند را شامل می شود.
به منظور ارسال ایمیل، ابتدا با استفاده از smtpObj به SMPT Server (سرویس دهنده ی سرور) مستقر بر روی دستگاه محلی (local) وصل شوید، سپس متد sendmail را فراخوانی کرده و پیغام، آدرس فرم و آدرس مقصد را به عنوان پارامتر به این متد ارسال نمایید (اگرچه فرم و آدرس داخل خود ایمیل گنجانده شده، با این حال از این مقدارها همیشه برای آدرس دهی یا route ایمیل استفاده نمی شود).
چنانچه شما برای ارسال ایمیل از SMPT Server که بر روی دستگاه شما (local) شما نصب و اجرا شده، استفاده نمی کنید، در آن صورت می توانید با استفاده از smtplib client به یک سرور SMPT راه دور متصل شوید. برای این منظور لازم است ارائه دهنده ی ایمیل جزئیات و اطلاعات mail server خروجی دهنده را در اختیار شما قرار داده باشد و شما نیز آن ها را به صورت زیر بکار ببرید، مگر اینکه برای ارسال ایمیل از یک سرویس آماده همچون Hotmail و Yahoo استفاده نمایید که در آن صورت نیازی به این اطلاعات نیست.
smtplib.SMTP('mail.your-domain.com', 25)
زمانی که توسعه دهنده یک پیغام متنی را با استفاده از Python ارسال می کند، تمامی محتوای فایل به عنوان متن ساده در نظر گرفته می شود. به عبارت دیگر حتی اگر تگ های HTML را در پیغام متنی بگنجانید، باز هم محتوای فایل به صورت متن ساده نمایش داده شده و تگ های HTML بر اساس گرامر زبان نشانه گذاری HTML فرمت دهی نمی شوند. پایتون امکانی را در اختیار توسعه دهنده قرار می دهد که به واسطه ی آن می توان یک پیغام HTML را به صورت یک فایل واقعی HTML ارسال کرد.
به هنگام ارسال یک ایمیل، می توان نوع فایل (Mime version)، نوع محتوا و مجموعه کاراکتری که باید به صورت یک ایمیل HTML ارسال شود را مشخص نمایید.
مثال :
در زیر کدی را مشاهده می کنید که محتوایی با فرمت HTML را به صورت ایمیل ارسال می کند :
#!/usr/bin/python import smtplib message = """From: From Person <from@fromdomain.com> To: To Person <to@todomain.com> MIME-Version: 1.0 Content-type: text/html Subject: SMTP HTML e-mail test This is an e-mail message to be sent in HTML format <b>This is HTML message.</b> <h1>This is headline.</h1> """ try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message) print "Successfully sent email" except SMTPException: print "Error: unable to send email" </to@todomain.com></from@fromdomain.com>
جهت ارسال ایمیل با محتوای مختلط، لازم است مقدار هدر Content-type را برابر multipart/mixed قرار دهید. پس از آن، متن و محتوای الصاقی (attachment) را در boundaries دقیقا اعلان کنید. برای تعریف boundary، دو خط تیره (هایفن) و یک عدد منحصربفرد درج کنید که این بخش نباید در بدنه ی ایمیل یا بخش پیغام ظاهر شود. سپس یک boundary نهایی درج می کنید که نشانگر بخش پایانی ایمیل بوده و باید به دو خط تیره ختم شود. فایل های الصاق شده باید قبل از ارسال، به وسیله ی تابع pack("m") بر مبنای الگوریتم و روش کدگذاری base64 رمزنگاری شوند.
مثال :
در مثال زیر، فایل /tmp/test.txt به عنوان محتوای الصاقی همراه با ایمیل ارسال می شود :
#!/usr/bin/python import smtplib import base64 filename = "/tmp/test.txt" # Read a file and encode it into base64 format fo = open(filename, "rb") filecontent = fo.read() encodedcontent = base64.b64encode(filecontent) # base64 sender = 'webmaster@tutorialpoint.com' reciever = 'amrood.admin@gmail.com' marker = "AUNIQUEMARKER" body =""" This is a test email to send an attachement. """ # Define the main headers. part1 = """From: From Person <me@fromdomain.net> To: To Person <amrood.admin@gmail.com> Subject: Sending Attachement MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=%s --%s """ % (marker, marker) # Define the message action part2 = """Content-Type: text/plain Content-Transfer-Encoding:8bit %s --%s """ % (body,marker) # Define the attachment section part3 = """Content-Type: multipart/mixed; name=\"%s\" Content-Transfer-Encoding:base64 Content-Disposition: attachment; filename=%s %s --%s-- """ %(filename, filename, encodedcontent, marker) message = part1 + part2 + part3 try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, reciever, message) print "Successfully sent email" except Exception: print "Error: unable to send email" </amrood.admin@gmail.com></me@fromdomain.net>
با دیگر مقاله های ما در زمینه آموزش پایتون همراه ما باشید...