ویرگول
ورودثبت نام
آروین لری پور
آروین لری پوربرنامه نویس و طراح وب سایت و اپلیکشن های آندروید و iOS جهت آشنایی بیشتر به وب سایت من مراجعه کنید.
آروین لری پور
آروین لری پور
خواندن ۷ دقیقه·۱ ماه پیش

ساخت یک سیستم فوروارد ایمیل چند حسابه با PHP 8: رویکردی مدرن برای مدیریت ایمیل

مقدمه

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

در این مقاله، من شما را گام به گام با ساخت یک سیستم پیشرفته و آماده برای تولید فوروارد ایمیل با استفاده از ویژگیهای مدرن PHP 8 راهنمایی میکنم. این فقط یک اسکریپت ایمیل ساده نیست؛ بلکه یک راهکار قدرتمند است که چندین حساب را مدیریت میکند، اسپمها را پردازش میکند، ایمیلهای قدیمی را به صورت خودکار پاک میکند و گزارشدهی کامل ارائه میدهد.

چرا خودتان سیستم فوروارد ایمیل بسازید؟

ممکن است بپرسید: «چرا از قابلیت فوروارد Gmail استفاده نکنیم؟» دلایل متقاعدکنندهای وجود دارد:

  1. مدیریت چند حساب: مدیریت تعداد نامحدود حساب ایمیل با یک اسکریپت

  2. پردازش اسپم: فوروارد ایمیلهای اسپم به صندوق مانیتورینگ جداگانه

  3. پاکسازی خودکار: حذف خودکار ایمیلهای فوروارد شده بعد از مدت زمان مشخص

  4. منطق سفارشی: پیادهسازی قوانین فیلتر و مسیریابی دلخواه

  5. کنترل حریم خصوصی: نگهداری دادههای ایمیل روی سرور خودتان

  6. گزارشدهی کامل: پیگیری هر ایمیل فوروارد شده با گزارشهای دقیق

معماری سیستم

سیستم ما بر اساس سه جزء اصلی ساخته شده است:

1. لایه پیکربندی حسابها

هر حساب ایمیل یک شیء پیکربندی مستقل با تنظیمات خودش دارد:

new EmailAccount( name: 'Company-Main', imapHost: 'mail.company.com', imapPort: 993, imapUser: 'info@company.com', imapPass: 'secure-password', smtpHost: 'mail.company.com', smtpPort: 465, smtpUser: 'info@company.com', smtpPass: 'secure-password', smtpSecure: 'ssl', forwardTo: ['admin@gmail.com', 'backup@company.com'], foldersToCheck: ['INBOX', 'Junk'], processJunk: true, enabled: true )

2. موتور پردازش

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

3. سیستم گزارشدهی

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

ویژگیهای کلیدی

پیادهسازی مدرن PHP 8

از ویژگیهای جدید PHP 8 برای کدی تمیز و قابل نگهداری استفاده میکنیم:

افزایش سازنده (Constructor Property Promotion):

public function __construct( private readonly EmailForwarderConfig $config ) {}

عبارات match:

return match($encoding) { 1 => imap_8bit($body), 2 => imap_binary($body), 3 => imap_base64($body), 4 => quoted_printable_decode($body), default => $body };

خواص فقط-خواندنی (Readonly Properties):

public readonly string $imapHost; public readonly int $imapPort;

تایپ استریکت:

declare(strict_types=1);

پردازش هوشمند ایمیل

سیستم ایمیلها را هوشمندانه پردازش میکند:

  1. پردازش بر اساس پوشه: بررسی INBOX، Junk و Spam

  2. برچسبگذاری هوشمند: افزودن شناسه حساب و علامت اسپم به موضوع ایمیلها

  3. حفظ متادیتا: شامل فرستنده اصلی، تاریخ و پوشه

  4. مدیریت انکدینگ: دیکد صحیح موضوع و متن ایمیلها با انواع انکدینگ

پاکسازی خودکار

یکی از ویژگیهای قدرتمند، پاکسازی خودکار است:

private function deleteOldForwardedEmails(EmailAccount $account): void { $cutoffDate = strtotime("-{$this->config->deleteAfterDays} days"); foreach ($logLines as $line) { if ($forwardedTime < $cutoffDate) { imap_delete($this->connection, (string)$emailNumber); } } imap_expunge($this->connection); }

این کار از شلوغ شدن صندوق ایمیل جلوگیری میکند و در عین حال یک بازه زمانی ایمن برای بررسی ایمیلها حفظ میشود.

گزارشدهی کامل

دو فایل گزارش جداگانه، دید کامل ارائه میدهند:

گزارش ایمیلهای فوروارد شده:

2025-11-09 10:30:15|Company-Main|123|INBOX|Important Message|client@example.com 2025-11-09 10:31:20|Company-Main|124|Junk|Spam Email|spam@test.com

گزارش خطا:

[2025-11-09 10:35:20] [Company-Main] Failed to forward to admin@gmail.com: SMTP Error [2025-11-09 10:40:15] [Support-Email] Cannot connect to IMAP: Authentication failed

نمونههای واقعی استفاده

مورد 1: یکپارچهسازی ایمیلهای کسبوکار

سناریو: یک کسبوکار کوچک با ایمیلهای مختلف بخشها (sales@، support@، info@) میخواهد همه پیامها را به یک ایمیل مرکزی فوروارد کند.

راهحل: هر ایمیل بخش را به عنوان یک حساب جداگانه پیکربندی کنید و همه به یک حساب Gmail فوروارد شوند. افزودن شناسه بخش در موضوع ایمیل برای فیلتر آسان.

$accounts = [ new EmailAccount( name: 'Sales', imapUser: 'sales@company.com', forwardTo: ['central@gmail.com'], // ... سایر پیکربندی ), new EmailAccount( name: 'Support', imapUser: 'support@company.com', forwardTo: ['central@gmail.com'], // ... سایر پیکربندی ), ];

مورد 2: مانیتورینگ اسپم

سناریو: تیم امنیتی میخواهد ایمیلهای اسپم را برای شناسایی حملات فیشینگ بررسی کند و صندوق اصلی پاک بماند.

راهحل: پردازش پوشه Junk را فعال کرده و اسپمها را به یک صندوق امنیتی جداگانه فوروارد کنید.

new EmailAccount( name: 'Company-Security', processJunk: true, foldersToCheck: ['INBOX', 'Junk', 'Spam'], forwardTo: ['security-monitoring@company.com'], // ایمیلها با پیشوند [JUNK] علامتگذاری میشوند )

مورد 3: آرشیو موقت ایمیلها

سناریو: یک فریلنسر نیاز دارد ایمیلهای مشتریان را به مدت 7 روز نگه دارد و سپس به صورت خودکار پاک کند تا فضای ذخیره صرفهجویی شود.

راهحل: دوره حذف را 7 روز تنظیم کنید و سیستم به صورت خودکار ایمیلهای قدیمی را پاک کند.

$config = new EmailForwarderConfig( accounts: $accounts, deleteAfterForward: true, deleteAfterDays: 7 // نگهداری ایمیلها به مدت یک هفته );

نصب و راهاندازی

پیشنیازها

قبل از شروع، مطمئن شوید که دارید:

  • PHP 8.0 یا بالاتر

  • افزونه IMAP فعال

  • Composer برای مدیریت وابستگیها

  • دسترسی به تنظیمات IMAP و SMTP سرور ایمیل

مرحله 1: نصب وابستگیها

composer require phpmailer/phpmailer

مرحله 2: فعال کردن افزونه IMAP

در Ubuntu/Debian:

sudo apt-get install php-imap sudo phpenmod imap sudo systemctl restart apache2

در CentOS/RHEL:

sudo yum install php-imap sudo systemctl restart httpd

مرحله 3: پیکربندی حسابها

پیکربندی خود را در اسکریپت ایجاد کنید:

$accounts = [ new EmailAccount( name: 'Primary-Account', imapHost: 'mail.yourdomain.com', imapPort: 993, imapUser: 'your-email@yourdomain.com', imapPass: 'your-secure-password', smtpHost: 'mail.yourdomain.com', smtpPort: 465, smtpUser: 'your-email@yourdomain.com', smtpPass: 'your-secure-password', smtpSecure: 'ssl', forwardTo: ['destination@gmail.com'], enabled: true ), ];

مرحله 4: راهاندازی خودکار

برای اجرای خودکار، آن را به crontab اضافه کنید:

# اجرا هر 15 دقیقه */15 * * * * /usr/bin/php /path/to/email_forwarder.php >> /path/to/cron.log 2>&1

بهترین شیوههای امنیتی

1. استفاده از رمز عبور مخصوص برنامه

هرگز از رمز عبور اصلی ایمیل در اسکریپت استفاده نکنید. اکثر سرویسها (Gmail، Outlook و غیره) رمز مخصوص برنامه ارائه میدهند.

برای Gmail:

  1. فعال کردن احراز هویت دو مرحلهای

  2. رفتن به تنظیمات امنیتی

  3. ایجاد App Password

  4. استفاده از این رمز در اسکریپت

2. مجوز فایل امن

اسکریپت و لاگها را محافظت کنید:

chmod 600 email_forwarder.php # فقط مالک میتواند بخواند/بنویسد chmod 644 *.log # لاگها برای مالک قابل خواندن chown www-data:www-data *.log # مالکیت مناسب

3. استفاده از متغیرهای محیطی

برای محیطهای تولید، از متغیرهای محیطی استفاده کنید:

$imapPass = getenv('EMAIL_PASSWORD') ?: 'fallback-password';

4. رمزگذاری SSL/TLS

همیشه از ارتباطات رمزگذاری شده استفاده کنید:

$smtpSecure: 'ssl', // پورت 465 // یا $smtpSecure: 'tls', // پورت 587

بهینهسازی عملکرد

پردازش دستهای

به جای اتصال متوالی به هر حساب، میتوان پردازش موازی با pcntl_fork() انجام داد:

foreach ($this->config->accounts as $account) { $pid = pcntl_fork(); if ($pid == 0) { // پردازش فرزند $this->processAccount($account); exit(0); } }

استفاده مجدد از اتصالها

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

imap_reopen($this->connection, $newMailboxPath);

مدیریت لاگ بهینه

چرخش لاگها را برای جلوگیری از رشد بیپایان پیاده کنید:

# اضافه به crontab 0 0 * * 0 tail -n 10000 /path/to/forwarded_emails.log > temp.log && mv temp.log /path/to/forwarded_emails.log

رفع مشکلات رایج

مشکل 1: خطای احراز هویت

علائم:

Error: Cannot connect to IMAP: Authentication failed

راهحلها:

  • بررسی صحت اطلاعات ورود

  • فعال بودن IMAP در تنظیمات سرویس ایمیل

  • استفاده از رمز مخصوص برنامه

  • اطمینان از دسترسی سرور به IP شما

مشکل 2: تایماوت اتصال SMTP

علائم:

Error: Failed to forward: SMTP connect() failed

راهحلها:

  • بررسی قوانین فایروال برای پورتهای SMTP

  • بررسی آدرس و پورت سرور SMTP

  • تست روش رمزگذاری متفاوت (SSL vs TLS)

  • اطمینان از عدم بلوک شدن اتصال SMTP توسط هاستینگ

مشکل 3: پر شدن حافظه

علائم:

Fatal error: Allowed memory size exhausted

راهحلها:

  • پردازش ایمیلها در دستههای کوچکتر

  • افزایش محدودیت حافظه PHP در php.ini

  • پیادهسازی پاکسازی سریعتر ایمیلهای پردازش شده

نظارت و نگهداری

نظارت روزانه

لاگها را به طور منظم بررسی کنید:

# مشاهده فورواردهای اخیر tail -n 50 /path/to/forwarded_emails.log # بررسی خطاها tail -f /path/to/error_log.txt # شمارش ایمیلهای پردازش شده امروز grep "$(date +%Y-%m-%d)" forwarded_emails.log | wc -l

کارهای هفتگی

  1. بررسی لاگ خطاها

  2. بررسی فضای ذخیره

  3. اطمینان از صحت فوروارد

  4. بهروزرسانی رمزها

نگهداری ماهانه

  1. آرشیو لاگهای قدیمی

  2. بررسی نیاز به حسابها

  3. بهروزرسانی وابستگیها (PHPMailer و PHP)

  4. بررسی زمان پردازش و بهینهسازی

ویژگیهای پیشرفته پیشنهادی

1. فیلترینگ هوشمند

private function shouldForward(array $emailData): bool { if (stripos($emailData['subject'], 'viagra') !== false) { return false; } if (stripos($emailData['subject'], '[URGENT]') !== false) { return true; } return true; }

2. مدیریت پیوستها

private function processAttachments(int $emailNumber): array { $structure = imap_fetchstructure($this->connection, $emailNumber); $attachments = []; if (isset($structure->parts)) { foreach ($structure->parts as $partNum => $part) { if ($part->ifdisposition && $part->disposition === 'ATTACHMENT') { $attachments[] = [ 'name' => $part->dparameters[0]->value, 'size' => $part->bytes ]; } } } return $attachments; }

3. ذخیره در پایگاه داده

private function logToDatabase(array $emailData): void { $pdo = new PDO('mysql:host=localhost;dbname=email_forwarder', 'user', 'pass'); $stmt = $pdo->prepare(" INSERT INTO forwarded_emails (account_name, subject, from_address, forwarded_at) VALUES (?, ?, ?, NOW()) "); $stmt->execute([ $emailData['account_name'], $emailData['original_subject'], $emailData['from'] ]); }

4. اعلان Webhook

private function sendWebhookNotification(array $emailData): void { $webhook_url = 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'; $message = [ 'text' => "ایمیل جدید: {$emailData['subject']} از {$emailData['from']}" ]; $ch = curl_init($webhook_url); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($message)); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_exec($ch); curl_close($ch); }

معیارهای عملکرد

در محیط تست با 5 حساب ایمیل، هر حساب حدود 100 ایمیل در روز پردازش میکند:

  • میانگین زمان پردازش: 2-3 ثانیه برای هر ایمیل

  • مصرف حافظه: حداکثر 50MB

  • مصرف CPU: بسیار کم (< 1% متوسط)

  • نرخ موفقیت: 99.7% (با احتساب خطاهای موقت SMTP)

  • رشد فایل لاگ: تقریبا 50KB در روز

نتیجهگیری

ساخت یک فوروارد ایمیل چند حسابه با PHP 8 مدرن، نشان میدهد اتوماسیون سمت سرور چقدر قدرتمند است. این راهکار ارائه میدهد:

✅ مدیریت متمرکز: تمام حسابهای ایمیل را از یک مکان مدیریت کنید
✅ پاکسازی خودکار: صندوق ایمیلها را بدون دخالت دستی مرتب نگه دارید
✅ دید کامل: هر ایمیل فوروارد شده را با گزارشهای جامع پیگیری کنید
✅ آماده برای تولید: مدیریت خطا و ویژگیهای امنیتی قوی
✅ معماری مقیاسپذیر: افزودن حسابها و ویژگیهای جدید آسان است

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

کد کامل منبع در GitHub موجود است و شما میتوانید آن را برای نیازهای خود سفارشی کنید. اگر ویژگی یا بهینهسازی جالبی پیادهسازی کردید، خوشحال میشوم در نظرات بدانم!

https://github.com/arvinlp/php-email-forwarder


برچسبها: #PHP #اتوماسیون_ایمیل #IMAP #SMTP #DevOps #Automation #PHP8 #توسعه_وب #مدیریت_ایمیل #مدیریت_سیستم


سوالی یا پیشنهادی دارید؟ در نظرات بنویسید! اگر این مقاله مفید بود، لطفاً آن را لایک و با دیگران به اشتراک بگذارید.


مدیریترمز عبورphp
۲
۰
آروین لری پور
آروین لری پور
برنامه نویس و طراح وب سایت و اپلیکشن های آندروید و iOS جهت آشنایی بیشتر به وب سایت من مراجعه کنید.
شاید از این پست‌ها خوشتان بیاید