learn

ارسال ایمیل با PHP و SMTP؛ نمونه امن با PHPMailer

راهنمای ارسال پیام آزمایشی از برنامهٔ PHP با کتابخانهٔ نگهداری‌شده و تنظیمات واقعی ارائه‌دهنده.

ارسال ایمیل با PHP و SMTP به سرور ارسال، روش احراز هویت و اتصال رمزگذاری‌شدهٔ درست نیاز دارد. SMTP برای انتقال پیام است؛ خواندن صندوق ورودی معمولاً با IMAP یا POP3 انجام می‌شود. نمونهٔ این مقاله برای ارسال یک پیام آزمایشی است و سرویس ایمیل یا فرم عمومی آماده ایجاد نمی‌کند.

پیش‌نیاز ارسال ایمیل با PHP و SMTP

از ارائه‌دهنده، نام سرور، پورت، نوع TLS، نام کاربری و روش مجاز احراز هویت را بگیرید. آدرس From هم باید برای همان حساب یا دامنه مجاز باشد. پورت 25 را صرفاً به دلیل دیدن آن در آموزش قدیمی انتخاب نکنید.

در پروژهٔ PHP با نسخهٔ پشتیبانی‌شده و سازگار، نصب PHPMailer را با Composer انجام دهید. فرمان زیر را در پوشهٔ پروژه اجرا می‌کنید؛ فایل autoload در پوشهٔ vendor ساخته می‌شود.

composer require phpmailer/phpmailer

نمونهٔ پیام متنی با STARTTLS

این مثال برای سرویسی است که احراز هویت نام کاربری/رمز و STARTTLS روی 587 را پشتیبانی می‌کند. متغیرهای محیطی را در تنظیمات محافظت‌شدهٔ اجرای برنامه قرار دهید؛ نه در مخزن عمومی یا صفحهٔ وب. نشانی مقصد نمونه را با صندوق آزمایشی متعلق به خودتان عوض کنید.

<?php
use PHPMailer\PHPMailer\PHPMailer;
require __DIR__ . '/vendor/autoload.php';

$settings = [];
foreach (['SMTP_HOST', 'SMTP_USER', 'SMTP_PASS', 'MAIL_FROM'] as $key) {
    $value = getenv($key);
    if ($value === false || $value === '') {
        throw new RuntimeException('Missing mail configuration');
    }
    $settings[$key] = $value;
}

try {
    $sender = new PHPMailer(true);
    $sender->isSMTP();
    $sender->Host = $settings['SMTP_HOST'];
    $sender->SMTPAuth = true;
    $sender->Username = $settings['SMTP_USER'];
    $sender->Password = $settings['SMTP_PASS'];
    $sender->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $sender->Port = 587;
    $sender->CharSet = 'UTF-8';
    $sender->SMTPDebug = 0;
    $sender->setFrom($settings['MAIL_FROM'], 'Website');
    $sender->addAddress('test@example.net');
    $sender->Subject = 'آزمایش ارسال';
    $sender->Body = 'این پیام برای بررسی اتصال ارسال شده است.';
    $sender->send();
    echo 'پیام به سرویس ارسال تحویل شد.';
} catch (\PHPMailer\PHPMailer\Exception $error) {
    error_log('SMTP submission failed');
    echo 'ارسال انجام نشد؛ گزارش خصوصی سرویس بررسی شود.';
}

نمونه را پشت دسترسی محدود یا در اجرای مدیریتی استفاده کنید؛ قرار دادن آن در URL عمومی قابل تکرار، امکان سوءاستفاده از ارسال را ایجاد می‌کند. برای فرم تماس، اعتبارسنجی ورودی، کنترل نرخ و کنترل درخواست لازم است. گیرنده را مستقیماً از ورودی دلخواه بازدیدکننده نگیرید.

پورت و روش ورود را با سرویس هماهنگ کنید

اگر سرویس TLS ضمنی روی 465 می‌خواهد، هم پورت و هم مقدار رمزگذاری باید متناسب با SMTPS تنظیم شوند؛ تغییر تنها عدد پورت کافی نیست. برخی سرویس‌ها رمز کاربردی یا OAuth می‌خواهند. رمز معمول حساب الزاماً قابل استفاده نیست و مثال بالا جریان OAuth را پیاده‌سازی نمی‌کند.

وقتی ارسال شکست می‌خورد

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

جزئیات عیب‌یابی فقط در محیط کنترل‌شده و گزارش خصوصی بررسی شود؛ آن را در پاسخ عمومی چاپ نکنید. رمز، توکن و دادهٔ گیرنده را از گزارش اشتراکی حذف کنید. موفقیت ارسال نیز تضمین قرارگرفتن در Inbox نیست؛ وضعیت تحویل، پیام برگشتی و احراز هویت دامنه جدا بررسی می‌شوند. مستند mail در PHP هم تفاوت پذیرش پیام و رسیدن آن به مقصد را یادآوری می‌کند.

مطالعهٔ مرتبط

بازبینی فنی: ۱۳ آبان ۱۴۰۵. تاریخ انتشار اولیه و نشانی قبلی حفظ شده‌اند.

مطالب مرتبط

ارسال نظر

فهرست مطالب