
در دنیای دیجیتال امروز، مدیریت چندین حساب ایمیل میتواند بسیار گیجکننده باشد. چه شما صاحب کسبوکار باشید که ایمیلهای مختلف شرکت را مدیریت میکنید، چه یک فریلنسر که با مشتریان در ارتباط هستید، یا فقط کسی که میخواهد صندوق ورودی خود را متمرکز کند، داشتن یک سیستم خودکار فوروارد ایمیل ارزشمند است.
در این مقاله، من شما را گام به گام با ساخت یک سیستم پیشرفته و آماده برای تولید فوروارد ایمیل با استفاده از ویژگیهای مدرن PHP 8 راهنمایی میکنم. این فقط یک اسکریپت ایمیل ساده نیست؛ بلکه یک راهکار قدرتمند است که چندین حساب را مدیریت میکند، اسپمها را پردازش میکند، ایمیلهای قدیمی را به صورت خودکار پاک میکند و گزارشدهی کامل ارائه میدهد.
ممکن است بپرسید: «چرا از قابلیت فوروارد Gmail استفاده نکنیم؟» دلایل متقاعدکنندهای وجود دارد:
مدیریت چند حساب: مدیریت تعداد نامحدود حساب ایمیل با یک اسکریپت
پردازش اسپم: فوروارد ایمیلهای اسپم به صندوق مانیتورینگ جداگانه
پاکسازی خودکار: حذف خودکار ایمیلهای فوروارد شده بعد از مدت زمان مشخص
منطق سفارشی: پیادهسازی قوانین فیلتر و مسیریابی دلخواه
کنترل حریم خصوصی: نگهداری دادههای ایمیل روی سرور خودتان
گزارشدهی کامل: پیگیری هر ایمیل فوروارد شده با گزارشهای دقیق
سیستم ما بر اساس سه جزء اصلی ساخته شده است:
هر حساب ایمیل یک شیء پیکربندی مستقل با تنظیمات خودش دارد:
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 )
هسته سیستم، تمام حسابهای فعال را مرور میکند، ایمیلهای خوانده نشده را پردازش کرده، فوروارد میکند و عملیات پاکسازی را انجام میدهد.
یک سیستم گزارشدهی دوگانه که ایمیلهای فوروارد شده و خطاها را جداگانه ثبت میکند تا نظارت و عیبیابی آسان باشد.
از ویژگیهای جدید 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);
سیستم ایمیلها را هوشمندانه پردازش میکند:
پردازش بر اساس پوشه: بررسی INBOX، Junk و Spam
برچسبگذاری هوشمند: افزودن شناسه حساب و علامت اسپم به موضوع ایمیلها
حفظ متادیتا: شامل فرستنده اصلی، تاریخ و پوشه
مدیریت انکدینگ: دیکد صحیح موضوع و متن ایمیلها با انواع انکدینگ
یکی از ویژگیهای قدرتمند، پاکسازی خودکار است:
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
سناریو: یک کسبوکار کوچک با ایمیلهای مختلف بخشها (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'], // ... سایر پیکربندی ), ];
سناریو: تیم امنیتی میخواهد ایمیلهای اسپم را برای شناسایی حملات فیشینگ بررسی کند و صندوق اصلی پاک بماند.
راهحل: پردازش پوشه Junk را فعال کرده و اسپمها را به یک صندوق امنیتی جداگانه فوروارد کنید.
new EmailAccount( name: 'Company-Security', processJunk: true, foldersToCheck: ['INBOX', 'Junk', 'Spam'], forwardTo: ['security-monitoring@company.com'], // ایمیلها با پیشوند [JUNK] علامتگذاری میشوند )
سناریو: یک فریلنسر نیاز دارد ایمیلهای مشتریان را به مدت 7 روز نگه دارد و سپس به صورت خودکار پاک کند تا فضای ذخیره صرفهجویی شود.
راهحل: دوره حذف را 7 روز تنظیم کنید و سیستم به صورت خودکار ایمیلهای قدیمی را پاک کند.
$config = new EmailForwarderConfig( accounts: $accounts, deleteAfterForward: true, deleteAfterDays: 7 // نگهداری ایمیلها به مدت یک هفته );
قبل از شروع، مطمئن شوید که دارید:
PHP 8.0 یا بالاتر
افزونه IMAP فعال
Composer برای مدیریت وابستگیها
دسترسی به تنظیمات IMAP و SMTP سرور ایمیل
composer require phpmailer/phpmailer
در 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
پیکربندی خود را در اسکریپت ایجاد کنید:
$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 ), ];
برای اجرای خودکار، آن را به crontab اضافه کنید:
# اجرا هر 15 دقیقه */15 * * * * /usr/bin/php /path/to/email_forwarder.php >> /path/to/cron.log 2>&1
هرگز از رمز عبور اصلی ایمیل در اسکریپت استفاده نکنید. اکثر سرویسها (Gmail، Outlook و غیره) رمز مخصوص برنامه ارائه میدهند.
برای Gmail:
فعال کردن احراز هویت دو مرحلهای
رفتن به تنظیمات امنیتی
ایجاد App Password
استفاده از این رمز در اسکریپت
اسکریپت و لاگها را محافظت کنید:
chmod 600 email_forwarder.php # فقط مالک میتواند بخواند/بنویسد chmod 644 *.log # لاگها برای مالک قابل خواندن chown www-data:www-data *.log # مالکیت مناسب
برای محیطهای تولید، از متغیرهای محیطی استفاده کنید:
$imapPass = getenv('EMAIL_PASSWORD') ?: 'fallback-password';
همیشه از ارتباطات رمزگذاری شده استفاده کنید:
$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
علائم:
Error: Cannot connect to IMAP: Authentication failed
راهحلها:
بررسی صحت اطلاعات ورود
فعال بودن IMAP در تنظیمات سرویس ایمیل
استفاده از رمز مخصوص برنامه
اطمینان از دسترسی سرور به IP شما
علائم:
Error: Failed to forward: SMTP connect() failed
راهحلها:
بررسی قوانین فایروال برای پورتهای SMTP
بررسی آدرس و پورت سرور SMTP
تست روش رمزگذاری متفاوت (SSL vs TLS)
اطمینان از عدم بلوک شدن اتصال SMTP توسط هاستینگ
علائم:
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
بررسی لاگ خطاها
بررسی فضای ذخیره
اطمینان از صحت فوروارد
بهروزرسانی رمزها
آرشیو لاگهای قدیمی
بررسی نیاز به حسابها
بهروزرسانی وابستگیها (PHPMailer و PHP)
بررسی زمان پردازش و بهینهسازی
private function shouldForward(array $emailData): bool { if (stripos($emailData['subject'], 'viagra') !== false) { return false; } if (stripos($emailData['subject'], '[URGENT]') !== false) { return true; } return true; }
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; }
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'] ]); }
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 مدرن، نشان میدهد اتوماسیون سمت سرور چقدر قدرتمند است. این راهکار ارائه میدهد:
✅ مدیریت متمرکز: تمام حسابهای ایمیل را از یک مکان مدیریت کنید
✅ پاکسازی خودکار: صندوق ایمیلها را بدون دخالت دستی مرتب نگه دارید
✅ دید کامل: هر ایمیل فوروارد شده را با گزارشهای جامع پیگیری کنید
✅ آماده برای تولید: مدیریت خطا و ویژگیهای امنیتی قوی
✅ معماری مقیاسپذیر: افزودن حسابها و ویژگیهای جدید آسان است
چه مدیریت ایمیلهای کسبوکار، چه یکپارچهسازی حسابهای شخصی یا ساخت سیستم مانیتورینگ ایمیل، این رویکرد کنترل کامل بر جریان ایمیل شما میدهد.
https://github.com/arvinlp/php-email-forwarder
برچسبها: #PHP #اتوماسیون_ایمیل #IMAP #SMTP #DevOps #Automation #PHP8 #توسعه_وب #مدیریت_ایمیل #مدیریت_سیستم
سوالی یا پیشنهادی دارید؟ در نظرات بنویسید! اگر این مقاله مفید بود، لطفاً آن را لایک و با دیگران به اشتراک بگذارید.