WordPress từ chối gửi mail, xông vào máy chủ của bạn có thể đã vô hiệu hóa chức năng mail ()


9

Gần đây tôi đã triển khai một khu vực bình luận trên trang web của mình và cố gắng để thông báo email hoạt động. Dường như không muốn gửi thông báo qua email khi nhận xét mới.

Chỉ để xem PHP có thể gửi email không, tôi đã thử đặt lại mật khẩu (vì bạn sẽ nhận được mật khẩu mới qua thư) và tôi nhận được tin nhắn:

Các e-mail không thể được gửi. Lý do có thể: máy chủ của bạn có thể đã tắt chức năng mail ()

Tôi đã kiểm tra các hộp kiểm trong Cài đặt -> Thảo luận và email là hợp lệ, vì vậy đó không phải là vấn đề cài đặt. Tôi đã cố gắng tạo một tệp PHP và gửi bằng cách sử dụng mail(), và nó đã gửi thành công. Vì vậy, phải có một cái gì đó kỳ lạ đang xảy ra với WordPress.

Có ý kiến ​​gì không?


Vui lòng cung cấp thông tin gỡ lỗi
s_ha_dum

Câu trả lời:


9

Từng bước: Đầu tiên tìm tập tin xuất hiện thông báo lỗi. Tôi sử dụng Notepad ++ và lệnh CTRL+ Fđể tìm kiếm trong các tệp. Đó là một ý tưởng tốt để chỉ tìm kiếm một vài từ đầu tiên của thông báo lỗi, bởi vì một số thông báo lỗi được kết hợp của các thông báo khác nhau.

Thông báo lỗi của bạn xuất hiện wp-login.phpvà may mắn thánh, chỉ có ở đó. Vì vậy, hãy xem tại sao lỗi này có thể xảy ra.

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

Có hai điều kiện. $messagephải đúng (không phải là một chuỗi rỗng, không sai, không null, v.v.). Và wp_mail()không nên trả lại sai.

Một dòng ở trên, có một bộ lọc $message = apply_filters('retrieve_password_message', $message, $key);, vì vậy có thể một plugin (hoặc chủ đề) sử dụng bộ lọc này và trả về một giá trị không đúng (chuỗi rỗng, false, null, v.v.).

Nhưng nó dễ dàng hơn nhiều để kiểm tra xem wp_mail()có hoạt động hay không. Viết một plugin nhỏ để gửi thư kiểm tra cho chính bạn:

<?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 );
}

(Đây là mã PHP5.3. Nếu bạn đang chạy PHP5.2, hãy xóa các thứ trong không gian tên)

Các plugin nên gửi một testmail ngay sau khi kích hoạt. Nếu không, gọi một số trang phụ trợ (ví dụ bảng điều khiển) sẽ làm điều đó.

Nếu testmail không đến, thì có lẽ bạn có vấn đề với wp_mail(). Vì vậy, bật gỡ lỗi:

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

Đặt mã này vào của bạn wp-config.phpvà thử lại gửi cho mình một testmail. Bây giờ bạn sẽ nhận được một số thông báo lỗi và chúng cũng nên được đăng nhập wp-content/debug.log(Nhật ký gỡ lỗi có thể phát triển rất lớn nếu có nhiều lỗi do plugin và / hoặc chủ đề gây ra).

Tại thời điểm này, bạn đã nhận được thông tin tốt nếu wp_mail()thất bại và nếu vậy, tại sao. Nếu wp_mail()hoạt động chính xác và testmail đã đến, hãy quay lại đầu trang và tìm hiểu tại sao điều đó $messagekhông đúng.

Nếu bạn có vấn đề với wp_mail(), vì vậy hãy nhớ rằng wp_mail()không sử dụng mail()chức năng PHP . WordPress sử dụng một lớp PHP ( PHPMailer ). Có lẽ bạn chỉ cần một plugin để sử dụng SMTP thay vì sendmail. Hoặc vấn đề được đặt ở một nơi khác. Chúng tôi không biết. Bạn phải điều tra.


Vâng tôi đã cố gắng đào sâu vào cốt lõi và nó cũng đưa tôi đến với PHPMailer, và nó thực sự không sử dụng php của mail(). Ít nhất là trong một số trường hợp (xem dòng 732 trong wp-includes/class-phpmailer.phptôi không có quyền truy cập vào ftp atm nhưng tôi sẽ cố gắng đề xuất của bạn càng sớm càng tôi có thể Chắc chắn đây phải dẫn tôi đến một nơi Cảm ơn rất nhiều...!
qwerty

Tôi đã thử nghiệm wp_mail()và nó có vẻ hoạt động tốt, tôi đã nhận được thư như mong đợi. WP vẫn không gửi email nhận xét / đặt lại mật khẩu và tôi không nhận được gì trong tệp nhật ký (nó không được tạo), vì vậy tôi đã thử cài đặt plugin thư SMTP và thiết lập tài khoản email mới cho Wordpress. Nó hoạt động ngay bây giờ nhưng tôi vẫn không hiểu tại sao nó không thể gửi trước đó. Cảm ơn!
qwerty

Tôi không nhận được bất kỳ lỗi nào và thậm chí không gửi thư
baldraider

2

Đây là một thông báo lỗi siêu khó chịu vì nó có thể là nhiều thứ và nó không tiết lộ lỗi thực tế (thường bị im lặng trong các phần khác của mã).

Lỗi này xuất hiện khi wp_mail()hàm trả về false, điều này có thể xảy ra nếu phpmailer->Send()trả về false hoặc đưa ra một ngoại lệ.


Cách hiển thị cảnh báo từ mail()chức năng của PHP

Chúng thường bị tắt tiếng theo mặc định, nhưng thật không may, WordPress không bao giờ bắt được chúng. Để cho họ, chỉ cần loại bỏ các @dấu hiệu từ @mail(...trong wp-includes/class-phpmailer.phptrong mailPassthru()chức năng:

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);
}


Làm thế nào để săn lùng các nguyên nhân có thể khác:

  1. Thêm một dòng duy nhất để dưới cùng của wp_mail()năm /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. Nó sẽ kết xuất các chi tiết đầy đủ về nơi ngoại lệ được nêu ra. Thật không may, đôi khi nó bao gồm thông báo ngoại lệ không hữu ích này: " Không thể khởi tạo chức năng thư ". Vâng cảm ơn WordPress, điều đó thực sự hữu ích.

  3. Bằng cách xem xét ngoại lệ, bạn có thể tìm thấy số dòng lỗi và hy vọng có thể theo dõi lại thông qua mã để tìm nguyên nhân thực sự.

Chúc may mắn. Hy vọng rằng WordPress cải thiện xử lý lỗi email tại một số điểm trong tương lai.


2

Tôi gặp vấn đề tương tự với máy chủ Ubuntu trên Amazon EC2. Tôi gặp sự cố trong khi sử dụng liên kết đặt lại mật khẩu và các email thông báo khác không hoạt động.

Vì vậy, đây là các giải pháp hoạt động cho tôi. Word-press đã sử dụng wp_mail()chức năng để gửi email cần PHPMailerlớp sử dụng trình gửi thư php được lưu trữ trong /usr/sbin/sendmail.

Trước tiên hãy sử dụng chức năng php đơn giản này để kiểm tra thư 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);
?>

Nếu điều này không hoạt động thì bạn cần cài đặt php mailer. Sử dụng lệnh này để cài đặt thư php trên máy chủ Ubuntu.

sudo apt-get install sendmail

Sau đó kiểm tra chức năng email từ bấm.


câu trả lời này là câu hỏi mà bất kỳ ai cũng nên thử trước bất kỳ câu trả lời nào khác, đây là cách để đi
hatenine

1

Nếu các câu trả lời tuyệt vời khác ở đây không có ích, hãy thử điều này:

Tôi gặp phải vấn đề tương tự và không có gì tôi có thể tìm thấy trong bất kỳ đề xuất nào cho WordPress đã giải quyết nó cho tôi.

Sau đó, tôi bắt đầu điều tra nếu chính cài đặt PHP đã vô hiệu hóa chức năng thư, nhưng không có cái nào hoạt động cả. Tất cả mọi thứ trông giống như nó được cấu hình đúng.

Tất cả những vấn đề này bắt đầu với tôi khi tôi nâng cấp máy chủ của mình lên CentOS 7, sử dụng SELinux (Linux được tăng cường bảo mật) và những gì tôi đã học được trong vài tuần qua với SELinux là nếu có gì đó không hoạt động, nhưng mọi thứ sẽ như thế nó sẽ hoạt động ... điều đó có nghĩa là SELinux đang âm thầm và bí mật chặn bạn ở chế độ nền.

Và viola.

Nếu bạn đang chạy và hệ điều hành sử dụng SELinux, chỉ cần thực hiện lệnh sau dưới dạng root:

setsebool -P httpd_can_sendmail=1

Có một cài đặt bảo mật vốn đã ngăn máy chủ web gửi email. Khi bạn bật công tắc đó và nói với SELinux, máy chủ web sẽ gửi email, mọi thứ đột nhiên hoạt động.


0

Tôi chạy vào đây hôm nay; trong trường hợp của tôi, tình huống đã xảy ra vì tệp máy chủ của máy chủ có cùng tên miền của địa chỉ email, trỏ đến localhost. Bản ghi mx trỏ đến một máy chủ khác, nhưng tệp máy chủ đang ghi đè DNS và WP đang cố gắng gửi email cục bộ. Xóa tên miền khỏi tệp máy chủ và khởi động lại sendmail đã giải quyết vấn đề này.


0

Tôi không biết liệu điều này có còn phù hợp với bạn hay không, nhưng vì không có câu trả lời nào được chọn, tôi nghĩ hãy để tôi thử lại một lần.

Trên thực tế, tôi đã phải đối mặt với cùng một vấn đề chính xác kể từ khi máy chủ lưu trữ mở của tôi đột nhiên nhường chỗ hôm nay và ngừng gửi thư. Đi sâu vào mã và codex, tôi đã biết về hàm wp_mail () và cuối cùng google dẫn tôi đến đây và tôi thấy làm thế nào nó có thể bị ghi đè.

Dựa trên câu trả lời của @ Ralf912, tôi đã sửa đổi tập lệnh một chút để mã sử dụng api web của sendgrid.com để gửi thư thay vì mặc định của wordpress (mà tôi đoán là:

<?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!');*/
}

Va no đa hoạt động!


0

Tôi đã có cùng một lỗi, cả hai chức năng (mail và wp_mail) đều hoạt động, nhưng tôi vẫn gặp lỗi khó chịu này. Việc khắc phục rất dễ dàng, nhưng tôi đã mất vài giờ để tìm ra lý do. Vì vậy, tôi sẽ chia sẻ ở đây giải pháp của tôi về vấn đề có thể (hoặc có thể không) giống với bạn.

Tôi đã thử hàm mail () và nó hoạt động, nhưng khi bạn kiểm tra nó, bạn không chỉ định tham số cuối cùng được gọi là 'tham số' trong hàm mail (). Và WP có sử dụng nó.

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

Vì vậy, về cơ bản, tham số này ("-fexample@exmaple.com") với cờ "-f" làm cho chức năng mail () kiểm tra xem địa chỉ email "example@exmaple.com" được liệt kê trong danh sách "email đáng tin cậy".

Vì vậy, nếu không, nó sẽ trả về false, làm cho wp_mail () trả về false và dẫn đến thông báo lỗi.

Vì vậy, giải pháp là yêu cầu hoster làm điều này cho bạn hoặc nếu bạn đang sử dụng cPanel, chỉ cần thêm tài khoản email cho địa chỉ này và nó sẽ tự động thêm nó vào "danh sách đáng tin cậy".


0

nó được gọi là -Quản lý Id email đã đăng ký để gửi thư qua tập lệnh tức là (Wordpress)

  1. Đăng nhập Cpanel của bạn.
  2. Chuyển đến Phần Email> sau đó Nhấp vào ID email đã đăng ký.
  3. sau đó thêm (wordpress@yourdomain.com) hoặc nơi lưu trữ wordpress của bạn. tức là (wordpress@blog.yourdomain.com). sau đó gửi, mất vài phút để kích hoạt chờ 15 phút đến 1 giờ tùy thuộc vào nhà cung cấp dịch vụ lưu trữ của bạn, sau đó nó sẽ hoạt động.

0

Tôi đã có lỗi này từ lâu và đã thử rất nhiều giải pháp không hiệu quả. Tôi có cài đặt Wordpress tùy chỉnh trên AWS EC2. Trước hết, đảm bảo thư AWS SES của bạn được bật thông qua hỗ trợ, chúng phải ở cùng khu vực (hoặc đóng) trong SES và EC2. Tôi đã sử dụng bộ Google (gsuite) cho email để nhận / gửi thư.

Đảm bảo email kiểm tra gửi trong AWS SES và Gsuite.

Cài đặt plugin Wordpress WP Mail SMTP, sử dụng tùy chọn "Other SMTP", lấy thông tin đăng nhập SMTP của bạn từ AWS SES, đây là nơi tôi gặp khó khăn.

Bạn phải kích hoạt hộp đánh dấu "SSL" cho Mã hóa, điều này thay đổi cổng thành 465 cho tôi. Cuối cùng, bài kiểm tra email của tôi được gửi từ Worpdress thành công.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.