با imaplib پایتون، اتوماسیون ایمیل را یاد بگیرید. این راهنما اتصال به سرورهای IMAP، جستجو، دریافت، تجزیه ایمیل، مدیریت پیوست ها و صندوق های پستی را پوشش می دهد.
مشتری IMAP پایتون: راهنمای جامع برای بازیابی ایمیل و مدیریت صندوق پستی
ایمیل همچنان سنگ بنای ارتباطات دیجیتال برای مشاغل و افراد در سراسر جهان است. با این حال، مدیریت حجم بالایی از ایمیلها میتواند یک کار وقتگیر و تکراری باشد. از پردازش فاکتورها و فیلتر کردن اعلانها گرفته تا بایگانی مکالمات مهم، تلاش دستی میتواند به سرعت طاقتفرسا شود. اینجاست که اتوماسیون برنامهنویسی میدرخشد، و پایتون، با کتابخانه استاندارد غنی خود، ابزارهای قدرتمندی را برای کنترل صندوق ورودی شما فراهم میکند.
این راهنمای جامع شما را از طریق فرآیند ساخت یک کلاینت IMAP پایتون از پایه با استفاده از کتابخانه داخلی imaplib
راهنمایی میکند. شما نه تنها یاد خواهید گرفت که چگونه ایمیلها را بازیابی کنید، بلکه یاد خواهید گرفت که چگونه محتوای آنها را تجزیه کنید، پیوستها را دانلود کنید و با علامتگذاری پیامها به عنوان خوانده شده، انتقال آنها یا حذف آنها، صندوق پستی خود را مدیریت کنید. در پایان این مقاله، شما مجهز خواهید شد تا خستهکنندهترین وظایف ایمیل خود را خودکار کنید، در وقت خود صرفهجویی کنید و بهرهوری خود را افزایش دهید.
درک پروتکل ها: IMAP در مقابل POP3 در مقابل SMTP
قبل از پرداختن به کد، درک پروتکل های اساسی که بر ایمیل حاکم هستند ضروری است. اغلب سه مخفف را می شنوید: SMTP، POP3 و IMAP. هر کدام هدف مشخصی را دنبال می کنند.
- SMTP (پروتکل انتقال نامه ساده): این پروتکل برای ارسال ایمیل است. SMTP را به عنوان سرویس پستی در نظر بگیرید که نامه شما را برمی دارد و به سرور صندوق پستی گیرنده تحویل می دهد. وقتی اسکریپت پایتون شما یک ایمیل ارسال می کند، از SMTP استفاده می کند.
- POP3 (پروتکل اداره پست 3): این پروتکل برای بازیابی ایمیل است. POP3 برای اتصال به یک سرور، دانلود تمام پیام های جدید به کلاینت محلی شما و سپس، به طور پیش فرض، حذف آنها از سرور طراحی شده است. این مانند رفتن به اداره پست، جمع آوری تمام نامه های خود و بردن آن به خانه است. پس از رسیدن به خانه، دیگر در اداره پست نیست. این مدل امروزه به دلیل محدودیت هایش در دنیای چند دستگاهی کمتر رایج است.
- IMAP (پروتکل دسترسی به پیام اینترنتی): این پروتکل مدرن برای دسترسی و مدیریت ایمیل است. برخلاف POP3، IMAP پیامها را روی سرور باقی میگذارد و وضعیت (خوانده شده، خوانده نشده، علامتگذاری شده، حذف شده) را در همه کلاینتهای متصل همگام میکند. وقتی ایمیلی را در تلفن خود میخوانید، در لپتاپ شما بهعنوان خوانده شده ظاهر میشود. این مدل متمرکز بر سرور برای اتوماسیون عالی است زیرا اسکریپت شما می تواند به عنوان یک کلاینت دیگر با صندوق پستی تعامل داشته باشد و تغییراتی که ایجاد می کند در همه جا منعکس می شود. برای این راهنما، ما به طور انحصاری بر IMAP تمرکز خواهیم کرد.
شروع به کار با imaplib
پایتون
کتابخانه استاندارد پایتون شامل imaplib
است، یک ماژول که تمام ابزارهای لازم برای برقراری ارتباط با یک سرور IMAP را فراهم می کند. برای شروع به کار هیچ بسته خارجی مورد نیاز نیست.
پیش نیازها
- پایتون نصب شده: اطمینان حاصل کنید که یک نسخه جدید از پایتون (3.6 یا جدیدتر) روی سیستم خود نصب کرده اید.
- یک حساب ایمیل با فعال بودن IMAP: اکثر ارائه دهندگان ایمیل مدرن (Gmail، Outlook، Yahoo و غیره) از IMAP پشتیبانی می کنند. ممکن است لازم باشد آن را در تنظیمات حساب خود فعال کنید.
امنیت اول: از رمزهای عبور برنامه استفاده کنید، نه رمز عبور اصلی خود
این مهمترین گام برای امنیت است. رمز عبور اصلی حساب ایمیل خود را در اسکریپت خود هاردکد نکنید. اگر کد شما در معرض خطر قرار گیرد، کل حساب شما در معرض خطر است. اکثر ارائه دهندگان ایمیل بزرگ که از احراز هویت دو مرحله ای (2FA) استفاده می کنند، از شما می خواهند یک "رمز عبور برنامه" ایجاد کنید.
رمز عبور برنامه یک رمز عبور منحصر به فرد و 16 رقمی است که به یک برنامه خاص اجازه می دهد بدون نیاز به رمز عبور اصلی یا کدهای 2FA به حساب شما دسترسی داشته باشد. می توانید در هر زمان بدون تأثیر بر رمز عبور اصلی خود، یکی ایجاد کنید و آن را لغو کنید.
- برای Gmail: به تنظیمات حساب Google خود -> امنیت -> تأیید 2 مرحله ای -> رمزهای عبور برنامه بروید.
- برای Outlook/Microsoft: به داشبورد امنیت حساب Microsoft خود -> گزینه های امنیتی پیشرفته -> رمزهای عبور برنامه بروید.
- برای سایر ارائه دهندگان: اسناد آنها را برای "رمز عبور برنامه" یا "رمز عبور خاص برنامه" جستجو کنید.
پس از ایجاد، با این رمز عبور برنامه مانند سایر اعتبارنامه ها رفتار کنید. بهترین روش این است که آن را در یک متغیر محیطی یا یک سیستم مدیریت اسرار امن به جای مستقیماً در کد منبع خود ذخیره کنید.
اتصال اساسی
بیایید اولین قطعه کد خود را برای ایجاد یک اتصال امن به یک سرور IMAP، ورود به سیستم و سپس خروج از سیستم به طور زیبا بنویسیم. ما از imaplib.IMAP4_SSL
برای اطمینان از رمزگذاری اتصال خود استفاده خواهیم کرد.
import imaplib
import os
# --- Credentials ---
# It's best to load these from environment variables or a config file
# For this example, we'll define them here. Replace with your details.
EMAIL_ACCOUNT = "your_email@example.com"
APP_PASSWORD = "your_16_digit_app_password"
IMAP_SERVER = "imap.example.com" # e.g., "imap.gmail.com"
# --- Connect to the IMAP server ---
# We use a try...finally block to ensure we logout gracefully
conn = None
try:
# Connect using SSL for a secure connection
conn = imaplib.IMAP4_SSL(IMAP_SERVER)
# Login to the account
status, messages = conn.login(EMAIL_ACCOUNT, APP_PASSWORD)
if status == 'OK':
print("Successfully logged in!")
# We will add more logic here later
else:
print(f"Login failed: {messages}")
finally:
if conn:
# Always logout and close the connection
conn.logout()
print("Logged out and connection closed.")
این اسکریپت یک پایه ایجاد می کند. بلوک try...finally
بسیار مهم است زیرا تضمین می کند که conn.logout()
فراخوانی می شود و جلسه با سرور را حتی در صورت بروز خطا در طول عملیات ما می بندد.
پیمایش در صندوق پستی خود
پس از ورود به سیستم، می توانید با صندوق های پستی (که اغلب پوشه نامیده می شوند) در حساب خود تعامل داشته باشید.
لیست کردن همه صندوق های پستی
برای دیدن اینکه چه صندوقهای پستی در دسترس هستند، میتوانید از متد conn.list()
استفاده کنید. خروجی می تواند کمی نامرتب باشد، بنابراین برای به دست آوردن یک لیست تمیز از نام ها، کمی تجزیه لازم است.
# Inside the 'try' block after a successful login:
status, mailbox_list = conn.list()
if status == 'OK':
print("Available Mailboxes:")
for mailbox in mailbox_list:
# The raw mailbox entry is a byte string that needs decoding
# It's often formatted like: (\HasNoChildren) "/" "INBOX"
# We can do some basic parsing to clean it up
parts = mailbox.decode().split(' "/" ')
if len(parts) == 2:
mailbox_name = parts[1].strip('"')
print(f"- {mailbox_name}")
این لیست مانند 'INBOX'، 'Sent'، '[Gmail]/Spam' و غیره را بسته به ارائه دهنده ایمیل شما چاپ می کند.
انتخاب یک صندوق پستی
قبل از اینکه بتوانید ایمیل ها را جستجو یا دریافت کنید، باید یک صندوق پستی برای کار با آن انتخاب کنید. رایج ترین انتخاب 'INBOX' است. متد conn.select()
یک صندوق پستی را فعال می کند. اگر قصد ایجاد تغییرات (مانند علامت گذاری ایمیل ها به عنوان خوانده شده) را ندارید، می توانید آن را در حالت فقط خواندنی نیز باز کنید.
# Select the 'INBOX' to work with.
# Use readonly=True if you don't want to change email flags (e.g., from UNSEEN to SEEN)
status, messages = conn.select('INBOX', readonly=False)
if status == 'OK':
total_messages = int(messages[0])
print(f"INBOX selected. Total messages: {total_messages}")
else:
print(f"Failed to select INBOX: {messages}")
وقتی یک صندوق پستی را انتخاب میکنید، سرور تعداد کل پیامهای موجود در آن را برمیگرداند. همه دستورات بعدی برای جستجو و دریافت برای این صندوق پستی انتخاب شده اعمال می شود.
جستجو و دریافت ایمیل ها
این هسته اصلی بازیابی ایمیل است. این فرآیند شامل دو مرحله است: اول، جستجوی پیامهایی که با معیارهای خاصی مطابقت دارند برای دریافت شناسههای منحصربهفرد آنها، و دوم، دریافت محتوای آن پیامها با استفاده از شناسههای آنها.
قدرت search()
متد search()
فوق العاده همه کاره است. این متد خود ایمیل ها را بر نمی گرداند، بلکه لیستی از شماره های توالی پیام (شناسه ها) را برمی گرداند که با درخواست شما مطابقت دارند. این شناسه ها مختص جلسه فعلی و صندوق پستی انتخاب شده هستند.
در اینجا برخی از رایج ترین معیارهای جستجو آورده شده است:
'ALL'
: همه پیام ها در صندوق پستی.'UNSEEN'
: پیام هایی که هنوز خوانده نشده اند.'SEEN'
: پیام هایی که خوانده شده اند.'FROM "sender@example.com"'
: پیام هایی از یک فرستنده خاص.'TO "recipient@example.com"'
: پیام هایی که به یک گیرنده خاص ارسال شده اند.'SUBJECT "Your Subject Line"'
: پیام هایی با یک موضوع خاص.'BODY "a keyword in the body"'
: پیام هایی که حاوی یک رشته معین در بدنه هستند.'SINCE "01-Jan-2024"'
: پیام هایی که در یا بعد از یک تاریخ خاص دریافت شده اند.'BEFORE "31-Jan-2024"'
: پیام هایی که قبل از یک تاریخ خاص دریافت شده اند.
همچنین می توانید معیارها را ترکیب کنید. برای مثال، برای یافتن همه ایمیلهای خواندهنشده از یک فرستنده خاص با یک موضوع معین، '(UNSEEN FROM "alerts@example.com" SUBJECT "System Alert")'
را جستجو میکنید.
بیایید آن را در عمل ببینیم:
# Search for all unread emails in the INBOX
status, message_ids = conn.search(None, 'UNSEEN')
if status == 'OK':
# message_ids is a list of byte strings, e.g., [b'1 2 3']
# We need to split it into individual IDs
email_id_list = message_ids[0].split()
if email_id_list:
print(f"Found {len(email_id_list)} unread emails.")
else:
print("No unread emails found.")
else:
print("Search failed.")
دریافت محتوای ایمیل با fetch()
اکنون که شناسه های پیام را دارید، می توانید از متد fetch()
برای بازیابی داده های واقعی ایمیل استفاده کنید. شما باید مشخص کنید که کدام قسمت از ایمیل را می خواهید.
'RFC822'
: این کل محتوای ایمیل خام، از جمله همه هدرها و قسمت های بدنه را واکشی می کند. این رایج ترین و جامع ترین گزینه است.'BODY[]'
: مترادف باRFC822
.'ENVELOPE'
: اطلاعات کلیدی هدر مانند تاریخ، موضوع، از، به و در پاسخ به را واکشی می کند. اگر فقط به فراداده نیاز دارید، این سریعتر است.'BODY[HEADER]'
: فقط هدرها را واکشی می کند.
بیایید محتوای کامل اولین ایمیل خوانده نشده ای را که پیدا کردیم واکشی کنیم:
if email_id_list:
first_email_id = email_id_list[0]
# Fetch the email data for the given ID
# 'RFC822' is a standard that specifies the format of text messages
status, msg_data = conn.fetch(first_email_id, '(RFC822)')
if status == 'OK':
for response_part in msg_data:
# The fetch command returns a tuple, where the second part is the email content
if isinstance(response_part, tuple):
raw_email = response_part[1]
# Now we have the raw email data as bytes
# The next step is to parse it
print("Successfully fetched an email.")
# We will process `raw_email` in the next section
else:
print("Fetch failed.")
تجزیه محتوای ایمیل با ماژول email
داده های خام برگشتی توسط fetch()
یک رشته بایت است که مطابق با استاندارد RFC 822 فرمت شده است. به راحتی قابل خواندن نیست. ماژول داخلی email
پایتون به طور خاص برای تجزیه این پیام های خام به یک ساختار شیء کاربرپسند طراحی شده است.
ایجاد یک شیء Message
اولین قدم تبدیل رشته بایت خام به یک شیء Message
با استفاده از email.message_from_bytes()
است.
import email
from email.header import decode_header
# Assuming `raw_email` contains the byte data from the fetch command
email_message = email.message_from_bytes(raw_email)
استخراج اطلاعات کلیدی (هدرها)
هنگامی که شیء Message
را دارید، می توانید مانند یک دیکشنری به هدرهای آن دسترسی داشته باشید.
# Get subject, from, to, and date
subject = email_message["Subject"]
from_ = email_message["From"]
to_ = email_message["To"]
date_ = email_message["Date"]
# Email headers can contain non-ASCII characters, so we need to decode them
def decode_email_header(header):
decoded_parts = decode_header(header)
header_str = ""
for part, encoding in decoded_parts:
if isinstance(part, bytes):
# If there's an encoding, use it. Otherwise, default to utf-8.
header_str += part.decode(encoding or 'utf-8')
else:
header_str += part
return header_str
subject = decode_email_header(subject)
from_ = decode_email_header(from_)
print(f"Subject: {subject}")
print(f"From: {from_}")
تابع کمکی decode_email_header
مهم است زیرا هدرها اغلب برای مدیریت مجموعه کاراکترهای بین المللی رمزگذاری می شوند. دسترسی ساده به email_message["Subject"]
ممکن است رشته ای با توالی کاراکترهای گیج کننده به شما بدهد اگر آن را به درستی رمزگشایی نکنید.
مدیریت بدنه و پیوست های ایمیل
ایمیل های مدرن اغلب "چند قسمتی" هستند، به این معنی که حاوی نسخه های مختلفی از محتوا هستند (مانند متن ساده و HTML) و ممکن است شامل پیوست نیز باشند. ما باید از طریق این قسمت ها قدم بزنیم تا آنچه را که به دنبالش هستیم پیدا کنیم.
متد msg.is_multipart()
به ما می گوید که آیا یک ایمیل دارای چندین قسمت است یا خیر، و msg.walk()
یک راه آسان برای تکرار در آنها ارائه می دهد.
def process_email_body(msg):
body = ""
attachments = []
if msg.is_multipart():
# Iterate through email parts
for part in msg.walk():
content_type = part.get_content_type()
content_disposition = str(part.get("Content-Disposition"))
try:
# Get the email body
if content_type == "text/plain" and "attachment" not in content_disposition:
payload = part.get_payload(decode=True)
charset = part.get_content_charset() or 'utf-8'
body = payload.decode(charset)
# Get attachments
elif "attachment" in content_disposition:
filename = part.get_filename()
if filename:
# Decode filename if needed
decoded_filename = decode_email_header(filename)
attachments.append({
'filename': decoded_filename,
'data': part.get_payload(decode=True)
})
except Exception as e:
print(f"Error processing part: {e}")
else:
# Not a multipart message, just get the payload
payload = msg.get_payload(decode=True)
charset = msg.get_content_charset() or 'utf-8'
body = payload.decode(charset)
return body, attachments
# Using the function with our fetched message
email_body, email_attachments = process_email_body(email_message)
print("\n--- Email Body ---")
print(email_body)
if email_attachments:
print("\n--- Attachments ---")
for att in email_attachments:
print(f"Filename: {att['filename']}")
# Example of saving an attachment
with open(att['filename'], 'wb') as f:
f.write(att['data'])
print(f"Saved attachment: {att['filename']}")
این تابع با بررسی هدرهای Content-Type
و Content-Disposition
هر قسمت، هوشمندانه بین بدنه متن ساده و پیوست های فایل تمایز قائل می شود.
مدیریت پیشرفته صندوق پستی
بازیابی ایمیل ها تنها نیمی از نبرد است. اتوماسیون واقعی شامل تغییر وضعیت پیام ها در سرور است. دستور store()
ابزار اصلی شما برای این کار است.
علامت گذاری ایمیل ها (خوانده شده، خوانده نشده، علامت گذاری شده)
می توانید پرچم ها را روی یک پیام اضافه، حذف یا جایگزین کنید. رایج ترین پرچم \Seen
است که وضعیت خوانده شده/خوانده نشده را کنترل می کند.
- علامت گذاری به عنوان خوانده شده:
conn.store(msg_id, '+FLAGS', '\Seen')
- علامت گذاری به عنوان خوانده نشده:
conn.store(msg_id, '-FLAGS', '\Seen')
- علامت گذاری/ستاره دار کردن یک ایمیل:
conn.store(msg_id, '+FLAGS', '\Flagged')
- برداشتن علامت یک ایمیل:
conn.store(msg_id, '-FLAGS', '\Flagged')
کپی و انتقال ایمیل ها
هیچ دستور مستقیم "انتقال" در IMAP وجود ندارد. انتقال یک ایمیل یک فرآیند دو مرحله ای است:
- با استفاده از
conn.copy()
پیام را در صندوق پستی مقصد کپی کنید. - با استفاده از پرچم
\Deleted
پیام اصلی را برای حذف علامت گذاری کنید.
# Assuming `msg_id` is the ID of the email to move
# 1. Copy to the 'Archive' mailbox
status, _ = conn.copy(msg_id, 'Archive')
if status == 'OK':
print(f"Message {msg_id.decode()} copied to Archive.")
# 2. Mark the original for deletion
conn.store(msg_id, '+FLAGS', '\Deleted')
print(f"Message {msg_id.decode()} marked for deletion.")
حذف دائمی ایمیل ها
علامت گذاری یک پیام با \Deleted
بلافاصله آن را حذف نمی کند. به سادگی آن را از دید در اکثر کلاینت های ایمیل پنهان می کند. برای حذف دائمی تمام پیام های موجود در صندوق پستی انتخاب شده که برای حذف علامت گذاری شده اند، باید متد expunge()
را فراخوانی کنید.
هشدار: expunge()
برگشت ناپذیر است. پس از فراخوانی، داده ها برای همیشه از بین می روند.
# This will permanently delete all messages with the \Deleted flag
status, response = conn.expunge()
if status == 'OK':
print(f"{len(response)} messages expunged (permanently deleted).")
یک اثر جانبی حیاتی expunge()
این است که می تواند شماره های پیام را برای تمام پیام های بعدی در صندوق پستی دوباره شماره گذاری کند. به همین دلیل، بهتر است تمام پیام هایی را که می خواهید پردازش کنید، شناسایی کنید، اقدامات خود را انجام دهید (مانند کپی و علامت گذاری برای حذف) و سپس expunge()
را یک بار در انتهای جلسه خود فراخوانی کنید.
همه چیز را در کنار هم قرار دادن: یک مثال عملی
بیایید یک اسکریپت کامل ایجاد کنیم که یک کار واقعی را انجام می دهد: صندوق ورودی را برای ایمیل های خوانده نشده از "invoices@mycorp.com" اسکن کنید، هر پیوست PDF را دانلود کنید و ایمیل پردازش شده را به یک صندوق پستی با نام "Processed-Invoices" منتقل کنید.
import imaplib
import email
from email.header import decode_header
import os
# --- Configuration ---
EMAIL_ACCOUNT = "your_email@example.com"
APP_PASSWORD = "your_16_digit_app_password"
IMAP_SERVER = "imap.gmail.com"
TARGET_SENDER = "invoices@mycorp.com"
DESTINATION_MAILBOX = "Processed-Invoices"
DOWNLOAD_DIR = "invoices"
# Create download directory if it doesn't exist
if not os.path.isdir(DOWNLOAD_DIR):
os.mkdir(DOWNLOAD_DIR)
def decode_email_header(header):
# (Same function as defined earlier)
decoded_parts = decode_header(header)
header_str = ""
for part, encoding in decoded_parts:
if isinstance(part, bytes):
header_str += part.decode(encoding or 'utf-8')
else:
header_str += part
return header_str
conn = None
try:
# --- Connect and Login ---
conn = imaplib.IMAP4_SSL(IMAP_SERVER)
conn.login(EMAIL_ACCOUNT, APP_PASSWORD)
print("Login successful.")
# --- Select INBOX ---
conn.select('INBOX')
print("INBOX selected.")
# --- Search for emails ---
search_criteria = f'(UNSEEN FROM "{TARGET_SENDER}")'
status, message_ids = conn.search(None, search_criteria)
if status != 'OK':
raise Exception("Search failed")
email_id_list = message_ids[0].split()
if not email_id_list:
print("No new invoices found.")
else:
print(f"Found {len(email_id_list)} new invoices to process.")
# --- Process Each Email ---
for email_id in email_id_list:
print(f"\nProcessing email ID: {email_id.decode()}")
# Fetch the email
status, msg_data = conn.fetch(email_id, '(RFC822)')
if status != 'OK':
print(f"Failed to fetch email ID {email_id.decode()}")
continue
raw_email = msg_data[0][1]
email_message = email.message_from_bytes(raw_email)
subject = decode_email_header(email_message["Subject"])
print(f" Subject: {subject}")
# Look for attachments
for part in email_message.walk():
if part.get_content_maintype() == 'multipart':
continue
if part.get('Content-Disposition') is None:
continue
filename = part.get_filename()
if filename and filename.lower().endswith('.pdf'):
decoded_filename = decode_email_header(filename)
filepath = os.path.join(DOWNLOAD_DIR, decoded_filename)
# Save the attachment
with open(filepath, 'wb') as f:
f.write(part.get_payload(decode=True))
print(f" -> Downloaded attachment: {decoded_filename}")
# --- Move the processed email ---
# 1. Copy to destination mailbox
status, _ = conn.copy(email_id, DESTINATION_MAILBOX)
if status == 'OK':
# 2. Mark original for deletion
conn.store(email_id, '+FLAGS', '\Deleted')
print(f" Email moved to '{DESTINATION_MAILBOX}'.")
# --- Expunge and Clean Up ---
if email_id_list:
conn.expunge()
print("\nExpunged deleted emails.")
except Exception as e:
print(f"An error occurred: {e}")
finally:
if conn:
conn.logout()
print("Logged out.")
بهترین شیوه ها و رسیدگی به خطا
هنگام ساخت اسکریپت های اتوماسیون قوی، بهترین شیوه های زیر را در نظر بگیرید:
- رسیدگی قوی به خطا: کد خود را در بلوک های
try...except
بپیچید تا مسائل احتمالی مانند خرابی ورود به سیستم (imaplib.IMAP4.error
)، مشکلات شبکه یا خطاهای تجزیه را به دام بیندازید. - مدیریت پیکربندی: هرگز اعتبارنامه ها را هاردکد نکنید. از متغیرهای محیطی (
os.getenv()
)، یک فایل پیکربندی (مثلاً INI یا YAML) یا یک مدیر اسرار اختصاصی استفاده کنید. - ثبت وقایع: به جای دستورات
print()
، از ماژولlogging
پایتون استفاده کنید. این به شما امکان می دهد میزان پرحرفی خروجی خود را کنترل کنید، در فایل ها بنویسید و مهر زمانی اضافه کنید، که برای رفع اشکال اسکریپت هایی که بدون مراقبت اجرا می شوند، بسیار ارزشمند است. - محدودیت نرخ: شهروند خوبی در اینترنت باشید. سرور ایمیل را بیش از حد نظرسنجی نکنید. اگر نیاز دارید ایمیل های جدید را به طور مکرر بررسی کنید، فواصل زمانی چندین دقیقه ای را به جای ثانیه در نظر بگیرید.
- رمزگذاری کاراکتر: ایمیل یک استاندارد جهانی است و با رمزگذاری های کاراکتر مختلفی روبرو خواهید شد. همیشه سعی کنید مجموعه کاراکتر را از قسمت ایمیل (
part.get_content_charset()
) تعیین کنید و یک بازگشت (مانند 'utf-8') برای جلوگیری ازUnicodeDecodeError
داشته باشید.
نتیجه
اکنون کل چرخه تعامل با یک سرور ایمیل را با استفاده از imaplib
پایتون طی کرده اید. ما ایجاد یک اتصال امن، فهرست کردن صندوقهای پستی، انجام جستجوهای قدرتمند، دریافت و تجزیه ایمیلهای چند قسمتی پیچیده، دانلود پیوستها و مدیریت حالتهای پیام در سرور را پوشش دادهایم.
قدرت این دانش بسیار زیاد است. می توانید سیستم هایی برای دسته بندی خودکار بلیط های پشتیبانی، تجزیه داده ها از گزارش های روزانه، بایگانی خبرنامه ها، فعال کردن اقدامات بر اساس ایمیل های هشدار و موارد دیگر بسازید. صندوق ورودی، که زمانی منبع کار دستی بود، می تواند به یک منبع داده خودکار و قدرتمند برای برنامه ها و گردش کار شما تبدیل شود.
اولین وظایف ایمیلی که خودکار می کنید چیست؟ احتمالات فقط با تخیل شما محدود می شود. از کوچک شروع کنید، بر اساس مثال های این راهنما بسازید و زمان خود را از اعماق صندوق ورودی خود پس بگیرید.