
ارسال ایمیل یکی از کاربردهایی است که با وجود شبکه ها و اینترنت استفاده گسترده ای از آن میشود. در این مقاله یاد میگیریم چطور در پایتون یک ایمیل ارسال کنیم. این ارسال با استفاده از پروتکیل SMTP
بوده و میتواند انواع مختلفی نظیر متن ساده، متن همراه با فایل ضمیمه و محتوای ایمیلی از نوع HTML
باشد.
فهرست محتوای آموزش
پروتکل SMTP چیست ؟
SMTP یا Simple Mail Transfer Protocol یکی از پروتکل های TCP/IP برای ارسال و دریافت ایمیل (نامه های الکترونیکی) است. این پروتکل امکان ذخیره سازی نامه ها را روی یک سرور یا دانلود آنها از سرور را فراهم میکند. به طور کاربردی تر میتوان گفت از پروتکل SMTP میتوان برای ارسال ایمیل و مدیریت آنها بین سرورهای مختلف استفاده کرد.
استفاده از SMTP در پایتون
در پایتون یک ماژول به نام smtplib
وجود دارد که با استفاده از آن میتوان عملیات ارسال ایمیل را انجام داد.
با استفاده از این ماژول اطلاعاتی که در یک ارتباط و نشست با سرور سرویس دهنده ایمیل نیاز داریم را به صورت یک شئ نگهداری کرده و از آن ها برای ارسال ایمیل از طریق آن سرور استفاده خواهد کرد.
با استفاده از این ماژول خواهیم توانست ایمیل خود را با کمک سرور سرویس دهنده ای که دارای سرویس SMTP یا ESMTP باشد ارسال کنیم.
به صورت پیشفرض و با نصب پایتون، این ماژول نیز برایمان وجود خواهد داشت. کافی است آنرا وارد برنامه خود کرده و از آن استفاده کنیم.
import smtplib
حال به صورت زیر میتوان یک شئ برای اتصال به سرور سرویس دهنده ایجاد کرد.
server = smtplib.SMTP(host="SERVER_ADDRESS", port="SERVER_PORT")
پورت پیشفرض SMTP شماره 25 است اما بسته به سرویس دهنده ایمیل، میتواند هر عدد دیگری باشد.
به صورت ساده تر میتوان مقادیر فوق را به صورت یک رشته به سازنده داد.
server = smtplib.SMTP("SERVER_ADDRESS:SERVER_PORT")
همانطور که میبینید میتوان یک رشته با ساختار استاندارد آدرس:پورت به جایی تعیین دو مقدار به صورت مجزا تعریف کرد.
ارسال ایمیل متنی در پایتون
برای ارسال ایمیل از طریق پروتکل SMTP در پایتون میتوان مراحل زیر را انجام داد.
- ایجاد یک شئ
SMTP
برای ارتباط با سرور - وارد شدن به حساب کاربری ایمیل
- تعریف اطلاعات پیام و گواهی نامه های تایید هویت
- ایجاد یک شئ پیام چندگانه (
MIMEMultipart
) و الصاق اطلاعات ایمیل به آن (نظیر فرستنده، گیرنده و …) - الصاق متن محتوای ایمیل به شئ پیام
- ارسال ایمیل
در ادامه تک تک مراحل فوق را برای ارسال یک ایمیل انجام خواهیم داد.
ابتدا ماژول های مورد نیاز و کلاس های آنها را به برنامه خود اضافه میکنیم.
from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import smtplib
سپس یک شئ پیام ایجاد میکنیم تا بتوانیم اطلاعات مربوط به پیام را به آن اضافه کنیم.
msg = MIMEMultipart()
حال پارامترهای مربوط به ایمیل را تنظیم میکنیم. پارامترهای زیر، پارامترهای اصلی برای ارسال یک ایمیل هستند. اطلاعاتی نظیر رمز عبور حساب ایمیل، نام کاربری (آدرس ایمیل)، آدرس مقصد و عنوان پیام.
password = "EMAIL_PASSWORD" msg['From'] = "YOUR_EMAIL" msg['To'] = "RECIEVER_EMAIL" msg['Subject'] = "EMAIL_SUBJECT"
میتوان اطلاعات دیگری را نیز در این بخش تنظیم کرد؛ نظیر آدرس دریافت پاسخ (reply_to) یا …
تعریف متن ایمیل
حال یک متن تستی آماده کرده و آنرا با استفاده از تابع attach به پیام خود ضمیمه میکنیم.
message = "Hello, This is a test from SabzElco!" msg.attach( MIMEText(message, 'plain') )
برقراری ارتباط با سرور سرویس دهنده
اکنون آدرس سرور و پورت سرویس دهنده را مشخص کرده و با متد starttls()
سعی میکنیم یک ارتباط ایمن https با سرور برقرار کنیم.
server = smtplib.SMTP('smtp.server.com: 25') server.starttls()
همزمان با برقراری ارتباط https با سرور، اطلاعاتی که مرتبط با این ارتباط است (نظیر گواهی نامه ها یا credentials) در شئ server
ذخیره شده و در ارسال درخواست های بعدی مورد استفاده قرار خواهد گرفت.
ورود به حساب کاربری
حال تلاش میکنیم با استفاده از نام کاربری و رمزعبور خود به حساب کاربریمان در سرویس دهنده متصل شویم.
server.login(msg['From'], password)
در صورتی که خطایی تا کنون دریافت نکرده اید، به شما تبریک میگویم! شما با موفقیت به سرور سرویس دهده متصل شده اید.
اکنون نوبت ارسال ایمیل است!
ارسال ایمیل
تابعی با نام sendmail()
در شئ server
وجود دارد که سه پارامتر اصلی دریافت میکند.
- پارامتر اول، مشخص کننده ارسال کننده ایمیل
- پارامتر دوم، مشخص کننده دریافت کننده ایمیل (آدرس مقصد)
- پارامتر سوم، یک رشته که حاوی اطلاعات ایمیل است. (header ها و متن ایمیل)
server.sendmail( msg['From'], msg['To'], msg.as_string() )
با صدا زدن این متد، در صورتی که خطایی دریافت نکنید، ارسال ایمیل با موفقیت انجام شده است.
در نهایت با صدا زدن متد quit()
تمام اطلاعات مربوط به اتصال و حساب کاربری را حذف میکنیم.
server.quit()
توجه داشته باشید که آدرس فرستنده و گیرنده را علاوه بر اینکه در متد ارسال ایمیل تعریف کردیم، به عنوان سرآیند (header) ایمیل نیز در قسمت متنی ایمیل وارد کرده بودیم.
کد برنامه ارسال ایمیل با پایتون
به طور خلاصه، فرآیند ارسال یک ایمیل متنی ساده در پایتون به صورت زیر خواهد بود.
from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import smtplib msg = MIMEMultipart() password = "EMAIL_PASSWORD" msg['From'] = "YOUR_EMAIL" msg['To'] = "RECIEVER_EMAIL" msg['Subject'] = "EMAIL_SUBJECT" message = "Hello, This is a test from SabzElco!" msg.attach( MIMEText(message, 'plain') ) server = smtplib.SMTP('smtp.server.com: 25') server.starttls() server.login(msg['From'], password) server.sendmail( msg['From'], msg['To'], msg.as_string() ) server.quit()
ارسال ایمیل با فایل ضمیمه در پایتون
فرآیند ارسال یک فایل به صورت ضمیمه همراه با متن ایمیل کاملاً مشابه ارسال ایمیل متنی معمولی است. با این تفاوت که باید فایل را خوانده و آنرا به فرمت MIME تبدیل کنیم. فرمت MIME مربوط به تصاویر با کلاس MIMEImage
شناخته میشود.
ابتدا این کلاس را به برنامه خود وارد میکنیم.
from email.MIMEImage import MIMEImage
حال پس از ضمیمه کردن متن ایمیل، به طور مشابه، یک فایل تصویر با نام picture.jpg
را نیز ضمیمه ایمیل میکنیم.
msg.attach( MIMEImage( file("picture.jpg").read() ) )
باقی کارهای مورد نیاز برای ارسال ایمیل، مشابه قبل خواهد بود!
فرمت های مختلفی برای MIME وجود دارد که میتوانیم از کلاس مربوط به آن برای ضمیمه کردن فایل هایی با دیگر فرمت ها استفاده کرد. کلاس هایی نظیر MIMEMessage
یا MIMEAudio
ارسال ایمیل با قالب HTML
گاهی اوقات نیاز داریم برای زیباتر شدن ساختار ایمیل خود، از قالب های HTML استفاده کنیم. فرآیند ارسال ایمیل با قالب HTML نیز تقریبا مشابه ارسال ایمیل متنی است؛ با مقداری تفاوت!
ابتدا باید قالب HTML خود را برای ارسال ایمیل آماده کنیم. از آنجا که این مسئله خارج از بحث آموزش ماست، فرض میکنیم ساختار ساده زیر را برای ارسال داریم.
<html> <head> <title>عنوان پیام</title> </head> <body> <h1>این یک عنوان آزمایشی از سایت تخصصی الکترونیک و کامپیوتر است!</h1> <p>یک پاراگراف آزمایشی در قالب ایمیل</p> </body> </html>
ارسال ایمیل در پایتون
ابتدا بایستی ماژول های مورد نیاز برای ارسال ایمیلرا به برنامه خود اضافه کرد.
import smtplib import email.message
حال محتوای ایمیل را مشخص میکنیم.
Email_content = """ <html><head> <title>عنوان پیام</title> </head><body> <h1>این یک عنوان آزمایشی از سایت تخصصی الکترونیک و کامپیوتر است!</h1> <p>یک پاراگراف آزمایشی در قالب ایمیل</p> </body></html> """
سپس باید یک شئ برای پیام ایجاد کنیم. اطلاعات مربوط به حساب کاربری را نیز برای آن تعریف میکنیم.
msg = email.message.Message() msg['Subject'] = "ارسال ایمیل با قالب خاص" msg['From'] = "YOUR_EMAIL" msg['To'] = "RECIEVER_EMAIL" password = "EMAIL_PASSWORD"
بخشی متفاوت کار ما اینجاست! به عنوان یک سرآیند (header) برای پیام ارسالی، مشخص میکنیم که نوع محتوای ما HTML است.
msg.add_header('Content-Type', 'text/html')
و پس از آن محتوای ایمیل را به پیام می چسبانیم. (ضمیمه میکنیم)
msg.set_payload(email_content)
سایر کارها مشابه قبل است. یک شئ برای برقراری ارتباط با سرور ایجاد میکنیم. وارد حساب کاربری خود شده و اقدام به ارسال پیام خود میکنیم.
server = smtplib.SMTP('smtp.server.com:25') server.starttls() server.login( msg['From'], password ) server.sendmail( msg['From'], msg['To'], msg.as_string() )
خلاصه مقاله
در این مقاله آموزشی دیدیم که چطور با استفاده از ماژول smtplib
پایتون میتوانیم به راحتی یک ایمیل ارسال کنیم. برای ارسال ایمیل در پایتون ابتدا باید به سرور سرویس دهنده متصل شده و پس از احراز هویت، اقدام به ارسال ایمیل کنیم.
همچنین میتوان همراه با ایمیل خود فایل هایی را به عنوان ضمیمه ارسال کرد. و محتوای ایمیل ارسالی را به صورت قالب HTML تعریف کرد.
این آموزش برای همیشه رایگانه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
میخوام یه نوشیدنی مهمونتون کنم
سلام من کد را اجرا کردم اما با این خطا مواجه شدم
اگر امکانش هست راهنماییم کنید
سلام
شما باید آدرس smtp سرویسدهندهای که میخواید از طریقش ایمیل بفرستید رو جایگزین کنید. دقیقا همینجایی که توی خط یکی به آخر در اروری که فرستادید مشخص کرده.
مثلاً اگه قراره از gmail استفاده کنید، باید آدرس و پورت smtp server مربوط به gmail رو بذارید و همینطور سایر سرویسدهندهها.
ممنون
پس یعنی به جای smtp server.com
ایمیلی که قراره باهاش ارسال کنم رو بنویسم؟
نه! شما هر ایمیلی که میگیرید یه سرور داره که کارهای مربوطهاش رو مدیریت میکنه. مثلا اگه از gmail میگیرید، سرورهای gmail هستن، اگه یاهو، از yahoo هست. حالا موقع ارسال ایمیل شما باید به این سرور وصل بشید. هر سرویسدهندهای مشخصاتش (server و port) متفاوت هست و باید ببینید سرویسدهندهی ایمیل شما سرور smtpـش چه مشخصاتی داره که اینجا وارد کنید.
درود و خسته نباشید
من اون کدی که در همین صفحست و بالاش زده “کد برنامه ارسال ایمیل با پایتون”، رو اجرا کردم این خطا واسم اومد:
در حالی که پسورد و ایمیلش درسته! ممنون میشم راهنماییم کنید دلیلش چی میتونه باشه!؟
سلام
ممکنه به خاطر بعضی از مسائل امنیتی از سمت جیمیل باشه. ممکنه تأیید دو مرحلهای برای ورود تعریف کرده باشید یا از تنظیماتش اجازه اتصال ابزارهای شخص ثالث رو منع کرده باشید.
همون لینکی که داده رو ببینید. چند مرحله پیشنهاد داده که انجام بدید. به ترتیب پیش برید احتمالاً مشکلتون رفع بشه.
سلام
بنده این کار کردم الان میخوام روی سرور بزارمش خواستم از هروکو استفاده کنم ولی ویدویی راجبش پیدا نکردم.میشه بگید که چطور رو سرور بزارم؟
ممنون
سلام
تجربهای در کار با heroku ندارم! اگر بتونید یک کد پایتون رو روی اون اجرا کنید، کدهای دیگه تفاوتی ندارند.
الآن دو مانع به ذهنم میرسه که پیشنهاد میکنم بررسی کنید: 1. امکان برقراری ارتباط smtp در هروکو نباشه یا محدود باشه. 2. ارتباط هروکو با سرور میزبان ایمیل به درستی برقرار نمیشه.
سلام مجدد
بله بلدم بات تلگرام را روی هروکو بزارم اما ایمل نه، ی لینکی دارم که دیپلوی ایمل را توضیح میده ولی متوجه نمیشم چی میگه .اگر شما متوجه میشید اینو به زبان ساده توضیح بدیدن سپاس
لینک مرتبط:blog.heroku.com/tech_sending_email_with_gmail
راهنمایی که فرستادید برای اتصال به جیمیل با smtp با زبان روبی هست! مربوط به پایتون نیست.
مشابه ربات تلگرام اگه عمل کنید نباید مشکلی وجود داشته باشه. پیشنهاد میکنم برنامه رو به صورت خط به خط اضافه کنید و تست بگیرید ببینید جایی خطایی یا مشکلی وجود داره یا نه.
ممنون از اینکه پاسخ میدهید.
برنامه ای که من درست کردم در واقع وب اسکرپینگ هستش و نیازمند حلقه whil هستش الان من برنامه خودم را روی بات اجرا کردم کار میکند اما نمیدانم این whil رو کجا بگذارم تا وب گردی مثلا هر 4 ساعت یکبار انجام بشه.
ممنون میشم اگر نظری دارید ان را به اشتراک بگذارید.
اگر صلاح میدونید خصوصی ایمیل بدید تا کد را انجا برای شما بفرستم.
یک کار ساده استفاده از
sleep()
که در کار با زمان پایتون معرفی شده؛ یکم حرفهایتر استفاده از کتابخونه sched هست.اگر دوست دارید کارتون بیشتر حرفهای بشه، از چند پردازشی پایتون هم میتونید استفاده کنید.
موفق باشید.
نمیشه با ایمیل یه نفر دیگه پیام فرستاد؟ ممنون
در حالت عادی با ارسال ایمیل SMTP در پایتون نمیتونید! چون به نوعی باید متصل بشید به حساب ایمیل مورد نظر. اما سرویسهایی هستند که غیر مجاز، اما بهتون امکان میدن با یه آدرس ساختگی ارسال رو انجام بدید؛ البته احتمال اسپم شدن یا تأیید نشدنش در مقصد وجود داره.
سلام ببخشید این سرویس های غیرمجاز که گفتید چی هستن دقیقا؟
سلام
در مجموع اگه یه mail server (سرور ایمیل) معمولی داشته باشید (یا حتی یه هاست)، میتونید ایمیلی با آدرس دلخواه و حتی دامنه دیگه ارسال کنید! البته بعضی سرورها جلوی ارسال از دامین دیگه رو میگیرن و اگه هم نگیرن، ممکنه توی سرویس گیرنده اسپم بشه.
حالا ممکنه سایتهایی بیان api یا سرویسهایی رو برای این کار در اختیارتون بذارن که از سرور اونها برای ارسال استفاده کنید.
با استفاده از سرورهای مجازی هم میشه؟
سلام
بله. باید یک سرویس ارسال ایمیل (که معروف به mail server هست) متناسب با سیستم عاملتون رو نصب کنید تا امکان ارسال ایمیل باشه.