• 1401/04/04

ارسال ایمیل با SMTP :

استاد سلام وقتتون بخیر استاد ارسال ایمیل با gmailssmtp دیگه ممکن نیستش چئن گوگل سیاست های امنیتی خودشو تعغیر داده و دیگر گزینه google less secure به طور کامل حذف کرده شما راهی را میتونید پیشنهاد بدین برای ارسال بجر این راه؟

  • 1401/04/04
  • ساعت 19:51

سلام وقتت بخیر
با اجازه از مهندس خسروجردی، امیدوارم بتونم کمکت کنم.

این مسئله رو چند هفته پیش بهش برخوردم و با این منابع آشنا شدم که تو حلش بهم کمک کرد.

- پرسش درباره این موضوع تو استک اورفلو

- توضیح راه حل در گیت‌هاب PHPMailer

- نمونه‌ای از استفاده کد نهایی برای ارسال ایمیل در گیت‌هاب PHPMailer

سعی میکنم کارهایی که کردم رو توضیح بدم ولی باید بگم چالشی که باهاش روبرو شدی با این منابع حل میشه.

1- به این صورت هست که شما باید از روش XOAUTH2 استفاده کنی برای ارسال ایمیل با جیمیل پس باید کتابخونه league/oauth2-google رو علاوه بر PHPMailer نصب کنی.

2- بعدش لازمه که وارد دولوپر کنسول گوگل بشی و اپلیکیشن خودت رو طبق آموزشی که PHPMailer گفته (به عنوان وب اپلیکیشن تستی) ثبت کنی.

3- آدرس ایمیل خودت(همونی که میخوای باهاش ایمیل بفرستی) رو به عنوان فردی که حق تست کردن وب اپلیکشین داره ثبت کن.

4- تو پروسه ثبت کردن وب اپلیکیشن ، ازت Redirect URL میخواد، تو پوشه League که تو Vendor ایجاد شده  2 تا پوشه دیگه به نام oauth2-google و oauth2-client وجود داره. تو یکی از این پوشه‌ها یه فایلی هست به نام get_auth_token.php اون فایل رو ببر تو public قرار بده و لینک localhost برای دسترسی رو تو اون باکس بنویس. اگه طبق دوره پیش رفته باشی لینکت باید اینطوری باشه http://localhost:8000/get_oauth_token.php 

5- وب اپلیکیشنت رو ثبت میکنی، اطلاعاتی که گوگل بهت میده(ClientId, ClientSecret) رو میگیری و تو همین فایل get_oauth_token.php جاگذاری.

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

6-  http://localhost:8000/get_oauth_token.php  این لینک رو باز میکنی و روی Google کلیک میکنی و به اکانت مورد نظر که حق تست کردن وب اپلیکیشن رو دادی کلیک میکنی تا اون به برنامت وصل بشه.

7- تو همین مراحل به غیر از ClientId, ClientSecret, Redirect URL یه رفرش توکن هم بهت میده که اون رو هم باید جایی ذخیره کنی تا بتونی ازش استفاده کنی.

8- دیگه کارهایی که با گوگل لازم بود انجام بدی تموم شدن و الان لازمه تنظیمات داخلی رو دست بزنی.

<?php

namespace App\Http\Services;

use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\OAuth;
//Alias the League Google OAuth2 provider class
use League\OAuth2\Client\Provider\Google;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use System\Config\Config;

class MailService
{
    public function send($emailAddress, $subject, $body)
    {
        $mail = new PHPMailer(true);

        try {

            $mail->CharSet = 'UTF-8';
            //Server settings
            $mail->SMTPDebug = SMTP::DEBUG_SERVER;                      //Enable verbose debug output
            $mail->isSMTP();                                            //Send using SMTP
            $mail->Host       = Config::get('mail.SMTP.Host');                     //Set the SMTP server to send through
            $mail->SMTPAuth   = Config::get('mail.SMTP.SMTPAuth');                                   //Enable SMTP authentication
            $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;         //Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged
            $mail->Port       = Config::get('mail.SMTP.Port');
            $mail->AuthType = Config::get('mail.SMTP.AuthType');                                   //TCP port to connect to, use 465 for `PHPMailer::ENCRYPTION_SMTPS` above

            //Create a new OAuth2 provider instance
            $provider = new Google(
                [
                    'clientId' => Config::get('mail.SMTP.clientId'),
                    'clientSecret' => Config::get('mail.SMTP.clientSecret'),
                ]
            );

            //Pass the OAuth provider instance to PHPMailer
            $mail->setOAuth(
                new OAuth(
                    [
                        'provider' => $provider,
                        'clientId' => Config::get('mail.SMTP.clientId'),
                        'clientSecret' => Config::get('mail.SMTP.clientSecret'),
                        'refreshToken' => Config::get('mail.SMTP.refreshToken'),
                        'userName' => Config::get('mail.SMTP.setFrom.mail'),
                    ]
                )
            );

            //Recipients
            $mail->setFrom(Config::get('mail.SMTP.setFrom.mail'), Config::get('mail.SMTP.setFrom.name'));
            $mail->addAddress($emailAddress);     //Add a recipient

            //Content
            $mail->isHTML(true);                                  //Set email format to HTML
            $mail->Subject = $subject;
            $mail->Body  = $body;

            $result = $mail->send();
            return $result;
        } catch (Exception $e) {
            echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
        }
    }
}


این کدی که میبینی کل فایل MailService.php بوده که بعد از تغییرات به این شکل دراومده.

همونطور که گفتم این مورد چند هفته پیش برای من پیش اومده بود و با توجه به همون منابع حلش کردم.

حتی با خوندن اون منابع به چالش‌هایی برخورد کرده بودم که سعی کردم تو این 8 مرحله توضیح بدم تا برای دوستان دیگه مشکلی پیش نیاد.

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

 


  • 1401/04/08
  • ساعت 01:15

با سلام خدمت شما همراه عزیز

 

در همین دوره سوال مشابه پرسیدن

پاسخ هم ارائه شده

مراجعه بفرمایید

 

 

 

1- باید از قسمت گوگل اکانت، بخش security، بخش Signing in to Google، تایید دو مرحله‌ای یا two step vertification را فعال بکنید.

2-پس از ست کردن تایید دو مرحله‌ای، در همین بخش Signing in to Google، به قسمت App passwords رفته و یک پسوورد برای سرویس یا دستگاه یا برنامه‌ای که می‌خواید(PHPMailer یا هرچیز دیگه‌ای) ست کنید.(در صفحه App passwords بر روی قسمت Select app کلیک کنید و گزینه Other را انتخاب کنید، یک فیلد براتون میاره و شما باید PHPMailer یا هر اسمی که عشقتون می‌کشه را وارد کنید و سپس دکمه Generate را بفشارید، یک پسوورد 16 رقمی بهتون می‌ده.)

 

3- پسوورد مورد نظر را کپی کنید و در بخش کدنویسی پسوورد مربوط به PHPMailer وارد کنید.

 

 

موفق و سربلند باشید