FA-TOOLS — Header Component
کدهای آماده برای ارسال ایمیل با پایتون

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

سلام رفیق برنامه‌نویس! اگه دنبال یه راه سریع و مطمئن برای ارسال ایمیل با پایتون هستی، جای درستی اومدی. فرقی نمی‌کنه یه هشدار ساده می‌خوای بفرستی یا یه گزارش کامل با فایل پیوست، پایتون مثل یه چاقوی سوئیسی این کارو برات انجام می‌ده. تو این مقاله، قراره صفر تا صد ارسال ایمیل رو با کدهای آماده و بدون دردسر یاد بگیریم. پس بزن بریم که کدهای پایتونی خفن رو آماده کنیم و ایمیل‌هات رو به پرواز دربیاریم! و اگه به ابزارهای برنامه‌نویسی بیشتر نیاز داری، حتماً یه سر به سایتمون بزن. کلی کدهای آماده پایتون و اسنیپت‌های بدردبخور منتظرته!

🚀 نقشه راه ارسال ایمیل با پایتون در یک نگاه:

  • آماده‌سازی: نصب پایتون و فعالسازی دسترسی SMTP
  • 📧ارسال ایمیل متنی: با ماژول `smtplib`
  • 🎨ارسال ایمیل HTML: برای قالب‌بندی جذاب‌تر
  • 📎ضمیمه کردن فایل: ارسال عکس، PDF و هر فایل دیگه
  • 🔒امنیت: استفاده از SSL/TLS برای ارسال امن
  • トラブルシューティング:عیب‌یابی: حل مشکلات رایج

📞 نیاز به کمک فوری داری؟

همین الان با ما تماس بگیر!

09202232789

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

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

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

پیش‌نیازها و آماده‌سازی اولیه

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

قبل از اینکه وارد دنیای کدنویسی بشیم، باید چند تا مورد رو چک کنی و آماده باشی.

۱. نصب پایتون

اگه پایتون رو هنوز نصب نکردی، می‌تونی از سایت رسمی python.org آخرین نسخه رو دانلود و نصب کنی. معمولاً پایتون ۳.x برای این کار عالیه.

۲. راه‌اندازی SMTP سرور (مثلاً جیمیل)

برای ارسال ایمیل، نیاز به یه سرور SMTP (Simple Mail Transfer Protocol) داری. جیمیل یکی از محبوب‌ترین و در دسترس‌ترین گزینه‌هاست. برای استفاده از جیمیل به عنوان سرور SMTP، باید دسترسی برای برنامه‌های کمتر امن (Less Secure App Access) رو فعال کنی یا رمز عبور برنامه (App Password) بسازی. روش دوم که استفاده از App Password هست، امن‌تره و گوگل هم بیشتر توصیه می‌کنه.

💡 نکته مهم: فعال کردن “Less Secure App Access” توصیه نمی‌شه چون امنیت حساب گوگل شما رو پایین میاره. بهتره از قابلیت “App Password” استفاده کنی. برای این کار، به تنظیمات امنیتی حساب گوگل خودت برو، تأیید دو مرحله‌ای رو فعال کن و بعد در بخش “App passwords” یه رمز عبور جدید برای اپلیکیشن پایتون خودت بساز. این رمز رو توی کد استفاده می‌کنیم.

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

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

خب، رسیدیم به بخش جذاب ماجرا! پایتون دو تا ماژول داخلی داره که برای ارسال ایمیل حسابی به کمکت میان: smtplib برای ارتباط با سرور SMTP و email برای ساختاردهی ایمیل.


import smtplib
from email.mime.text import MIMEText

# اطلاعات فرستنده و گیرنده
sender_email = "your_email@gmail.com"  # ایمیل فرستنده
receiver_email = "recipient_email@example.com" # ایمیل گیرنده
password = "your_app_password" # رمز عبور برنامه یا رمز عبور جیمیل (اگر Less Secure Apps فعال باشد)

# ساخت محتوای ایمیل
subject = "سلام از پایتون!"
body = "این یک ایمیل تستی است که با پایتون ارسال شده. امیدواریم که به درستی تحویل داده شود."
msg = MIMEText(body, 'plain', 'utf-8') # 'plain' برای متن ساده
msg['Subject'] = subject
msg['From'] = sender_email
msg['To'] = receiver_email

try:
    # اتصال به سرور SMTP جیمیل (با پورت 587 برای TLS)
    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()  # شروع ارتباط امن TLS
    server.login(sender_email, password) # ورود به حساب کاربری

    # ارسال ایمیل
    server.sendmail(sender_email, receiver_email, msg.as_string())
    print("ایمیل با موفقیت ارسال شد!")

except Exception as e:
    print(f"خطا در ارسال ایمیل: {e}")

finally:
    if 'server' in locals() and server:
        server.quit() # بستن ارتباط با سرور

تو این کد، اول اطلاعات فرستنده، گیرنده و رمز عبور رو مشخص می‌کنیم. بعد با MIMEText یه پیام متنی می‌سازیم و جزئیاتی مثل عنوان (Subject)، فرستنده (From) و گیرنده (To) رو بهش اضافه می‌کنیم. مرحله مهم بعدی، اتصال به سرور SMTP جیمیل با پورت 587 و فعال کردن TLS (برای ارتباط امن) هست. بعد از لاگین کردن، ایمیل رو با sendmail ارسال می‌کنیم.

ارسال ایمیل با محتوای HTML

اگه می‌خوای ایمیلت ظاهر قشنگ‌تری داشته باشه، مثلاً فونت‌های مختلف، عکس، لینک‌های قابل کلیک و… می‌تونی از محتوای HTML استفاده کنی. کافیه نوع محتوا رو به 'html' تغییر بدی.


import smtplib
from email.mime.text import MIMEText

sender_email = "your_email@gmail.com"
receiver_email = "recipient_email@example.com"
password = "your_app_password"

subject = "یک ایمیل HTML جذاب از پایتون!"
html_body = """
<html>
    <head></head>
    <body style="font-family: Arial, sans-serif; text-align: right; direction: rtl;">
        <h1 style="color: #3498DB;">سلام دوست من!</h1>
        <p>این یه ایمیل با محتوای <strong>HTML</strong> هست که از طریق پایتون ارسال شده.</p>
        <p>می‌تونی <a href="https://fa-tools.ir/" style="color: #E74C3C; text-decoration: none;">ابزارهای بیشتر</a> رو تو سایت ما ببینی!</p>
        <img src="https://via.placeholder.com/150/2ecc71/ffffff?text=Python" alt="Python Logo" style="width: 150px; height: auto; display: block; margin: 20px 0;">
        <p>موفق باشی!</p>
    </body>
</html>
"""

msg = MIMEText(html_body, 'html', 'utf-8') # 'html' برای محتوای HTML
msg['Subject'] = subject
msg['From'] = sender_email
msg['To'] = receiver_email

try:
    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login(sender_email, password)
    server.sendmail(sender_email, receiver_email, msg.as_string())
    print("ایمیل HTML با موفقیت ارسال شد!")

except Exception as e:
    print(f"خطا در ارسال ایمیل HTML: {e}")

finally:
    if 'server' in locals() and server:
        server.quit()

فقط با تغییر 'plain' به 'html' در شی MIMEText، پایتون می‌فهمه که محتوای شما HTML هست و مرورگر ایمیل هم اونو به درستی رندر می‌کنه.

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

یکی از قابلیت‌های خیلی کاربردی، امکان پیوست کردن فایل‌هاست. مثلاً می‌خوای یه گزارش PDF، یه عکس، یا هر فایل دیگه‌ای رو همراه ایمیلت بفرستی. برای این کار، باید از MIMEMultipart استفاده کنی تا بتونی هم متن و هم فایل رو با هم بفرستی.


import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import os # برای کار با مسیر فایل‌ها

sender_email = "your_email@gmail.com"
receiver_email = "recipient_email@example.com"
password = "your_app_password"

subject = "ایمیل با فایل پیوست از پایتون"
body = "سلام، این ایمیل شامل یک فایل پیوست است."

# ساخت پیام اصلی با MIMEMultipart
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = receiver_email
msg['Subject'] = subject

# اضافه کردن متن ایمیل
msg.attach(MIMEText(body, 'plain', 'utf-8'))

# مسیر فایل پیوست (مطمئن شو که این فایل در کنار کد پایتون شما وجود دارد یا مسیر کامل آن را بده)
# من یه فایل تستی میسازم برای مثال. شما میتونی اسم فایلت رو اینجا بزاری.
attachment_filename = "sample.txt"
with open(attachment_filename, "w", encoding="utf-8") as f:
    f.write("این یک فایل متنی تستی برای پیوست ایمیل است.")

# اضافه کردن فایل پیوست
try:
    with open(attachment_filename, "rb") as attachment:
        # نوع MIME فایل رو مشخص می‌کنیم. 'application/octet-stream' برای فایل‌های نامشخص.
        # می‌تونیم از mimetypes.guess_type هم استفاده کنیم برای دقت بیشتر.
        part = MIMEBase("application", "octet-stream")
        part.set_payload(attachment.read())
    
    encoders.encode_base64(part) # رمزنگاری فایل برای ارسال
    part.add_header(
        "Content-Disposition",
        f"attachment; filename= {attachment_filename}",
    )
    msg.attach(part) # پیوست کردن فایل به پیام اصلی

    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login(sender_email, password)
    server.sendmail(sender_email, receiver_email, msg.as_string())
    print("ایمیل با فایل پیوست با موفقیت ارسال شد!")

except Exception as e:
    print(f"خطا در ارسال ایمیل با فایل پیوست: {e}")

finally:
    if 'server' in locals() and server:
        server.quit()
    if os.path.exists(attachment_filename):
        os.remove(attachment_filename) # حذف فایل تستی

اینجا یه مقدار پیچیدگی بیشتر می‌شه. اول یه شی MIMEMultipart می‌سازیم که می‌تونه چندین بخش رو تو خودش نگه داره. متن ایمیل رو به عنوان یه MIMEText بهش اضافه می‌کنیم. بعد فایل پیوست رو باز می‌کنیم، محتواش رو می‌خونیم و اونو به یه شی MIMEBase تبدیل می‌کنیم. بعد از رمزنگاری با encoders.encode_base64 و اضافه کردن هدر Content-Disposition، فایل رو به پیام اصلی attach می‌کنیم.

اجزای اصلی یک ایمیل پایتونی و کارکرد آن‌ها

برای اینکه بهتر متوجه بشی هر قسمت از کدهای بالا چیکار می‌کنه، یه نگاهی به این جدول بندازیم:

جزء پایتونی توضیح و کارکرد
smtplib.SMTP مسئول برقراری ارتباط با سرور SMTP (مثل smtp.gmail.com).
server.starttls() شروع رمزنگاری TLS برای ارتباط امن (Standard). پورت 587 استفاده می‌کنه.
server.login() ورود به حساب ایمیل شما با یوزرنیم (ایمیل) و پسورد (App Password).
MIMEText ساخت بدنه ایمیل، چه متن ساده ('plain') و چه HTML ('html').
MIMEMultipart یک شی container برای ترکیب بخش‌های مختلف ایمیل (متن، HTML، فایل پیوست).
MIMEBase پایه و اساس برای ساخت انواع MIME typeها، خصوصاً برای فایل‌های پیوست.
msg.attach() پیوست کردن یک شی MIME (مثل متن یا فایل) به پیام اصلی.
encoders.encode_base64() رمزنگاری فایل پیوست به فرمت Base64 که برای انتقال در ایمیل مناسب است.

ارسال ایمیل به چندین گیرنده (CC, BCC)

اگه می‌خوای ایمیل رو برای چند نفر بفرستی، یا از قابلیت CC (رونوشت) و BCC (رونوشت مخفی) استفاده کنی، باید لیست ایمیل‌ها رو درست هندل کنی.


import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

sender_email = "your_email@gmail.com"
password = "your_app_password"

# لیست گیرندگان
receiver_emails = ["recipient1@example.com", "recipient2@example.com"]
cc_emails = ["cc_recipient@example.com"] # لیست ایمیل‌های CC
bcc_emails = ["bcc_recipient@example.com"] # لیست ایمیل‌های BCC

subject = "ایمیل به چند گیرنده"
body = "سلام دوستان، این ایمیل برای چندین نفر ارسال شده است."

msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = ", ".join(receiver_emails) # جدا کردن ایمیل‌ها با کاما و فاصله
if cc_emails:
    msg['Cc'] = ", ".join(cc_emails)
msg['Subject'] = subject
msg.attach(MIMEText(body, 'plain', 'utf-8'))

# تمام گیرنده‌ها (To, CC, BCC) برای تابع sendmail
all_recipients = receiver_emails + cc_emails + bcc_emails

try:
    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login(sender_email, password)
    server.sendmail(sender_email, all_recipients, msg.as_string())
    print("ایمیل به چندین گیرنده با موفقیت ارسال شد!")

except Exception as e:
    print(f"خطا در ارسال ایمیل به چندین گیرنده: {e}")

finally:
    if 'server' in locals() and server:
        server.quit()

نکته مهم اینجاست که برای فیلدهای To و Cc در هدر ایمیل، آدرس‌ها باید با کاما و فاصله از هم جدا بشن. اما برای تابع sendmail()، باید تمام آدرس‌های گیرنده (اعم از To, CC, BCC) رو به صورت یک لیست تکی بهش بدی. اینجوری سرور SMTP می‌تونه ایمیل رو به همه این افراد بفرسته.

امنیت و رمزنگاری (SSL/TLS)

امنیت اطلاعات تو دنیای امروز حرف اول رو می‌زنه. وقتی ایمیل می‌فرستی، قطعاً نمی‌خوای اطلاعاتت تو راه بین برنامه شما و سرور ایمیل، توسط کسی خونده بشه. اینجا TLS (Transport Layer Security) به کمکت میاد. این همون چیزیه که با متد starttls() فعالش می‌کنیم.

💡 یه توضیح کوچولو: پروتکل SSL (Secure Sockets Layer) یه تکنولوژی قدیمی‌تره که TLS جایگزینش شده. اما هنوز به طور عامیانه از عبارت SSL/TLS استفاده میشه. پس وقتی می‌شنوی “رمزنگاری SSL”, معمولاً منظور همون TLS هست.

کدهای قبلی ما از پورت 587 و starttls() استفاده می‌کردن که روش استاندارد و توصیه شده برای شروع ارتباط امنه. اگه سرور SMTP شما از پورت 465 برای SSL استفاده می‌کنه (که کمتر رایجه)، باید به جای smtplib.SMTP از smtplib.SMTP_SSL استفاده کنی و starttls() رو حذف کنی.


import smtplib
from email.mime.text import MIMEText

# ... (اطلاعات فرستنده، گیرنده، و رمز عبور) ...

# اگر سرور شما از پورت 465 و SSL استفاده می‌کند:
# server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
# نیازی به server.starttls() نیست
# server.login(sender_email, password)
# server.sendmail(sender_email, receiver_email, msg.as_string())

اما باز هم تأکید می‌کنم، برای اکثر سرویس‌دهنده‌ها (مثل جیمیل)، پورت 587 با starttls() انتخاب درسته.

مدیریت خطاهای احتمالی

برنامه‌نویسی همیشه با خطا همراهه، خصوصاً وقتی با شبکه‌ها سر و کار داریم. بهترین کار اینه که کدهامون رو جوری بنویسیم که بتونن خطاها رو هندل کنن و برنامه به خاطر یه مشکل کوچیک از کار نیفته. استفاده از بلوک‌های try-except-finally تو پایتون برای این کار عالیه.

💡 یادت باشه: همیشه سعی کن جزئیات خطا رو لاگ کنی یا به یه جایی بفرستی تا بعداً بتونی راحت‌تر مشکل رو پیدا و حل کنی. اینطوری تجربه کاربری بهتری هم رقم می‌زنی. ضمناً، برای اسنیپت‌های بیشتر در زمینه مدیریت خطاها، سری به بخش کدهای آماده بزن.

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

تو این بخش، به چند تا از مشکلاتی که ممکنه تو مسیر ارسال ایمیل با پایتون باهاش روبرو بشی اشاره می‌کنیم و راه حلشون رو می‌گیم. این راه حل‌ها بهت کمک می‌کنه تا بتونی بدون دردسر و سریع‌تر مشکلت رو رفع کنی.

۱. خطای Authentication Failed (ورود ناموفق)

این رایج‌ترین خطاست.

  • راه حل ۱: App Password (رمز عبور برنامه): مطمئن شو که برای حساب جیمیل خودت App Password ساخته‌ای و اون رو به جای رمز عبور اصلی جیمیل تو کد استفاده می‌کنی. (پیشنهاد شدید)
  • راه حل ۲: Less Secure App Access (دسترسی برنامه‌های کمتر امن): اگه روش App Password رو استفاده نمی‌کنی، باید این گزینه رو تو تنظیمات امنیتی گوگل فعال کنی. (توصیه نمی‌شود!)
  • راه حل ۳: اعتبارسنجی: از صحت آدرس ایمیل و رمز عبوری که تو کد وارد کردی مطمئن شو. حتی یک حرف اشتباه هم باعث این خطا می‌شه.

۲. خطای Connection Refused / Timeout (عدم اتصال / اتمام مهلت)

این خطا یعنی برنامه‌ی شما نتونسته به سرور SMTP وصل بشه.

  • راه حل ۱: پورت و سرور SMTP: مطمئن شو که آدرس سرور SMTP (مثلاً smtp.gmail.com) و پورت (587 برای TLS یا 465 برای SSL) رو درست وارد کرده‌ای.
  • راه حل ۲: فایروال: فایروال سیستم یا شبکه شما ممکنه جلوی اتصال پایتون به سرور SMTP رو بگیره. فایروال رو چک کن و اجازه دسترسی بده.
  • راه حل ۳: اتصال اینترنت: مطمئن شو که اتصال اینترنت شما برقرار هست.

۳. فایل پیوست ارسال نمیشه یا خراب میرسه

اگه با فایل‌های پیوست مشکل داری، احتمالا یه جایی تو مراحل باز کردن، خوندن یا پیوست کردن خطا کردی.

  • راه حل ۱: حالت ‘rb’: موقع باز کردن فایل پیوست، حتماً از حالت باینری ("rb") استفاده کن.
  • راه حل ۲: مسیر فایل: مطمئن شو که مسیر فایل پیوست کاملاً درسته و فایل تو اون مسیر وجود داره.
  • راه حل ۳: رمزنگاری: حتماً از encoders.encode_base64(part) استفاده کن تا فایل برای انتقال آماده بشه.
  • راه حل ۴: MIMEMultipart: فراموش نکن که برای ارسال فایل پیوست، پیام اصلی باید از نوع MIMEMultipart باشه.

۴. ایمیل به پوشه اسپم میره

این مشکل بیشتر مربوط به محتوا و تنظیمات سروره، نه کد پایتون.

  • راه حل ۱: محتوای ایمیل: از کلمات اسپمی و لینک‌های مشکوک تو محتوای ایمیل خودداری کن.
  • راه حل ۲: هدرها: هدرهای ایمیل مثل From و Subject رو درست تنظیم کن.
  • راه حل ۳: اعتبار دامنه: اگه از دامنه خودت برای ارسال استفاده می‌کنی، مطمئن شو که رکوردهای SPF و DKIM دامنه به درستی تنظیم شدن تا سرورهای ایمیل، ایمیل‌های شما رو اسپم تشخیص ندن. این مورد خارج از بحث پایتون هست، اما برای ارسال ایمیل حرفه‌ای بسیار مهمه.

با رعایت این نکات عیب‌یابی، می‌تونی اکثر مشکلاتی که تو ارسال ایمیل با پایتون پیش می‌یاد رو حل کنی. اگه باز هم به مشکل خوردی، کافیه پیغام خطای کامل رو تو گوگل سرچ کنی یا از کامیونیتی پایتون کمک بگیری.

سوالات متداول (FAQ)

۱. آیا برای ارسال ایمیل با پایتون نیاز به نصب کتابخانه خاصی دارم؟

خیر، ماژول‌های smtplib و email جزو کتابخانه‌های داخلی پایتون هستند و نیازی به نصب جداگانه با pip ندارند. فقط کافیه پایتون رو نصب داشته باشی.

۲. آیا می‌توانم از سرویس‌دهنده‌های ایمیل دیگری به جز جیمیل استفاده کنم؟

بله، شما می‌توانید از هر سرویس‌دهنده ایمیل دیگری که دسترسی SMTP فراهم می‌کند (مثل Outlook، Yahoo، یا سرورهای اختصاصی شرکتی) استفاده کنید. فقط کافیست آدرس سرور SMTP و پورت صحیح آن سرویس‌دهنده را جایگزین 'smtp.gmail.com' و 587 در کد کنید.

۳. چگونه ایمیل‌های ارسالی من به اسپم نروند؟

برای جلوگیری از اسپم شدن ایمیل‌ها، از محتوای پاک و بدون کلمات مشکوک استفاده کنید، هدرهای ایمیل را صحیح تنظیم کنید و اگر از دامنه خودتان ایمیل می‌فرستید، رکوردهای SPF و DKIM را در تنظیمات DNS دامنه خود به درستی پیکربندی کنید. استفاده از سرویس‌های ایمیل ترنزکشنال (مانند SendGrid یا Mailgun) نیز می‌تواند کمک کننده باشد.

۴. آیا راهی برای ارسال انبوه ایمیل با پایتون وجود دارد؟

بله، با پایتون می‌تونی ایمیل انبوه بفرستی، اما باید حواست باشه که سرورهای SMTP مثل جیمیل محدودیت‌هایی برای تعداد ایمیل‌های ارسالی در یک بازه زمانی دارند. برای ارسال ایمیل‌های انبوه به صورت حرفه‌ای، بهتره از سرویس‌های تخصصی ایمیل مارکتینگ یا ایمیل ترنزکشنال استفاده کنی که API پایتون دارند. این سرویس‌ها برای این کار بهینه شدن و نرخ تحویل بالاتری دارند.

سخن پایانی

امیدوارم با این کدهای آماده و توضیحات کامل، دیگه مشکلی برای ارسال ایمیل با پایتون نداشته باشی. همونطور که دیدی، پایتون ابزاری فوق‌العاده قدرتمنده که با کمی خلاقیت، می‌تونه کارهای بزرگی برات انجام بده. حالا وقتشه که این کدها رو برداری و تو پروژه‌های خودت به کار ببری. امتحان کردن بهترین راه برای یادگیریه، پس برو و کثیف کاری کن (به معنای کدنویسی و امتحان کردن)! یادت نره، اگر دنبال کدهای آماده و اسنیپت‌های دیگه هستی، به fa-tools.ir سر بزن. کدنویسی خوش!

Table of Contents

آخرین نوشته‌ها