WordPress ปฏิเสธที่จะส่งจดหมาย“ …โฮสต์ของคุณอาจปิดการใช้งานฟังก์ชัน mail ()”


9

ฉันเพิ่งติดตั้งส่วนแสดงความคิดเห็นบนเว็บไซต์ของฉันและพยายามรับอีเมลแจ้งเตือนให้ทำงาน ดูเหมือนจะไม่ต้องการส่งการแจ้งเตือนทางอีเมลเมื่อมีความคิดเห็นใหม่

เพื่อดูว่า PHP สามารถส่งอีเมลได้หรือไม่ฉันพยายามรีเซ็ตรหัสผ่าน (เพราะคุณจะได้รับรหัสผ่านใหม่ทางอีเมล) และฉันได้รับข้อความ:

ไม่สามารถส่งอีเมลได้ สาเหตุที่เป็นไปได้: โฮสต์ของคุณอาจปิดใช้งานฟังก์ชัน mail ()

ฉันได้ตรวจสอบช่องทำเครื่องหมายในการตั้งค่า -> การสนทนาและอีเมลนั้นถูกต้องดังนั้นจึงไม่ใช่ปัญหาการตั้งค่า ฉันพยายามสร้างไฟล์ PHP และส่งโดยใช้mail()และมันก็ส่งได้สำเร็จ ดังนั้นจะต้องมีสิ่งแปลก ๆ เกิดขึ้นกับ WordPress

ความคิดใด ๆ


คำตอบ:


9

ทีละขั้นตอน: ขั้นแรกค้นหาไฟล์ที่มีข้อความข้อผิดพลาดปรากฏขึ้น ฉันใช้ Notepad ++ และคำสั่งCTRL+ Fเพื่อค้นหาไฟล์ ขอแนะนำให้ค้นหาเฉพาะคำสองสามคำแรกของข้อความแสดงข้อผิดพลาดเนื่องจากข้อความแสดงข้อผิดพลาดบางส่วนมีการรวมกันของข้อความที่แตกต่างกัน

ข้อความแสดงข้อผิดพลาดของคุณปรากฏในwp-login.phpและโชคศักดิ์สิทธิ์เท่านั้นที่มี ดังนั้นมาดูกันว่าทำไมข้อผิดพลาดนี้อาจเกิดขึ้น

if ( $message && !wp_mail($user_email, $title, $message) )

มีสองเงื่อนไข $messageต้องเป็นจริง (ไม่ใช่สตริงว่างเปล่าไม่ใช่เท็จไม่ใช่โมฆะ ฯลฯ ) และwp_mail()ไม่ควรกลับเท็จ

หนึ่งบรรทัดด้านบนมีตัวกรอง$message = apply_filters('retrieve_password_message', $message, $key);ดังนั้นจึงเป็นไปได้ที่ปลั๊กอิน (หรือธีม) จะใช้ตัวกรองนี้และส่งคืนค่าที่ไม่เป็นความจริง (สตริงว่าง, เท็จ, null, ฯลฯ )

แต่มันง่ายกว่ามากในการตรวจสอบว่าwp_mail()ทำงานหรือไม่ เขียนปลั๊กอินขนาดเล็กเพื่อส่งเมลทดสอบให้กับตัวเอง:

<?php
/**
 * Plugin Name: Stackexchange Testplugin
 * Plugin URI:  http://yoda.neun12.de
 * Description: Send me a test email
 * Version:     0.1
 * Author:      Ralf Albert
 * Author URI:  http://yoda.neun12.de
 * Text Domain:
 * Domain Path:
 * Network:
 * License:     GPLv3
 */

namespace WordPressStackexchange;

add_action( 'init', __NAMESPACE__ . '\plugin_init' );

function plugin_init(){
    $to      = 'your-email-adress@some-domain.tld';
    $subject = 'Testemail';
    $message = 'FooBarBaz Testmail is working';

    wp_mail( $to, $subject, $message );
}

(นี่คือรหัส PHP5.3 หากคุณใช้ PHP5.2 ให้ลบสิ่งที่เป็น namespace)

ปลั๊กอินควรส่ง testmail ทันทีหลังจากเปิดใช้งาน หากไม่มีการโทรไปที่หน้าแบ็กเอนด์ (เช่นแดชบอร์ด) ควรทำ

หาก testmail wp_mail()ไม่ได้มาถึงแล้วคุณอาจมีปัญหากับ ดังนั้นเปิดการดีบัก:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );
@ini_set( 'display_errors',1 );

ใส่รหัสนี้ในของคุณwp-config.phpและลองส่ง testmail ด้วยตัวคุณเอง ตอนนี้คุณควรได้รับข้อความแสดงข้อผิดพลาดและพวกเขาก็ควรจะเข้าสู่ระบบwp-content/debug.log(บันทึกการแก้ปัญหาสามารถเติบโตขนาดใหญ่มากหากมีข้อผิดพลาดเพิ่มเติมที่เกิดจากปลั๊กอินและ / หรือธีม)

ณ จุดนี้คุณจะได้รับข้อมูลที่ดีหากwp_mail()ล้มเหลวและถ้าเป็นเช่นนั้นทำไม หากwp_mail()ทำงานอย่างถูกต้องและข้อความทดสอบมาถึงให้กลับไปที่ด้านบนและค้นหาสาเหตุที่$messageไม่เป็นความจริง

หากคุณมีปัญหาเกี่ยวกับwp_mail()โปรดจำไว้wp_mail()ว่าไม่ได้ใช้mail()ฟังก์ชันPHPs WordPress ใช้คลาส PHP ( PHPMailer ) บางทีคุณอาจต้องใช้ปลั๊กอินเพื่อใช้ SMTPแทน sendmail หรือปัญหาอยู่ที่อื่น เราไม่รู้ คุณต้องตรวจสอบ


ใช่ฉันพยายามขุดเป็นหลักและยังนำฉันไป PHPMailer และเป็นจริงไม่ของการใช้ mail()PHP อย่างน้อยในบางกรณี (ดูบรรทัดที่ 732 wp-includes/class-phpmailer.phpค่ะฉันไม่สามารถเข้าถึง ftp atm ได้ แต่ฉันจะลองทำตามคำแนะนำของคุณโดยเร็วที่สุดเท่าที่จะทำได้แน่นอนว่านี่จะต้องพาฉันไปที่ไหนสักแห่งขอบคุณมาก!
qwerty

ฉันทดสอบwp_mail()และดูเหมือนว่าจะทำงานได้ดีฉันได้รับอีเมลตามที่คาดไว้ WP ยังคงไม่ส่งอีเมลความคิดเห็น / ตั้งรหัสผ่านใหม่อีกครั้งและฉันไม่ได้อะไรเลยในล็อกไฟล์ (มันไม่ได้ถูกสร้างขึ้น) ดังนั้นฉันจึงลองติดตั้งปลั๊กอินเมล SMTP และตั้งค่าบัญชีอีเมลใหม่สำหรับ Wordpress ใช้งานได้ แต่ฉันก็ยังไม่เข้าใจว่าทำไมมันไม่สามารถส่งได้ก่อน ขอบคุณ!
qwerty

ฉันไม่ได้รับข้อผิดพลาดและไม่ส่งเมล
baldraider

2

นี่เป็นข้อความแสดงข้อผิดพลาดที่น่ารำคาญอย่างยิ่งเนื่องจากอาจมีหลายสิ่งและจะไม่เปิดเผยข้อผิดพลาดจริง (ซึ่งมักจะถูกปิดเสียงในส่วนอื่น ๆ ของรหัส)

ข้อผิดพลาดนี้จะปรากฏขึ้นเมื่อwp_mail()ฟังก์ชั่นกลับเท็จซึ่งในทางกลับกันอาจเกิดขึ้นหากphpmailer->Send()ส่งกลับเท็จหรือยกข้อยกเว้น


วิธีการแสดงคำเตือนจากmail()ฟังก์ชั่นของ PHP

โดยปกติแล้วสิ่งเหล่านี้จะเงียบไปโดยปริยาย แต่น่าเสียดายที่ WordPress ไม่ได้รวบรวมเอาไว้ ที่จะแสดงให้พวกเขาเพียงแค่เอา@สัญญาณจาก@mail(...ในwp-includes/class-phpmailer.phpในmailPassthru()ฟังก์ชั่น:

if (ini_get('safe_mode') || !($this->UseSendmailOptions)) {
    $rt = @mail($to, $this->encodeHeader($this->secureHeader($subject)), $body, $header);
} else {
    $rt = @mail($to, $this->encodeHeader($this->secureHeader($subject)), $body, $header, $params);
}


วิธีการค้นหาสาเหตุที่เป็นไปได้อื่น ๆ :

  1. เพิ่มบรรทัดเดียวที่ด้านล่างของwp_mail()ใน/wp-includes/pluggable.php:

    // Send!
    try {
        return $phpmailer->Send();
    } catch ( phpmailerException $e ) {
        //------------- This next line is the one to add -------------------
        if (WP_DEBUG) echo '<pre>' . esc_html(print_r($e, TRUE)) . '</pre>';
        return false;
    }
    
  2. มันจะถ่ายโอนรายละเอียดทั้งหมดของข้อยกเว้น น่าเสียดายที่บางครั้งมันมีข้อความข้อยกเว้นที่ไม่ช่วยเหลือนี้: " ไม่สามารถยกตัวอย่างฟังก์ชั่นจดหมาย " ใช่ขอบคุณ WordPress นั่นมีประโยชน์จริง

  3. โดยการดูที่ข้อยกเว้นคุณสามารถค้นหาหมายเลขบรรทัดของข้อผิดพลาดและหวังว่าจะสามารถติดตามกลับผ่านรหัสเพื่อค้นหาสาเหตุที่แท้จริง

โชคดี. หวังว่า WordPress ช่วยปรับปรุงการจัดการข้อผิดพลาดทางอีเมลในบางจุดในอนาคต


2

ฉันมีปัญหาเดียวกันกับเซิร์ฟเวอร์ Ubuntu ใน Amazon EC2.I มีปัญหาขณะใช้ลิงค์รีเซ็ตรหัสผ่านและอีเมลแจ้งเตือนอื่นไม่ทำงาน

ดังนั้นนี่คือการแก้ปัญหาที่ทำงานสำหรับ me.Word กดใช้wp_mail()ฟังก์ชั่นการส่งอีเมลที่จำเป็นในPHPMailerระดับที่เคย PHP /usr/sbin/sendmailจดหมายเก็บไว้ใน

ใช้ฟังก์ชั่น php อย่างง่ายนี้ก่อนเพื่อตรวจสอบเมล php

<?php
$to = "example@gmail.com";
$subject = "Test Email Function";
$txt = "Hello world!";
$headers = "From: webmaster@example.com" . "\r\n" .
"CC: xyz@example.com";

mail($to,$subject,$txt,$headers);
?>

หากนี่ไม่ทำงานคุณต้องติดตั้ง php mailer ใช้คำสั่งนี้เพื่อติดตั้ง php mail บนเซิร์ฟเวอร์ Ubuntu

sudo apt-get install sendmail

จากนั้นตรวจสอบฟังก์ชั่นอีเมลกดคำ


คำตอบนี้เป็นสิ่งที่ทุกคนควรลองก่อนคำตอบอื่น ๆ นี่คือวิธีที่จะไป
5151

1

หากคำตอบที่ยอดเยี่ยมอื่น ๆ ที่นี่ไม่ช่วยลองสิ่งนี้:

ฉันพบปัญหาเดียวกันนี้และไม่มีสิ่งใดที่ฉันสามารถหาได้จากคำแนะนำใด ๆ สำหรับ WordPress ที่แก้ไขได้สำหรับฉัน

จากนั้นฉันก็เริ่มตรวจสอบว่ามันเป็นการติดตั้ง PHP ที่ปิดการใช้งานฟังก์ชั่นเมลหรือไม่ ทุกอย่างดูเหมือนว่าได้รับการกำหนดค่าอย่างเหมาะสม

ปัญหาทั้งหมดเหล่านี้เริ่มต้นสำหรับฉันเมื่อฉันอัพเกรดเซิร์ฟเวอร์เป็น CentOS 7 ซึ่งใช้ SELinux (Security Enhanced Linux) และสิ่งที่ฉันได้เรียนรู้ในสองสามสัปดาห์ที่ผ่านมากับ SELinux คือถ้าบางสิ่งไม่ทำงาน แต่ทุกอย่างดูเหมือนว่า มันควรจะทำงาน ... นั่นหมายความว่า SELinux ปิดกั้นคุณอยู่เบื้องหลัง

และวิโอลา

หากคุณกำลังใช้งานและระบบปฏิบัติการที่ใช้ SELinux เพียงดำเนินการคำสั่งต่อไปนี้ในฐานะรูท:

setsebool -P httpd_can_sendmail=1

มีการตั้งค่าความปลอดภัยที่ป้องกันไม่ให้เว็บเซิร์ฟเวอร์ส่งอีเมลโดยเนื้อแท้ เมื่อคุณพลิกสวิตช์แล้วบอก SELinux มันก็โอเคที่เว็บเซิร์ฟเวอร์จะส่งอีเมลทุกอย่างก็ใช้งานได้


0

วันนี้ฉันวิ่งเข้าไปหา ในกรณีของฉันสถานการณ์เกิดขึ้นเนื่องจากไฟล์โฮสต์ของเซิร์ฟเวอร์มีชื่อโดเมนเดียวกันกับที่อยู่อีเมลชี้ไปที่ localhost ระเบียน mx ชี้ไปที่เซิร์ฟเวอร์อื่น แต่ไฟล์โฮสต์กำลังแทนที่ DNS และ WP กำลังพยายามส่งอีเมลในเครื่อง การลบโดเมนออกจากไฟล์โฮสต์และการรีสตาร์ท sendmail สามารถแก้ไขปัญหานี้ได้


0

ฉันไม่รู้ว่าสิ่งนี้ยังเกี่ยวข้องกับคุณหรือไม่ แต่เนื่องจากไม่มีคำตอบที่เลือกฉันคิดว่าให้ฉันลองอีกครั้ง

ที่จริงแล้วฉันก็ประสบปัญหาเดียวกันนี้อย่างแน่นอนตั้งแต่โฮสติ้ง openshift ของฉันแทบจะทันทีทันใดและหยุดส่งอีเมล เมื่อขุดผ่านโค้ดและ codex ฉันได้รู้เกี่ยวกับฟังก์ชั่น wp_mail () และในที่สุด google ก็พาฉันมาที่นี่และฉันเห็นว่ามันจะถูกแทนที่ได้อย่างไร

จากคำตอบของ @ Ralf912 ฉันได้ปรับเปลี่ยนสคริปต์เล็กน้อยเพื่อให้โค้ดใช้เว็บ api ของ sendgrid.com เพื่อส่งอีเมลแทนที่จะเป็น wordpress เริ่มต้นหนึ่งตัว (ซึ่งฉันเข้าใจว่า:

<?php

function sendgridmail($to, $subject, $message, $headers)
{
    $url = 'https://api.sendgrid.com/';
    //$user = 'yourUsername';
    //$pass = 'yourPassword';

    $params = array(
        'api_user'  => $user,
        'api_key'   => $pass,
        'to'        => $to,
        'subject'   => $subject,
        'html'      => '',
        'text'      => $message,
        'from'      => 'abc@hotmail.com',
      );


    $request =  $url.'api/mail.send.json';

    // Generate curl request
    $session = curl_init($request);
    // Tell curl to use HTTP POST
    curl_setopt ($session, CURLOPT_POST, true);
    // Tell curl that this is the body of the POST
    curl_setopt ($session, CURLOPT_POSTFIELDS, $params);
    // Tell curl not to return headers, but do return the response
    curl_setopt($session, CURLOPT_HEADER, false);
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true);

    // obtain response
    $response = curl_exec($session);
    curl_close($session);

    // print everything out
    //print_r($response);
}

//only for testing:
/*$to      = 'abc@yahoo.com';
$subject = 'Testemail';
$message = 'It works!!';
echo 'To is: ' + $to;
#wp_mail( $to, $subject, $message, array() );
sendgridmail($to, $subject, $message, $headers);
print_r('Just sent!');*/

if (!function_exists('wp_mail')) {
    function wp_mail($to, $subject, $message, $headers = '', $attachments = array())
    {
        // use the PHP GnuPG library here to send mail.
        sendgridmail($to, $subject, $message, $headers);
    }
}

function plugin_init()
{
   /* $to      = 'xyz@yahoo.com';
    $subject = 'Testemail';
    $message = 'It works Live!';
    //echo 'To is: ' + $to;
    wp_mail( $to, $subject, $message, array() );
    //print_r('Just sent!');*/
}

และมันก็ใช้งานได้!


0

ฉันมีข้อผิดพลาดเดียวกันทั้งฟังก์ชั่น (mail และ wp_mail) ทำงานได้ แต่ฉันยังคงมีข้อผิดพลาดที่น่ารำคาญนี้อยู่ การแก้ไขนั้นง่ายมาก แต่ฉันใช้เวลาสองสามชั่วโมงเพื่อหาเหตุผล ดังนั้นฉันจะแบ่งปันที่นี่วิธีแก้ปัญหาของฉันซึ่งอาจจะ (หรืออาจจะไม่) เหมือนกันกับคุณ

ฉันลองใช้ฟังก์ชัน mail () และใช้งานได้ แต่เมื่อคุณทดสอบคุณไม่ได้ระบุพารามิเตอร์สุดท้ายที่เรียกว่า 'พารามิเตอร์' ในฟังก์ชัน mail () และ WP ก็ใช้มัน

@mail("example@exmaple.com",$title,$body,$headers,"-fexample@exmaple.com");

ดังนั้นโดยทั่วไปพารามิเตอร์นี้ ("-fexample@exmaple.com") ที่มีการตั้งค่าสถานะ "-f" ทำให้ฟังก์ชั่น mail () ตรวจสอบว่าที่อยู่อีเมล "example@exmaple.com" แสดงอยู่ในรายการ "อีเมลที่เชื่อถือได้"

ดังนั้นหากไม่เป็นเช่นนั้นก็จะคืนค่า false ซึ่งทำให้ wp_mail () ส่งคืนค่า false และนำไปสู่ข้อความแสดงข้อผิดพลาด

ดังนั้นทางออกคือขอให้ผู้ที่ทำสิ่งนี้ให้คุณหรือถ้าคุณใช้ cPanel เพียงแค่เพิ่มบัญชีอีเมลสำหรับที่อยู่นี้และมันจะเพิ่มเข้าไปใน "รายการที่เชื่อถือได้" โดยอัตโนมัติ


0

มันเรียกว่า - จัดการอีเมลที่ลงทะเบียน - รหัสสำหรับการส่งอีเมลผ่านสคริปต์เช่น (Wordpress)

  1. เข้าสู่ระบบ Cpanel ของคุณ
  2. ไปที่ส่วนอีเมล> จากนั้นคลิกรหัสอีเมลที่ลงทะเบียน
  3. จากนั้นเพิ่ม (wordpress@yourdomain.com) หรือที่ WordPress ของคุณโฮสต์อยู่ ie (wordpress@blog.yourdomain.com) จากนั้นส่งจะใช้เวลาไม่กี่นาทีในการเปิดใช้งานรอ 15 นาทีถึง 1 ชั่วโมงขึ้นอยู่กับผู้ให้บริการโฮสต์ของคุณจากนั้นจะใช้งานได้

0

ฉันมีข้อผิดพลาดนี้สำหรับทุกวัยและลองวิธีแก้ปัญหามากมายที่ไม่ได้ผล ฉันมีการติดตั้ง Wordpress แบบกำหนดเองบน AWS EC2 ก่อนอื่นให้แน่ใจว่าเปิดใช้งานอีเมล AWS SES ของคุณผ่านการสนับสนุนโดยจะต้องอยู่ในภูมิภาคเดียวกัน (หรือปิด) ใน SES และ EC2 ฉันใช้ Google suite (gsuite) เพื่อรับอีเมล / รับจดหมาย

ตรวจสอบให้แน่ใจว่าอีเมลทดสอบส่งเป็น AWS SES และ Gsuite

ติดตั้งปลั๊กอิน Wordpress WP Mail SMTP ใช้ตัวเลือก "Other SMTP" คว้าข้อมูลประจำตัว SMTP ของคุณจาก AWS SES นี่คือที่ฉันติดอยู่

คุณต้องเปิดใช้งานช่องทำเครื่องหมาย "SSL" สำหรับการเข้ารหัสซึ่งจะเปลี่ยนพอร์ตเป็น 465 สำหรับฉัน ในที่สุดการทดสอบอีเมลของฉันส่งจาก Worpdress เรียบร้อยแล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.