آموزش پایتون - ارسال ایمیل با SMTP
پروتکل انتقال ساده نامه (SMTP) یک پروتکل است که وظیفه ارسال ایمیل و مسیریابی ایمیل بین سرورهای ایمیل را بر عهده دارد.
پایتون ماژول smtplib را ارائه می دهد که یک شیء جلسه SMTP مشتری را تعریف می کند که می توان برای ارسال ایمیل به هر ماشین اینترنت با یک ناظر SMTP یا ESMTP استفاده کرد.
در اینجا یک نحو ساده برای ایجاد یک شیء SMTP آورده شده است که می تواند بعداً برای ارسال ایمیل استفاده شود:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
اینجا جزئیات پارامترها آورده شده است:
-
host — این میزبان سرور SMTP شما است. می توانید آدرس IP میزبان یا نام دامنه مانند tutorialspoint.com را مشخص کنید. این یک آرگومان اختیاری است.
-
port — اگر آرگومان host را ارائه می دهید، باید یک پورت را مشخص کنید که سرور SMTP در آن در حال گوش دادن است. معمولاً این پورت 25 خواهد بود.
-
local_hostname — اگر سرور SMTP شما در ماشین محلی شما در حال اجرا است، می توانید فقط localhost را به عنوان این گزینه مشخص کنید.
یک شیء SMTP دارای یک متد نمونه به نام sendmail است که معمولاً برای انجام کار ارسال پیام استفاده می شود. این سه پارامتر می گیرد:
-
The sender — یک رشته با آدرس فرستنده.
-
The receivers — یک لیست از رشته ها، یکی برای هر گیرنده.
-
The message — یک پیام به عنوان یک رشته که به صورت مشخص شده در RFC های مختلف فرمت شده است.
مثال
اینجا یک راه ساده برای ارسال یک ایمیل با استفاده از اسکریپت پایتون آورده شده است. آن را امتحان کنید:
#!/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"
اینجا، یک ایمیل ساده را در message قرار داده اید، با استفاده از یک نقل قول سه گانه، با دقت به فرمت کردن headers. یک ایمیل نیاز به یک From، To، و Subject header دارد، که از بدن ایمیل با یک خط خالی جدا شده است.
برای ارسال ایمیل از smtpObj برای اتصال به سرور SMTP در ماشین محلی استفاده می کنید و سپس از متد sendmail همراه با message، آدرس فرستنده و آدرس مقصد به عنوان پارامترها استفاده می کنید (حتی اگر آدرس های فرستنده و گیرنده در ایمیل خود باشند، اینها همیشه برای مسیریابی ایمیل استفاده نمی شوند).
اگر شما یک سرور SMTP را در ماشین محلی خود اجرا نمی کنید، می توانید از مشتری smtplib برای ارتباط با یک سرور SMTP راه دور استفاده کنید. مگر اینکه شما از یک سرویس ایمیل مبتنی بر وب استفاده می کنید (مانند Hotmail یا Yahoo! Mail)، ارائه دهنده ایمیل شما باید جزئیات سرور ایمیل خروجی را که می توانید آنها را ارائه دهید، در اختیار شما قرار داده باشد، به شرح زیر:
smtplib.SMTP('mail.your-domain.com', 25)
ارسال ایمیل HTML با استفاده از پایتون
هنگامی که یک پیام متنی را با استفاده از پایتون ارسال می کنید، تمام محتوا به عنوان متن ساده تلقی می شود. حتی اگر برچسب های HTML را در یک پیام متنی قرار دهید، به عنوان متن ساده نمایش داده می شود و برچسب های HTML طبق نحو HTML فرمت نمی شوند. اما پایتون گزینه ای برای ارسال یک پیام HTML به عنوان پیام HTML واقعی ارائه می دهد.
در حین ارسال یک پیام ایمیل، می توانید یک نسخه Mime، نوع محتوا و مجموعه کاراکترها را برای ارسال یک ایمیل 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"
ارسال پیوست ها به عنوان ایمیل
برای ارسال یک ایمیل با محتوای مخلوط، باید Content-type header را به multipart/mixed تنظیم کنید. سپس، بخش های متنی و پیوست را می توان در 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"