گیک فارسی

نوشته های یک گیک فارسی از فعالیت ها ،‌ علاقه مندی ها و نقد هایش

ارسال ایمیل از طریق حساب کاربری Gmail با PHP (پی اچ پی) از طریق SMTP

13 دیدگاه‌ها

توی خیلی از انجمن‌های برنامه نویسی به این سؤال برخوردم که چطور باید با PHP از حساب کاربری Gmail ایمیل ارسال کنیم. عده‌ای هم که میدونستند چطور باید این کار را بکنند اکثر ناموفق بودند. تصمیم گرفتم این مطلب را بنویسم تا مشکل خیلی از دوستان حل بشه.

برای ارسال ایمیل از Gmail برخلاف حالتی که از طریق وب سرور و یک MTA مثل Sendmail ایمیل ارسال میکنیم ، باید از SMTP استفاده کنیم. لازم هم نیست خیلی در مورد SMTP بدونیم و کلاس PHPMailer به خوبی SMTP را پشتیبانی میکنه. پس اولین کار اینه که PHPMailer را دانلود کنیم و بسته به مسیری که قرار دادیمش توی فایل ارسال ایمیل صداش کنیم. حواستون باشه که توی Package ی که دانلود میکنید یک فایل smtp.php هم هست که باید اون را هم در کنار فایل phpmailer.php قرار بدین.

دو نکته مهم :

۱ – اولین نکته مهمی که در رابطه با Gmail وجود داره این هست که Gmail از SSL/TLS استفاده میکنه.TLS روی پورت 587 هست و توی کد بایستی به درستی تنظیم بشه.

۲ – دومین نکته مهمی که وجود داره بحث امنیت بالای خود Gmail هست. Gmail به شدت روی IP درخواست های ورود (در حالت SMTP هم شما مثل وب Login میکنید) حساس هست و مثلاً اگه شما از حساب Gmail خودتون توی ایران استفاده میکنید و سعی کنید با SMTP یک ایمیل از سرر خودون که مثلاً در انگلستان هست ارسال کنید. ۹۹ درصد Gmail مانع از Authentication پرتوکل SMTP میشه و خطای Authentication خواهید گرفت. یک ایمیل هم با افتخار از Gmail براتون ارسال میشه که شخص دیگری با پسورد صحیح شما از یک جای دیگه سعی کرده وارد بشه و ما جلوش را گرفتیم !!! :(. این موضوع دو تا راه حل داره :

راه حل اول : حساب کاربری Gmail را روی سرور خودتون بسازین و همیشه هم از همون سرور و IP درخواست SMTP بدین.

راه حل دوم : توی تنظیمات حساب کاربری گوگل در بخش Security → Account Permissions آیتم Access for less secure apps را Enabled کنین (این تغییر تا زمان نوشته شدن این مطلب وجود داشت و ممکنه بعد از مدتی مکانش یا حالتش عوض بشه یا حتی gmail بخواد که شما IP های معتبر مد نظرتون را تعیین کنین).

و اما کد :

 error_reporting(E_ALL);
 ini_set('display_errors','1');

 require("phpmailer.php");
 
 $mailObj = new phpmailer();
 $mailObj->IsSmtp();
 $mailObj->SMTPSecure = "tls";
 $mailObj->Host = "smtp.gmail.com";
 $mailObj->Port = "587";
 $mailObj->SMTPAuth = true;
 $mailObj->Username = "username@gmail.com";
 $mailObj->Password = "password";
 $mailObj->SMTPDebug = true; 
 $mailObj->CharSet = "utf-8";
 $mailObj->FromName = "Fullname";
 $mailObj->From = "username@gmail.com";
 $mailObj->AddAddress("recipient@domain.com",""); 
 $mailObj->Subject = "=?UTF-8?B?".base64_encode("عنوان فارسی نامه")."?=";
 $mailObj->Body = "متن نامه";
 $mailObj->Send();
 
 if ($mailObj->ErrorInfo != "")
 throw new Exception($mailObj->ErrorInfo);
 else 
 echo "Mail sent.";
 
 unset($mailObj);

پی نوشت : با وجود بررسی و دقتی که من در چگونگی حل مشکل ارسال از طریق Gmail SMTP داشتم باز هم یکی از دوستان مشکل داشتند که پس از بررسی متوجه ۲ نکته شدم ، توجه داشته باشید که فقط زمانی این دو نکته را اعمال کنید که خطای Authentication Failure بگیرین یا توی برگشتی Debug جمله Please log in via your web browser بگیرین و در ضمن اگه نکته ۱ مشکل را حل کرد نیاز به اعمال نکته ۲ نیست :

نکته ۱ : پس از ورود به حساب gmail روی این لینک https://www.google.com/accounts/DisplayUnlockCaptcha کلیک کنید و Accept کنید.
نکته ۲ : گذرواژه خودتون را عوض کنید و گذرواژه‌ای شامل حروف کوچک و بزرگ ، اعداد و علایم با طول حداقل ۸ کاراکتر انتخاب کنید.



برچسب‌ها:

  1. عباس گفت:

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

    1. یونیک گفت:

      شما لطف دارین.

  2. محمد گفت:

    برای حل مشکل لاگین میتونین از App Password استفاده کنین
    https://support.google.com/accounts/answer/185833?hl=en

  3. هادی گفت:

    لطفا سورسشو بزارید

    1. یونیک مدیر گفت:

      متوجه نمیشم. من که سورس کدش را گذاشتم.

  4. میلاد گفت:

    سلام و ممنون از پستی که گذاشتید.

    من مسالم چیز دیگری است و در واقع موقع ارسال خطای دیگری میگیرم که مربوطه به connection هست!

    من اسکریپمو روی سرور VPS اجرا میکنم و بعد از حدود یک دقیقه تاخیر پیام خطای زیر رو میگیرم:

    SMTP ERROR: Failed to connect to server: Network is unreachable (101)
    SMTP connect() failed.

    نظری دارید؟
    به نظر شما این به تنظیمات سرور من ربط داره؟!

    1. یونیک مدیر گفت:

      به نظر من باید روی یک سرور دیگه بررسی کنید. احتمال میدم مشکل از سرور شما باشه و ممکنه Gmail در واقع IP شما را Banned کرده باشه.

  5. miss nami گفت:

    با سلام
    من از library email کدیگنایتر استفاده میکنم همه ی نکاتی هم که ذکر کردید و توی کلاسش ست کردم.اولش خطای authentication میداد رمزم و عوض کردم تنظیمات جی میلی که در بالا ذکر کردید و انجام دادم.الان دیگه هیچ پیغام خطایی نمیده ولی متاسفانه هیچ ایمیلی هم ارسال نمیکنه درصورتی که ادعا میکنه ایمیل فرستاده شده.تنطیمات ومپ سرور هم انجام دادم .و فایل sendmail و اضافه کردم.اما موفق نبودم.بنظرتون مشکل از کجاست؟
    از کجا میتونم بفهمم که جی میل،IP منو Banned کرده؟؟؟؟؟؟؟

    1. یونیک مدیر گفت:

      متاسفانه از Code Igniter تا حالا استفاده نکردم. به نظرم بهتره از همون PHPMailer استفاده کنید و بررسی کنید ببینین چه خطایی میگیرین یا شاید بدون مشکل ارسال شد. خیلی بعیده که مشکل از banned شدن باشه اما میتونین از طیق این لینک مشکلات ارسال ایمیل را با گوگل حل کنید.

  6. hani گفت:

    ممنون به خاطر سایت خوبتون
    من هنگام ارسال ایمیل خطای Message could not be sent.Mailer Error: Invalid address: (From): root@localhost واسم میاد
    میدونین علتش چیه؟

    1. یونیک مدیر گفت:

      شما آدرس From را root@localhost زدین ! و طبیعیه که خطا میده. باید آدرس ایمیل From صحیح باشه و برای سرویس دهنده SMTP معتبر باشه ، شما از طریق Google نمیتونید با From یک آدرس دیگه ایمیل ارسال کنید چون Google یک Open Relay نیست و برای استفاده از SMTP نام کاربری و گذرواژه ازتون میخواد که باید مربوط به همون آدرس ایمیل From باشه.

  7. حامد گفت:

    سلام
    ممنون از اطلاعات خوبی که داده اید
    ممکنه بفرمایید چطور میتونم با php و پرتکول pop3 به inbox دسترسی پیدا کنم.
    در واقع ایمیل دریافت کنم؟

    1. یونیک مدیر گفت:

      به نظرم POP3 قدیمی شده و الان همه سرویس دهنده ها از IMAP پشتیبانی میکنند ، برای IMAP از این نمونه کد استفاده کنین:
      http://www.wellho.net/resources/ex.php4?item=h401/mailme.php

      اگه وقت پیدا کنم حتما خودم یک نمونه از خودم توی وبلاگ میگذارم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *