המיילים לא עובדים מאתר וורדפרס?

אתר הוורדפרס שלכם לא שולח מיילים? כל המיילים שנשלחים מהאתר מוגדרים כספאם? הנה הפתרון שאתם צריכים.
לוגו וורדפרס

לא מזמן העברתי אתר אינטרנט של חברה מסביבת הסטייג'ינג לסביבת הפרודקשן. ברגע שהעברנו את האתר עשיתי בדיקת sanity שהיא בדיקה ידנית שבאמצעותה אני בודק את האתר על הסביבה החיה ופתאום גיליתי שכל המיילים מהאתר לא נשלחים. לאחר בירור מהיר התגלתה הסיבה: ישנם ספקי sharing מסוימים שחוסמים את php_mail.
php_mail היא פונקציה שמאפשרת לנו לשלוח מייל דרך PHP ובה בדרך כלל משתמשים כאשר אנו רוצים לשלוח מיילים.

א-מ-מ-ה – יש ספקים שחוסמים את האפשרות הזו. במיוחד על share. הספק הכי פופולרי שחוסם את האפשרות הזו הוא GoDaddy.

חוץ מזה, יש ספקיות אכסון מסוימות שמיילים שנשלחים מהן מסווגים כ-Spam באופן אוטומטי ואז הלקוח המסכן מצפה לקבל או לשלוח מהוורדפרס שלו מיילים אבל הם לא מגיעים אליו או ללקוחות כי הם מוגדרים כ-Spam רק בגלל שאיזה הודי קקמייקה החליט להשתמש באחד השרתים שבמקרה האתר שלו מאוחסן עליהם כבסיס נוח לשלוח מיליארדי הצעות להגדלת איברים שונים ומשונים.

באופן אישי, אני לא משתמש בשירותי ספקים בעייתיים, אבל לא תמיד יש לנו את היכולת לקבוע איפה לאחסן את האתר. זו ההזדמנות להכנס טיפה לעומק כדי להבין איך וורדפרס ומערכות אחרות שולחות את המייל ולראות איך אפשר לפתור את שתי הבעיות: וורדפרס שלא שולח מיילים ומיילים שמסווגים כספאם. הפתרון הוא לגרום למיילים להשלח באמצעות חשבון SMTP.

איך וורדפרס שולחת מיילים

באופן עקרוני, וורדפרס משתמשת ב-Class הפופולרי של PHPMailer. מדובר ב-Class שעושה אבסטרקציה נאה למשלוח PHP. הנה דוגמה טובה למשל לאיך שולחים מייל עם זה:


require '../PHPMailerAutoload.php';

//Create a new PHPMailer instance
$mail = new PHPMailer();
// Set PHPMailer to use the sendmail transport
$mail->isSendmail();
//Set who the message is to be sent from
$mail->setFrom('[email protected]', 'First Last');
//Set an alternative reply-to address
$mail->addReplyTo('[email protected]', 'First Last');
//Set who the message is to be sent to
$mail->addAddress('[email protected]', 'John Doe');
//Set the subject line
$mail->Subject = 'PHPMailer sendmail test';
//Read an HTML message body from an external file, convert referenced images to embedded,
//convert HTML into a basic plain-text alternative body
$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));
//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';
//Attach an image file
$mail->addAttachment('images/phpmailer_mini.png');

//send the message, check for errors
if (!$mail->send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
}

בגדול – די פשוט ונחמד ומפשט את כל הסיפור. לא מעט מערכות משתמשות ב-Class החביב ו-וורדפרס לא יוצאת דופן בסיפור הזה.

מערכת וורדפרס עצמה וכל תוסף שהוא משתמשים בפונקצית wp_mail על מנת לשלוח מיילים. הפונקציה הזו מתועדת היטב בדוקומנטציה של וורדפרס. הפונקציה הזו בסופו של דבר קוראת ל-Class שאותו הזכרנו קודם. אבל המתכנתים של וורדפרס איפשרו לכל מתכנת שרוצה להתחבר ל-hook מיוחד בפונקציה הזו ולשנות אותה. מתי זה שימושי? כאשר אנו זקוקים לשנות את אופן משלוח דואר מפונקצית mail של PHP לדרך אחרת. במקרה של ספק שלא מאפשר להשתמש ב-mail php אנו נצטרך חשבון מייל מוגדר שישלח באמצעות SMTP את המייל.

הגדרת חשבון מייל שתומך ב-SMTP

מה זה SMTP? זה ראשי תיבות של Simple Mail Transfer Protocol אבל בגדול זה פשוט חשבון מייל "אמיתי" שבאמצעותו אפשר לשלוח ולקבל מיילים. על מנת להגדיר את החשבון הזה אנחנו נצטרך בעצם כתובת מייל אמיתית. הכתובת הזו יכולה להיות של ג'ימייל, של ספק האינטרנט שלכם או של כל מישהו אחר. רוב ספקי האכסון (כולל GoDaddy) מאפשרים ליצור כחלק מחשבון האכסון גם מיילים. כאשר אנו יוצרים מיילים, אנו מקבלים את פרטי ה-SMTP שאפשר להתחבר באמצעותו לחשבון. הנה דוגמה אמיתית:

הגדרות SMTP שמופיעות לאחר הגדרת חשבון מייל בספק אכסון
הגדרות SMTP שמופיעות לאחר הגדרת חשבון מייל בספק אכסון

העברת פרטי חשבון ה-SMTP ל-Class של PHPMailer

את הפרטים האלו אנו לוקחים ומטמיעים ב-hook המיוחד שמתחבר ל-wp_mail. שם ה-hook הוא phpmailer_init ואנו מפעילים אותו באופן הבא:


add_action('phpmailer_init','my_smtp_special_function');

כאשר פונקצית my_smtp_special_function מעבירה פרמטר ששמו הוא $phpmailer שהוא זה שמועבר אל ה-Class של PHPMailer. אותו אנו יכולים לערוך ולשנות באופן הבא:


function my_smtp_special_function($phpmailer){
	$phpmailer->Mailer = "smtp";
	$phpmailer->From = $from;
	$phpmailer->FromName = $fromname;
	$phpmailer->Sender = $phpmailer->From; //Return-Path
	$phpmailer->AddReplyTo($phpmailer->From,$phpmailer->FromName); //Reply-To
	$phpmailer->Username = $username;
	$phpmailer->Password = $password;
}

כאשר אנו יכולים להסתייע בדוקומנטציה המאוד נוחה של PHPMailer על מנת לדעת מה לשנות ולערוך.

תוסף WP SMTP

אבל אחרי שאנחנו מבינים איך זה עובד לעומק, אנו יכולים להשתמש בתוסף וורדפרס ששמו הוא WP SMTP שעושה בדיוק את אותו הדבר. רק עם ממשק נוח. כל מה שאנו צמריכים לעשות זה להגדיר חשבון מייל (ספק האכסון למשל, או ג'ימייל, או כל ספק אחר). לקבל את פרטי ה-SMTP שבדרך כלל מופיעים בהסברים על איך מקנפגים תוכנה חיצונית לעבוד עם חשבון המייל הזה, להכניס את הפרטים בממשק הניהול הנוח:

ממשק הניהול של התוסף הנוח להגדרה של SMTP
ממשק הניהול של התוסף הנוח להגדרה של SMTP

וזה הכל! באופן עקרוני, אם הכל הוגדר כמו שצריך המייל ישלח כמו שצריך. אפשר גם באמצעות הממשק לשלוח מייל בדיקה.

פוסטים נוספים שכדאי לקרוא

פתרונות ומאמרים על פיתוח אינטרנט

עבודה עם GPT למתכנתים

אני עובד עם GPT כמה חודשים טובים באופן צמוד. הוא כלי חזק וכדאי ממש להשתמש בו, אבל יש לו גם חסרונות ומגבלות שכדאי להכיר.

גלילה לראש העמוד