گیک فارسی

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

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

نویسنده:
2 دسامبر 14

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

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

دو نکته مهم :

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

۲ – دومین نکته مهمی که وجود داره بحث امنیت بالای خود 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 کنید.
نکته ۲ : گذرواژه خودتون را عوض کنید و گذرواژه‌ای شامل حروف کوچک و بزرگ ، اعداد و علایم با طول حداقل ۸ کاراکتر انتخاب کنید.