WordPress menolak untuk mengirim email, "... host Anda mungkin telah menonaktifkan fungsi mail ()"

9

Baru-baru ini saya menerapkan area komentar di situs web saya dan mencoba agar pemberitahuan email berfungsi. Tampaknya tidak ingin mengirim pemberitahuan email ketika komentar baru dibuat.

Hanya untuk melihat apakah PHP dapat mengirim email, saya mencoba mengatur ulang kata sandi (karena Anda akan mendapatkan kata sandi baru melalui surat), dan saya mendapat pesan:

Email tidak bisa dikirim. Kemungkinan alasannya: host Anda mungkin telah menonaktifkan fungsi mail ()

Saya telah mencentang kotak centang di Pengaturan -> Diskusi, dan email itu valid, jadi itu bukan masalah pengaturan. Saya mencoba membuat file PHP dan mengirim menggunakan mail(), dan berhasil dikirim. Jadi pasti ada sesuatu yang aneh dengan WordPress.

Ada ide?

qwerty
sumber
Harap berikan informasi debug
s_ha_dum

Jawaban:

9

Langkah demi langkah: Pertama cari file tempat pesan kesalahan muncul. Saya menggunakan Notepad ++ dan perintah CTRL+ Funtuk mencari file. Adalah ide yang baik untuk mencari hanya beberapa kata pertama dari pesan kesalahan, karena beberapa pesan kesalahan digabungkan dari pesan yang berbeda.

Pesan kesalahan Anda muncul wp-login.phpdan semoga beruntung, hanya di sana. Jadi mari kita lihat mengapa kesalahan ini bisa terjadi.

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

Ada dua syarat. $messageharus benar (bukan string kosong, tidak salah, bukan nol, dll). Dan wp_mail()seharusnya tidak kembali salah.

Satu baris di atas, ada filter $message = apply_filters('retrieve_password_message', $message, $key);, jadi ada kemungkinan bahwa plugin (atau tema) menggunakan filter ini dan mengembalikan nilai yang tidak benar (string kosong, false, null, dll.).

Tetapi lebih mudah untuk memeriksa apakah wp_mail()berfungsi atau tidak. Tulis sebuah plugin kecil untuk mengirim surat uji kepada diri Anda sendiri:

<?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      = '[email protected]';
    $subject = 'Testemail';
    $message = 'FooBarBaz Testmail is working';

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

(Ini adalah kode PHP5.3. Jika Anda menjalankan PHP5.2, hapus hal-hal namespace)

Plugin harus mengirim testmail segera setelah aktivasi. Jika tidak, memanggil beberapa halaman backend (mis. Dasbor) harus melakukannya.

Jika testmail tidak tiba, maka Anda mungkin memiliki masalah dengan wp_mail(). Jadi aktifkan debugging:

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

Masukkan kode ini ke Anda wp-config.phpdan coba ulangi sendiri sebuah testmail. Sekarang Anda harus mendapatkan beberapa pesan kesalahan dan mereka juga harus login wp-content/debug.log(Log debug dapat tumbuh sangat besar jika ada lebih banyak kesalahan yang disebabkan oleh plugin dan / atau tema).

Pada titik ini, Anda mendapat informasi bagus jika wp_mail()gagal dan jika demikian, mengapa. Jika wp_mail()berfungsi dengan benar dan testmail tiba, kembali ke atas dan cari tahu mengapa $messageitu tidak benar.

Jika Anda memiliki masalah dengan wp_mail(), jadi ingatlah bahwa wp_mail()tidak menggunakan mail()fungsi PHP . WordPress menggunakan kelas PHP ( PHPMailer ). Mungkin Anda hanya perlu plugin untuk menggunakan SMTP daripada sendmail. Atau masalahnya terletak di tempat lain. Kami tidak tahu. Anda harus menyelidikinya.

Ralf912
sumber
Ya saya mencoba menggali ke dalam inti dan itu juga membawa saya ke PHPMailer, dan itu benar - benar menggunakan php mail(). Setidaknya dalam beberapa kasus (lihat baris 732 masuk wp-includes/class-phpmailer.php. Saya tidak memiliki akses ke ftp atm tetapi saya akan mencoba saran Anda sesegera mungkin. Tentunya ini harus membawa saya ke suatu tempat. Terima kasih banyak!
qwerty
Saya menguji wp_mail()dan tampaknya berfungsi dengan baik, saya menerima surat seperti yang diharapkan. WP masih tidak akan mengirim email pengaturan ulang kata sandi /, dan saya tidak mendapatkan apa pun dalam file log (itu tidak dibuat), jadi saya mencoba menginstal plugin surat SMTP dan mengatur akun email baru untuk Wordpress. Ini berfungsi sekarang tetapi saya masih tidak mengerti mengapa itu tidak dapat dikirim sebelumnya. Terima kasih!
qwerty
Saya tidak mendapatkan kesalahan dan bahkan tidak mengirim surat
baldraider
2

Ini adalah pesan kesalahan yang sangat menjengkelkan karena bisa jadi banyak hal, dan itu tidak mengungkapkan kesalahan yang sebenarnya (yang sering dibungkam di bagian lain dari kode).

Kesalahan ini muncul ketika wp_mail()fungsi mengembalikan false, yang pada gilirannya bisa terjadi jika phpmailer->Send()mengembalikan false atau memunculkan pengecualian.


Cara menampilkan peringatan dari mail()fungsi PHP

Ini biasanya dibungkam secara default, tetapi sayangnya WordPress tidak pernah menangkapnya. Untuk menunjukkan kepada mereka, cukup menghapus @tanda-tanda dari @mail(...di wp-includes/class-phpmailer.phpdalam mailPassthru()fungsi:

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


Cara memburu penyebab lain yang mungkin:

  1. Tambahkan satu baris ke bagian bawah wp_mail()di /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. Ini akan membuang detail lengkap dari tempat pengecualian itu diajukan. Sayangnya terkadang termasuk pesan pengecualian yang tidak membantu ini: " Tidak dapat membuat fungsi email ". Ya terima kasih WordPress, itu sangat membantu.

  3. Dengan melihat pengecualian, Anda dapat menemukan nomor baris kesalahan, dan mudah-mudahan dapat melacaknya kembali melalui kode untuk menemukan penyebab sebenarnya.

Semoga berhasil. Semoga WordPress meningkatkan penanganan kesalahan email di beberapa titik di masa depan.

Simon Timur
sumber
2

Saya memiliki masalah yang sama dengan server Ubuntu di Amazon EC2.I mendapatkan masalah saat menggunakan tautan reset kata sandi dan juga email pemberitahuan lainnya tidak berfungsi.

Jadi di sini adalah solusi yang bekerja untuk saya. Tekan-tekan wp_mail()fungsi yang digunakan untuk mengirim email yang membutuhkan PHPMailerkelas yang digunakan menyimpan mailer php /usr/sbin/sendmail.

Gunakan fungsi php sederhana ini terlebih dahulu untuk memeriksa email php

<?php
$to = "[email protected]";
$subject = "Test Email Function";
$txt = "Hello world!";
$headers = "From: [email protected]" . "\r\n" .
"CC: [email protected]";

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

Jika ini tidak berhasil maka Anda perlu menginstal mailer php. Gunakan perintah ini untuk menginstal email php di server Ubuntu.

sudo apt-get install sendmail

Kemudian periksa fungsi email kata-pers.

CyberAbhay
sumber
jawaban ini adalah orang yang harus dicoba sebelum jawaban lain, ini adalah cara untuk pergi
hatenine
1

Jika jawaban hebat lainnya di sini tidak membantu, coba ini:

Saya mengalami masalah yang sama dan tidak ada yang dapat saya temukan di salah satu saran untuk WordPress yang menyelesaikannya untuk saya.

Kemudian saya mulai menyelidiki apakah instalasi PHP itu sendiri yang telah menonaktifkan fungsi mail, tetapi tidak ada yang berhasil. Semuanya tampak seperti sudah dikonfigurasikan dengan benar.

Semua masalah ini dimulai untuk saya setelah saya memutakhirkan server saya ke CentOS 7 yang menggunakan SELinux (Security Enhanced Linux) dan apa yang saya pelajari dalam beberapa minggu terakhir dengan SELinux adalah bahwa jika sesuatu tidak berfungsi, tetapi semuanya tampak seperti itu harus berfungsi ... itu berarti SELinux diam-diam dan diam-diam memblokir Anda di latar belakang.

Dan biola.

Jika Anda menjalankan dan OS yang menggunakan SELinux, jalankan saja perintah berikut sebagai root:

setsebool -P httpd_can_sendmail=1

Ada pengaturan keamanan yang secara inheren mencegah server web mengirim email. Ketika Anda membalik sakelar itu dan memberi tahu SELinux bahwa server web boleh mengirim email, semuanya tiba-tiba berfungsi.

Kenny Wyland
sumber
0

Saya mengalami ini hari ini; dalam kasus saya situasinya terjadi karena file host server memiliki nama domain yang sama dengan alamat email, menunjuk ke localhost. Catatan mx menunjuk ke server yang berbeda, tetapi file host menimpa DNS dan WP mencoba mengirimkan email secara lokal. Menghapus domain dari file host dan memulai kembali sendmail menyelesaikan masalah ini.

pengguna16081
sumber
0

Saya tidak tahu apakah ini masih relevan untuk Anda atau tidak, tetapi karena tidak ada jawaban yang dipilih, saya pikir izinkan saya mencobanya sekali.

Sebenarnya, saya telah menghadapi masalah yang sama persis sejak tuan rumah openshift saya tiba-tiba memberi jalan hari ini dan berhenti mengirim surat. Menggali kode dan kodeks, saya jadi tahu tentang fungsi wp_mail () dan akhirnya google membawa saya ke sini dan saya melihat bagaimana itu bisa diganti.

Berdasarkan jawaban @ Ralf912, saya sedikit memodifikasi skrip sehingga kodenya menggunakan api web sendgrid.com untuk mengirim email alih-alih wordpress default one (yang saya kira:

<?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'      => '[email protected]',
      );


    $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      = '[email protected]';
$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      = '[email protected]';
    $subject = 'Testemail';
    $message = 'It works Live!';
    //echo 'To is: ' + $to;
    wp_mail( $to, $subject, $message, array() );
    //print_r('Just sent!');*/
}

Dan itu berhasil!

Prahlad Yeri
sumber
0

Saya memiliki kesalahan yang sama, kedua fungsi (mail dan wp_mail) berfungsi, tetapi saya masih memiliki kesalahan yang mengganggu ini. Cara mengatasinya sangat mudah, tetapi saya butuh beberapa jam untuk menemukan alasannya. Jadi saya akan berbagi di sini solusi saya pada masalah yang mungkin (atau mungkin tidak) sama dengan Anda.

Saya mencoba fungsi mail () dan berhasil, tetapi ketika Anda mengujinya, Anda tidak menentukan parameter terakhir yang disebut fungsi 'parameter' di mail (). Dan WP menggunakannya.

@mail("[email protected]",$title,$body,$headers,"[email protected]");

Jadi, pada dasarnya, parameter ini ("[email protected]") dengan flag "-f" membuat fungsi mail () memeriksa apakah alamat email "[email protected]" tercantum dalam daftar "email tepercaya".

Jadi jika tidak, ia mengembalikan false, yang membuat wp_mail () mengembalikan false dan mengarah ke pesan kesalahan.

Jadi, solusinya adalah meminta hoster untuk melakukan ini untuk Anda, atau jika Anda menggunakan cPanel, cukup tambahkan akun email untuk alamat ini dan secara otomatis akan menambahkannya ke "daftar tepercaya".

pengguna3696815
sumber
0

itu disebut -Kelola Email-Id Terdaftar Untuk Mengirim Email melalui Script yaitu. (Wordpress)

  1. Login Cpanel Anda.
  2. Buka Bagian Email> lalu Klik ID Email Terdaftar.
  3. kemudian tambahkan ([email protected]) atau di mana wordpress Anda di-host. yaitu ([email protected]). kemudian kirim, perlu beberapa menit untuk mengaktifkan tunggu 15 menit hingga 1 jam tergantung penyedia hosting Anda, maka itu akan berhasil.
Amrit Bhandari
sumber
0

Saya memiliki kesalahan ini sejak lama dan mencoba banyak solusi yang tidak berhasil. Saya memiliki instalasi Wordpress khusus di AWS EC2. Pertama memastikan email AWS SES Anda diaktifkan melalui dukungan, mereka harus berada di wilayah yang sama (atau dekat) di SES dan EC2. Saya menggunakan Google suite (gsuite) untuk email untuk menerima / mengirim email.

Pastikan email pengujian dikirim dalam AWS SES dan Gsuite.

Instal plugin Wordpress WP Mail SMTP, gunakan opsi "Other SMTP", ambil kredensial SMTP Anda dari AWS SES, di sinilah saya terjebak.

Anda harus mengaktifkan kotak centang "SSL" untuk Enkripsi, ini mengubah port menjadi 465 untuk saya. Akhirnya tes email saya berhasil dikirim dari Worpdress.

Archie Butler
sumber