آموزش ارسال ایمیل در پایتون

امیرحسین بیگدلو December 2023

در این ویدیو با نحوه ارسال ایمیل با پایتون آشنا خواهید شد. پایتون از ماژول smtplib برای اتصال به سرویس دهندگان ایمیل استفاده میکند. این پکیج جزو کتابخانه استاندارد پایتون بوده و نیاز به نصب ندارد. در این آموزش مواردی مثل ارسال ایمیل متنی ساده با پایتون، ارسال فایل ضمیمه در ایمیل با پایتون و ارسال قالب html در ایمیل با پایتون و اتصال به سرور smtp برای ارسال ایمیل با پایتون را یاد میگیرید.

 

ما به راحتی می توانیم فرآیند ارسال ایمیل با استفاده از پایتون را خودکار کنیم. ارسال ایمیل با پایتون زمانی مفید است که بخواهید محتوای مشابه را بارها و بارها ارسال کنید. این اتوماسیون می تواند خطاهای انسانی را کاهش دهد و زمان شما را نیز آزاد کند!

 

به عنوان مثال، اگر نیاز دارید لیستی از مخاطبین را بر اساس داده های روزانه جدید به روز کنید، می توانید از پایتون برای ایجاد یک گزارش جدید استفاده کنید و با ارسال ایمیل آن را با آنها به اشتراک بگذارید. یا اگر یک برنامه پایتون دارید که اجرای آن زمان زیادی می برد، می توانید از پایتون بخواهید پس از اتمام کار، یک ایمیل یادآور برای شما ارسال کند.

 

قبل از شروع به ارسال ایمیل با پایتون، باید حساب کاربری گوگل خود را آماده کنید تا بتوانید با پایتون به Gmail وصل شوید.

 

محتویات این صفحه:

آماده کرده حساب کاربری گوگل

ارسال ایمیل متنی با پایتون

استفاده از SMTP برای ارسال ایمیل با پایتون

استفاده از SMTP_SSL برای ارسال ایمیل با پایتون

ارسال ایمیل با فایل ضمیمه در پایتون

استفاده از محتوای html برای استایل دهی ایمیل

 

 #  آماده کردن حساب کاربری گوگل برای ارسال ایمیل در پایتون

قبل از شروع به ارسال ایمیل با پایتون باید حساب کاربری گوگل را آماده کنید. در این آموزش ما از سرور Gmail برای ارسال ایمیل با پایتون استفاده میکنیم اما همین اصول در مورد سایر سرویس‌های ایمیل نیز صدق می‌کند. دقت کنید که استفاده از سرور Gmail برای زمانی مناسب است که تعداد ایمیل های ارسالی زیاد نباشد. اگر قرار است تعداد زیادی ایمیل برای مصارف تبلیغاتی ارسال کنید، بهتر است از سرویس دهندگان ایمیل پولی استفاده کنید.

 

برای اینکه بتوانید با پایتون به gmail متصل شوید، باید یک app passwords جدید در حساب کاربری گوگل خود ایجاد کنید. برای اینکار وارد تنظیمات حساب کاربری گوگل به آدرس myaccount.google.com شوید:

 

آماده کردن حساب کاربری گوگل برای اتصال به پایتون

 

 

سپس در سمت چپ همین صفحه روی گزینه Security کلیک کنید. در این صفحه کمی به پایین اسکرول کرده تا به بخش Signing in to Google برسید. در این بخش روی گزینه App passwords کلیک کنید:

اتصال به گوگل با پایتون

 

 

در صفحه جدیدی که باز میشود میتوانید یک app بسازید تا پایتون به آن متصل شود. روی گزینه select app کلیک کنید تا یک لیست باز شود. سپس روی گزینه Other(custom name) کلیک کنید:

ارسال ایمیل با اکانت گوگل

 

بعد از کلیک روی گزینه Other بخش جدید ایجاد خواهد شد که باید یک نام به برنامه خود بدهید. میتوانید هر نام دلخواهی انتخاب کنید:

اتصال گوگل به پایتون

 

 

بعد از انتخاب نام مناسب روی دکمه GENERATE کلیک کنید تا یک رمز عبور برای شما ساخته شود. این رمز را یادداشت کنید تا بعدا بتوانیم از آن استفاده کنیم:

رمز عبور اتصال به گوگل

 

حالا حساب کاربری گوگل شما آماده است. میتوانید با پایتون به Gmail وصل شده و ایمیل ارسال کنید.

 

ویدیو پیشنهادی: آموزش duck typing در پایتون

 

 #  ارسال ایمیل متنی با پایتون

قبل از اینکه به ارسال ایمیل با محتوای HTML و فایل ضمیمه بپردازیم، یاد خواهید گرفت که با استفاده از پایتون ایمیل‌های متنی ساده ارسال کنید. پایتون برای ارسال ایمیل از SMTP استفاده میکند. اما پروتکل smtp چیست؟

 

پروتکل smtp مخفف Simple Mail Transfer Protocol به معنی پروتکل ساده انتقال نامه است.  پروتکل smtp روشی است که با استفاده از آن میتوان اقدام به ارسال و دریافت ایمیل کرد. هر سرور smtp دارای یک آدرس است که سرویس گیرنده ایمیل مورد استفاده قرار گیرد. مثلا آدرس سرور Gmail گوگل smtp.gmail.com است.

 

 

هنگامی که ایمیلی را با پروتکل SMTP و میزبانی جیمیل ارسال می کنید، سرور SMTP ایمیل شما را پردازش می کند، تصمیم می گیرد که پیام را به کدام سرور ارسال کند و پیام را به آن سرور ارسال می کند. سپس ارائه‌دهنده خدمات صندوق ورودی گیرنده، مانند Gmail، پیام را دانلود کرده و در صندوق ورودی گیرنده قرار می‌دهد.

 

دو راه برای شروع یک اتصال امن با سرور ایمیل شما وجود دارد:

  • یک اتصال SMTP ناامن راه اندازی کنید که بعد باید با استفاده از starttls رمزگذاری کنید.
  • یک اتصال SMTP که از ابتدا با استفاده از SMTP_SSL ایمن شده است.

 

 

 +  استفاده از SMTP برای ارسال ایمیل با پایتون

در روش اول، ابتدا یک اتصال ناامن با استفاده از کلاس SMTP ایجاد میکنیم که بعدا مجبوریم با استفاده از توابع ehlo و starttls آن را ایمن کنیم. به کد زیر دقت کنید:

import smtplib


EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'amirbig44@gmail.com'
EMAIL_HOST_PASSWORD = 'kn58ln2ylnx2j9'
EMAIL_HOST_PORT = 587

with smtplib.SMTP(EMAIL_HOST, EMAIL_HOST_PORT) as server:
	server.login(EMAIL_HOST_USER, EMAIL_HOST_PASSWORD)
    server.starttls()
	server.ehlo()
	# TODO: sending email

 

در خط اول کد بالا، ماژول smtplib را وارد کرده‌ایم. سپس اطلاعاتی که برای اتصال به Gmail داریم را در چهار متغیر پایتون ذخیره میکنیم. چهار متغیر بالا به ترتیب زیر هستند:

  1. سرور smtp که قرار است به آن متصل شویم. در گوگل این مقدار smtp.gmail.com است اما در سرویس دهندگان دیگر متفاوت است.
  2. کاربری که قرار است از حسابش ایمیل ارسال کنیم.
  3. رمز عبوری که در بخش app password ایجاد کردیم.
  4. پورتی سرور به ما اجازه دسترسی میدهد. درمورد گوگل این عدد 587 است اما برای دیگر سرویس دهندگان ممکن است متفاوت باشد.

 

بعد از مشخص کردن اطلاعات اتصال، با استفاده از کلمه کلیدی with یک context manager باز کرده و داخل آن از کلاس SMTP استفاده میکنیم. این کلاس مقادیر هاست و پورت هاست را نیاز دارد. دلیل اینکه این اتصال را با یک context manage برقرار کردیم اینست که میخواهیم بعد از اتمام عملیات، اتصال به سرور Gmail به صورت اتوماتیک بسته شود.

 

مرحله بعد لاگین کردن در سرویس Gmail است. برای استفاده از سرویس دهندگان ایمیلی که نیاز به اعتبارسنجی کاربر دارند، میتوانید از تابع login استفاده کنید. این تابع دو مقدار کاربر و رمز عبور را گرفته و کاربر را اعتبارسنجی میکند.

 

در آخر با تابع starttls اتصال خود را رمزگذاری میکنیم تا یک اتصال ایمن ایجاد شود و با استفاده از تابع ehlo خودمان را به عنوان کاربر معتبر معرفی میکنیم. این تابع به صورت اتوماتیک توسط پایتون صدا زده میشود و میتوانید آن را ننویسید.

 

حالا نوبت ارسال ایمیل با پایتون است. برای ارسال ایمیل باید از تابع sendmail استفاده کنید:

with smtplib.SMTP(EMAIL_HOST, EMAIL_HOST_PORT) as server:
	server.login(EMAIL_HOST_USER, EMAIL_HOST_PASSWORD)
	server.starttls()
	server.sendmail(EMAIL_HOST_USER, 'mongard.amir@gmail.com', 'Hello Python!')

 

تابع sendmail که برای ارسال ایمیل با پایتون استفاده میشود، سه مقدار ایمیل مبدا، ایمیل مقصد و پیغام ارسالی را میگیرد. بعد از اجرا کردن کد بالا، کدتان نباید هیچ خروجی داشته باشد و ایمیل با موفقیت ارسال شود.

 

ویدیو پیشنهادی: آموزش درک ترتیب اجرا کدها در پایتون

 

 +  استفاده از SMTP_SSL برای ارسال ایمیل با پایتون

روش دوم برای ایجاد اتصال، استفاده مستقیم از SMTP_SSL است که از ابتدا یک اتصال ایمن بوده و نیازی به اضافه کرده رمزگذاری ندارد. به کد زیر دقت کنید:

with smtplib.SMTP_SSL(EMAIL_HOST, EMAIL_HOST_PORT) as server:
	server.login(EMAIL_HOST_USER, EMAIL_HOST_PASSWORD)
	server.sendmail(EMAIL_HOST_USER, 'mongard.amir@gmail.com', 'Hello Python!')

 

در کد بالا دیگر نیازی به توابعی مانند ehlo یا starttls نداریم و مستقیما بعد از login میتوانید ایمیل را ارسال کنید.

 

 

 #  ارسال ایمیل با فایل ضمیمه در پایتون

پایتون یک پکیج داخلی به نام email دارد که از آن برای ساختاردهی به ایمیل ها استفاده میشود. با این پکیج میتوانید ایمیل هایتان را با کدهای html استایل دهید و یا به ایمیلتان فایل ضمیمه اضافه کنید. این پکیج به چند بخش مختلف تقسیم میشود. بخشی که ما به آن نیاز داریم بخش message است.

 

به کد زیر دقت کنید:

import smtplib
from email.message import EmailMessage


EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'amirbig44@gmail.com'
EMAIL_HOST_PASSWORD = 'kn58ln2ylnx2j9'
EMAIL_HOST_PORT = 587

msg = EmailMessage()
msg['Subject'] = 'Greeting'
msg['From'] = EMAIL_HOST_USER
msg['To'] = 'mongard.amir@gmail.com'
msg.set_content('Thank you python!')

with smtplib.SMTP_SSL(EMAIL_HOST, EMAIL_HOST_PORT) as server:
	server.login(EMAIL_HOST_USER, EMAIL_HOST_PASSWORD)
	server.send_message(msg)

 

در کد بالا بعد از وارد کردن کلاس EmailMessage، یک آبجکت جدید به نام msg از این کلاس میسازیم. مواردی که نیاز است در آبجکت msg مشخص کنید به ترتیب، موضوع، فرستنده، گیرنده و متن ایمیل است. دقت کنید که برای اضافه کردن متن ایمیل از تابع set_content استفاده کرده ‌ایم. از آنجایی که در حال ارسال یک message هستید باید از تابع send_message استفاده کنید برای ارسال ایمیل استفاده کنید.

 

در پکیج email تابعی به نام add_attachment وجود دارد که برای اضافه کرده فایل ضمیمه به ایمیل استفاده میشود.

 

به کد زیر دقت کنید:

with open('logo.png', 'rb') as f:
	file_data = f.read()
	file_name = f.name

msg.add_attachment(file_data, maintype='image', subtype='png', filename=file_name)

with smtplib.SMTP_SSL(EMAIL_HOST, EMAIL_HOST_PORT) as server:
	server.login(EMAIL_HOST_USER, EMAIL_HOST_PASSWORD)
	server.send_message(msg)

 

در کد بالا، ابتدا یک تصویر png را در حالت خواندن باینری باز کرده و محتوای آن را در متغیر file_data و نام تصویر را در متغیر file_name ذخیره میکنیم.

 

سپس با استفاده از تابع add_attachment فایل را به ایمیل اضافه میکنیم. در این تابع ابتدا محتویات فایل و سپس به ترتیب نوع اصلی فایل، پسوند فایل و نام فایل را ارسال کرده ایم. حالا میتوانید با پایتون ایمیل هایی ارسال کنید که در آن فایل ضمیمه وجود دارد.

 

 

 #  استفاده از محتوای html برای استایل دهی ایمیل در پایتون

آخری موردی که در مورد ارسال ایمیل با پایتون نیاز است بدانید، نحوه ارسال ایمیل با محتوای html است. این روش برای ایمیل های تبلیغاتی یا خبرنامه مناسب است که در آن نیاز است قالب ایمیل را استایل دهی کنید. دقت کنید که در زمان ارسال ایمیل هایی با محتوای html بهتر است که متن ایمیل را به شکل متن ساده نیز داشته باشید. چون برخی افراد قابلیت html را در ایمیل غیرفعال میکنند.

 

به کد زیر دقت کنید:

msg.set_content('This is a plain text email!')
msg.add_alternative("""
<body>
	<p><b> This is styled email! </b></p>
</body>
""", subtype='html')

 

در کد بالا، از تابع add_alternative برای ارسال ایمیلی با محتوای html استفاده کردیم. اگر قرار است محتوای ایمیل خود را استایل دهی کنید یا میخواهید هر گونه تصویر، لینک یا محتوای پاسخگو را اضافه کنید، HTML بسیار مفید است.

ویدیوهای مشابه



ماژول atexit پایتون
امیرحسین بیگدلو

ارسال نظر


مهدی

9 ماه قبل پاسخ به نظر

سلام برای من توی حساب گوگل بخش اپ پسورد نیست

ارسال نظر



امیرحسین بیگدلو

9 ماه قبل

سلام
اعتبارسنجی دو مرحله رو فعال کن

مصطفی

1 سال قبل پاسخ به نظر

سلام
آیا ارسال هشدار پیام با پایتون آموزش دارید من گشتم توسایت خوبتون نبود

ارسال نظر



امیرحسین بیگدلو

1 سال قبل

سلام
منظورتون از هشدار پیام چیه؟


مصطفی

1 سال قبل

مثل ارسال ایمیل بتونیم پیام ارسال کنیم مثلا مرکز پیام کاوه نگار باشه همچین چیزی


امیرحسین بیگدلو

1 سال قبل

ارسال پیامک رو توی دوره‌های جنگو توضیح دادم

علی معصومیان

1 سال قبل پاسخ به نظر

ممنون از آموزش خوبتون مشکلم رو حل کرد .♥♥♥♥

ارسال نظر



ali

1 سال قبل پاسخ به نظر

سلام.
من کدهای بالا را دقیق می زنم ولی خطای
ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:997)
می ده.

به خاطر وضعیت نت هست که اینجوری؟؟؟؟

ارسال نظر



امیرحسین بیگدلو

1 سال قبل

سلام
نمیدونم


Md

1 سال قبل

منم همین ارورو دارم

mohammad

1 سال قبل پاسخ به نظر

سلام ببخشید من هر کاری میکنم به این خطا بر میخورم(socket.gaierror: [Errno 11001] getaddrinfo failed) اگه میشه راهنماییم کنید لطفا...

ارسال نظر



امیرحسین بیگدلو

1 سال قبل

سلام
نمیدونم


علی

7 ماه قبل

آره منم همین مشکلو دارم

مونگارد