آموزش ارسال ایمیل با PHP

آموزش ارسال ایمیل در PHP

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

پیش‌نیازها

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

  • نصب PHP 7.4 یا بالاتر روی سیستم شما
  • Composer برای مدیریت وابستگی‌ها
  • SQLite
  • یک حساب Gmail

مرحله 1: تنظیم پروژه

ابتدا، یک پوشه جدید برای پروژه خود ایجاد کرده و وارد آن شوید:

mkdir php-registration-system
cd php-registration-system

نصب وابستگی‌ها

از Composer برای نصب PHPMailer استفاده کنید:

composer require phpmailer/phpmailer

مرحله 2: ایجاد پایگاه داده

قبل از اینکه به کد اصلی بپردازیم، باید پایگاه داده SQLite خود را ایجاد کنیم. یک فایل به نام create-database.php ایجاد کنید و کد زیر را در آن قرار دهید:

<?php

try {
    // ایجاد اتصال به پایگاه داده SQLite
    $db = new PDO('sqlite:users.db');

    // ایجاد جدول کاربران
    $db->exec("CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY,
        name TEXT,
        phone TEXT,
        email TEXT,
        description TEXT
    )");

    echo "Database and table created successfully.";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

این فایل را اجرا کنید تا پایگاه داده و جدول کاربران ایجاد شوند:

php create-database.php

مرحله 3: نوشتن اسکریپت API

یک فایل به نام api.php ایجاد کنید و کد زیر را در آن قرار دهید:

<?php

// تنظیم هدر برای پاسخ JSON
header('Content-Type: application/json');

// لود کردن فایل autoload.php از طریق Composer
require 'vendor/autoload.php'; 

// استفاده از کلاس‌های PHPMailer
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

// ذخیره آدرس ایمیل و رمز عبور در متغیرهای سراسری
$GLOBALS['mail_address'] = 'your-email@gmail.com';
$GLOBALS['mail_password'] = 'your-app-password';

// تعریف تابع برای ارسال ایمیل تاییدیه
function sendConfirmationEmail($email, $name, $phone, $description)
{
    // ایجاد نمونه‌ای از PHPMailer
    $mail = new PHPMailer(true);

    try {
        // تنظیمات سرور
        $mail->isSMTP();
        $mail->Host = 'smtp.gmail.com';
        $mail->SMTPAuth = true;
        $mail->Username = $GLOBALS['mail_address'];
        $mail->Password = $GLOBALS['mail_password'];
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
        $mail->Port = 587;

        // گیرندگان
        $mail->setFrom('your-email@gmail.com', 'Your Name');
        $mail->addAddress($email, $name);

        // محتوا
        $mail->isHTML(true);
        $mail->Subject = 'Registration Confirmation';
        $mail->Body = "Hello $name,<br><br>Your registration with the following details has been received:<br><br>"
            . "Phone: $phone<br>"
            . "Email: $email<br>"
            . "Description: $description<br><br>"
            . "Thank you!";
        $mail->AltBody = "Hello $name,\n\nYour registration with the following details has been received:\n\n"
            . "Phone: $phone\n"
            . "Email: $email\n"
            . "Description: $description\n\n"
            . "Thank you!";

        // ارسال ایمیل
        $mail->send();
        return true;
    } catch (Exception $e) {
        error_log('Mailer Error: ' . $mail->ErrorInfo);
        return $mail->ErrorInfo;
    }
}

try {
    // ایجاد اتصال به پایگاه داده SQLite
    $db = new PDO('sqlite:users.db');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // خواندن ورودی JSON
    $input = json_decode(file_get_contents(''), true);

    // بررسی صحت ورودی
    if (!isset($input['name'], $input['phone'], $input['email'], $input['description'])) {
        throw new Exception('Invalid input');
    }

    // آماده‌سازی و اجرای دستور SQL برای درج داده‌ها در جدول کاربران
    $stmt = $db->prepare("INSERT INTO users (name, phone, email, description) VALUES (:name, :phone, :email, :description)");
    $stmt->bindParam(':name', $input['name']);
    $stmt->bindParam(':phone', $input['phone']);
    $stmt->bindParam(':email', $input['email']);
    $stmt->bindParam(':description', $input['description']);
    $stmt->execute();

    // ارسال ایمیل تاییدیه
    $emailStatus = sendConfirmationEmail($input['email'], $input['name'], $input['phone'], $input['description']);
    if ($emailStatus === true) {
        echo json_encode(['status' => 'success', 'message' => 'User registered and email sent']);
    } else {
        echo json_encode(['status' => 'success', 'message' => 'User registered but email not sent', 'error' => $emailStatus]);
    }
} catch (Exception $e) {
    error_log('Error: ' . $e->getMessage());
    echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}

?>

توضیحات کد

تنظیم هدر برای پاسخ JSON:

header('Content-Type: application/json');

این خط، هدر پاسخ HTTP را به application/json تنظیم می‌کند تا مرورگر یا کلاینت بداند که محتوای پاسخ JSON است.

لود کردن فایل autoload.php از طریق Composer:

require 'vendor/autoload.php';

این خط، فایل autoload.php را که توسط Composer ایجاد شده است، لود می‌کند تا همه وابستگی‌های پروژه به صورت خودکار لود شوند.

استفاده از کلاس‌های PHPMailer:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

این خطوط، کلاس‌های PHPMailer و Exception را به اسکریپت اضافه می‌کنند تا بتوانیم از آنها استفاده کنیم.

ذخیره آدرس ایمیل و رمز عبور در متغیرهای سراسری:

$GLOBALS['mail_address'] = 'your-email@gmail.com';
$GLOBALS['mail_password'] = 'your-app-password';

این خطوط، آدرس ایمیل و رمز عبور (رمز عبور اپلیکیشن) را در متغیرهای سراسری ذخیره می‌کنند تا در سایر قسمت‌های کد قابل دسترسی باشند.

تعریف تابع برای ارسال ایمیل تاییدیه:

function sendConfirmationEmail($email, $name, $phone, $description)

این تابع اطلاعات ثبت‌نام (ایمیل، نام، تلفن و توضیحات) را می‌گیرد و یک ایمیل تاییدیه ارسال می‌کند.

تنظیمات سرور ایمیل:

$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = $GLOBALS['mail_address'];
$mail->Password = $GLOBALS['mail_password'];
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;

این خطوط، تنظیمات لازم برای اتصال به سرور SMTP Gmail را انجام می‌دهند.

تنظیم گیرندگان و محتوا:

$mail->setFrom('your-email@gmail.com', 'Your Name');
$mail->addAddress($email, $name);
$mail->isHTML(true);
$mail->Subject = 'Registration Confirmation';
$mail->Body = "Hello $name,
Your registration with the following details has been received:
"
. "Phone: $phone
"
. "Email: $email
"
. "Description: $description
"
. "Thank you!";
$mail->AltBody = "Hello $name,\n\nYour registration with the following details has been received:\n\n"
. "Phone: $phone\n"
. "Email: $email\n"
. "Description: $description\n\n"
. "Thank you!";

این خطوط، فرستنده، گیرنده و محتوای ایمیل را تنظیم می‌کنند.

ارسال ایمیل:

$mail->send();

این خط، ایمیل را ارسال می‌کند و در صورت موفقیت، true برمی‌گرداند. در صورت بروز خطا، خطا ثبت و جزئیات آن بازگشت داده می‌شود.

اتصال به پایگاه داده SQLite:

$db = new PDO('sqlite:users.db');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

این خطوط، اتصال به پایگاه داده SQLite را برقرار و حالت خطای PDO را به استثناها تنظیم می‌کنند.

خواندن ورودی JSON:

این خط، داده‌های JSON دریافت شده را خوانده و به آرایه PHP تبدیل می‌کند.

بررسی صحت ورودی:

if (!isset($input['name'], $input['phone'], $input['email'], $input['description'])) {
throw new Exception('Invalid input');
}

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

درج داده‌ها در پایگاه داده:

$stmt = $db->prepare("INSERT INTO users (name, phone, email, description) VALUES (:name, :phone, :email, :description)");

$stmt->bindParam(':name', $input['name']);
$stmt->bindParam(':phone', $input['phone']);
$stmt->bindParam(':email', $input['email']);
$stmt->bindParam(':description', $input['description']);
$stmt->execute();

این خطوط، یک دستور SQL برای درج داده‌های کاربر در جدول users آماده و اجرا می‌کنند.

ارسال ایمیل تاییدیه:

$emailStatus = sendConfirmationEmail($input['email'], $input['name'], $input['phone'], $input['description']);

if ($emailStatus === true) {
echo json_encode(['status' => 'success', 'message' => 'User registered and email sent']);
} else {
echo json_encode(['status' => 'success', 'message' => 'User registered but email not sent', 'error' => $emailStatus]);
}

مرحله 4: ایجاد فرم HTML با استفاده از Bootstrap

یک فایل به نام index.html ایجاد کنید و کد زیر را در آن قرار دهید:

<!DOCTYPE html>
<html lang="fa">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ثبت نام کاربر</title>
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container mt-5">
        <h2 class="text-center">ثبت نام کاربر</h2>
        <form id="registrationForm">
            <div class="form-group">
                <label for="name">نام</label>
                <input type="text" class="form-control" id="name" placeholder="نام خود را وارد کنید" required>
            </div>
            <div class="form-group">
                <label for="phone">تلفن</label>
                <input type="text" class="form-control" id="phone" placeholder="شماره تلفن خود را وارد کنید" required>
            </div>
            <div class="form-group">
                <label for="email">ایمیل</label>
                <input type="email" class="form-control" id="email" placeholder="ایمیل خود را وارد کنید" required>
            </div>
            <div class="form-group">
                <label for="description">توضیحات</label>
                <textarea class="form-control" id="description" rows="3" placeholder="توضیحات اضافی را وارد کنید" required></textarea>
            </div>
            <button type="submit" class="btn btn-primary">ثبت نام</button>
        </form>
        <div id="response" class="mt-3"></div>
    </div>

    <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
    <script>
        $('#registrationForm').on('submit', function(event) {
            event.preventDefault();
            var formData = {
                name: $('#name').val(),
                phone: $('#phone').val(),
                email: $('#email').val(),
                description: $('#description').val()
            };

            $.ajax({
                url: 'api.php',
                type: 'POST',
                contentType: 'application/json',
                data: JSON.stringify(formData),
                success: function(response) {
                    $('#response').html('<div class="alert alert-success">' + response.message + '</div>');
                },
                error: function(jqXHR, textStatus, errorThrown) {
                    var errorMessage = jqXHR.responseJSON ? jqXHR.responseJSON.message : 'An error occurred';
                    $('#response').html('<div class="alert alert-danger">' + errorMessage + '</div>');
                }
            });
        });
    </script>
</body>
</html>

مرحله 5: تست سیستم

پس از ایجاد فایل‌ها، سرور محلی خود را اجرا کنید:

php -S localhost:8000

سپس مرورگر خود را باز کرده و به آدرس http://localhost:8000/index.html بروید. فرم ثبت نام را پر کنید و روی دکمه “ثبت نام” کلیک کنید. اگر همه چیز به درستی تنظیم شده باشد، باید پیامی مبنی بر موفقیت‌آمیز بودن ثبت نام و ارسال ایمیل مشاهده کنید.

استفاده از POSTMAN برای تست API

POSTMAN یک ابزار عالی برای تست API های RESTful است. در این بخش، نحوه استفاده از POSTMAN برای ارسال درخواست به API ما را توضیح می‌دهیم.

مرحله 1: دانلود و نصب POSTMAN

ابتدا POSTMAN را از وب‌سایت رسمی POSTMAN دانلود و نصب کنید.

مرحله 2: تنظیم درخواست در POSTMAN

  1. باز کردن POSTMAN: پس از نصب، POSTMAN را باز کنید.
  2. ایجاد یک درخواست جدید:
    • روی دکمه New کلیک کنید و HTTP Request را انتخاب کنید.
  3. تنظیم روش HTTP و URL:
    • روش HTTP را به POST تغییر دهید.
    • URL را به http://localhost:8000/api.php تنظیم کنید (با فرض اینکه سرور محلی شما روی این آدرس اجرا می‌شود).
  4. تنظیم هدر‌ها:
    • به تب Headers بروید و هدر زیر را اضافه کنید:
Key: Content-Type
Value: application/json

تنظیم بدنه درخواست:

  • به تب Body بروید و raw و سپس JSON را انتخاب کنید.
  • بدنه درخواست را به صورت زیر تنظیم کنید:
{
     "name": "John Doe",
     "phone": "123456789",
     "email": "john.doe@example.com",
     "description": "Test registration"
}

ارسال درخواست:

  • روی دکمه Send کلیک کنید تا درخواست ارسال شود.
  • باید پاسخی مشابه زیر دریافت کنید:
{
"status": "success",
"message": "User registered and email sent"
}

استفاده از CURL برای تست API

CURL یک ابزار خط فرمان برای انتقال داده‌ها با استفاده از پروتکل‌های مختلف است. در اینجا نحوه ارسال درخواست به API با استفاده از CURL را توضیح می‌دهیم.

ارسال درخواست با CURL

دستور زیر را در ترمینال یا خط فرمان خود اجرا کنید:

curl -X POST http://localhost:8000/api.php -H "Content-Type: application/json" -d '{
"name": "John Doe",
"phone": "123456789",
"email": "john.doe@example.com",
"description": "Test registration"
}'

این دستور یک درخواست POST به http://localhost:8000/api.php ارسال می‌کند و داده‌های JSON شامل نام، شماره تلفن، ایمیل و توضیحات را به عنوان بدنه درخواست ارسال می‌کند. اگر همه چیز به درستی کار کند، باید پاسخی مشابه زیر دریافت کنید:

{
"status": "success",
"message": "User registered and email sent"
}

توضیحات دستور CURL

  • -X POST: مشخص می‌کند که این یک درخواست POST است.
  • http://localhost:8000/api.php: آدرس URL که درخواست به آن ارسال می‌شود.
  • -H "Content-Type: application/json": تنظیم هدر درخواست به application/json.
  • -d '...': داده‌های JSON که به عنوان بدنه درخواست ارسال می‌شوند.

پست های مرتبط

مطالعه این پست ها رو از دست ندین!
آموزش نصب PDO در سیستم‌های مختلف

آموزش نصب PDO در سیستم‌های مختلف

آنچه در این پست میخوانید نصب PDO بر روی سیستم‌های Unix کاربران ویندوز در این مقاله، به بررسی نحوه نصب…

بیشتر بخوانید
آموزش نصب و پیکربندی افزونه mysqli در PHP

آموزش نصب و پیکربندی افزونه mysqli در PHP

آنچه در این پست میخوانید نصب بر روی سیستم‌های لینوکس نصب با استفاده از بسته‌های موجود ساخت افزونه به صورت…

بیشتر بخوانید

نظرات

سوالات و نظراتتون رو با ما به اشتراک بذارید

برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید.