WordPress는 "... 호스트가 mail () 기능을 비활성화했을 수 있습니다."


9

나는 최근에 내 웹 사이트에 주석 영역을 구현하고 전자 메일 알림을 작동 시키려고했습니다. 새로운 의견이 올 때 이메일 알림을 보내지 않는 것 같습니다.

PHP가 전자 메일을 보낼 수 있는지 확인하기 위해 비밀번호를 재설정하려고 시도했습니다 (메일을 통해 새 비밀번호를 얻을 수 있기 때문에).

이메일을 보낼 수 없습니다. 가능한 이유 : 호스트가 mail () 함수를 비활성화했을 수 있습니다

설정-> 토론에서 확인란을 선택했는데 이메일이 유효하므로 설정 문제가 아닙니다. PHP 파일을 만들고을 사용하여 보내려고했지만 mail()성공적으로 보냈습니다. 따라서 WordPress에 이상한 일이 있어야합니다.

어떤 아이디어?


주십시오 디버깅 정보
s_ha_dum

답변:


9

단계별 : 먼저 오류 메시지가 나타나는 파일을 찾으십시오. 메모장 ++과 CTRL+ F명령을 사용하여 파일을 검색합니다. 일부 오류 메시지는 다른 메시지로 결합되므로 오류 메시지의 처음 몇 단어 만 검색하는 것이 좋습니다.

오류 메시지가 나타나고 wp-login.php거기에만 나타납니다 . 이 오류가 발생할 수있는 이유를 살펴 보겠습니다.

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

두 가지 조건이 있습니다. $message빈 문자열이 아니거나, 거짓이 아니고, 널이 아닌 등의 값이어야합니다. 그리고 wp_mail()거짓을 반환해서는 안됩니다.

위의 한 줄에 filter $message = apply_filters('retrieve_password_message', $message, $key);가 있으므로 플러그인 (또는 테마) 이이 필터를 사용하고 true가 아닌 값 (빈 문자열, false, 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를 실행하는 경우 네임 스페이스를 제거하십시오)

플러그인은 활성화 후 즉시 테스트 메일을 보내야합니다. 그렇지 않은 경우 일부 백엔드 페이지 (예 : 대시 보드)를 호출하면됩니다.

테스트 메일이 도착하지 않으면에 문제가있을 수 있습니다 wp_mail(). 디버깅을 켜십시오.

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

이 코드를 넣고 wp-config.php테스트 메일을 보내십시오. 이제 몇 가지 오류 메시지가 표시되고 로그인해야합니다 wp-content/debug.log(플러그인 및 / 또는 테마로 인해 더 많은 오류가 발생하면 디버그 로그가 매우 커질 수 있음).

이 시점에서 wp_mail()실패하면 좋은 정보를 얻었고 , 그렇지 않은 경우 그 이유를 알 수 있습니다. 경우 wp_mail()제대로 작동하고 testmail 도착, 정상으로 돌아가 이유를 알아 $message사실이 아니다.

당신은 문제가 있다면 wp_mail(), 그래서 명심 wp_mail()PHPs의 사용하지 않는 mail()기능을. 워드 프레스는 PHP 클래스 ( PHPMailer )를 사용합니다. sendmail 대신 SMTP를 사용하려면 플러그인이 필요할 수 있습니다 . 또는 문제가 다른 곳에 있습니다. 우리는 모른다. 조사해야합니다.


그래, 내가 핵심을 파고 시도하고 또한 PHPMailer에 저를 인도하고, 실제로 수행 사용 PHP의 mail(). 적어도 어떤 경우에는 (732 행 참조 wp-includes/class-phpmailer.php. ftp atm에 액세스 할 수 없지만 가능한 빨리 제안을 시도 할 것입니다. 확실히 이것이 어딘가로 인도해야합니다.
qwerty

테스트를 거쳤 wp_mail()으며 정상적으로 작동하는 것 같습니다. 예상대로 메일을 받았습니다. WP는 여전히 주석 / 비밀번호 재설정 이메일을 보내지 않았으며 로그 파일에 아무것도 생성되지 않았으므로 (생성되지 않았습니다) SMTP 메일 플러그인을 설치하고 새 이메일 계정을 설정하려고했습니다. 워드 프레스. 그것은 지금 작동하지만 여전히 이전에 보낼 수 없었던 이유를 이해하지 못합니다. 감사!
qwerty

오류가없고 메일도받지 못합니다
baldraider

2

이것은 여러 가지 일 수 있으므로 매우 성가신 오류 메시지 이며 실제 오류 (코드의 다른 부분에서 종종 침묵 됨)를 나타내지 않습니다.

이 오류는 wp_mail()함수가 false를 반환 할 때 나타나며 , phpmailer->Send()false를 반환하거나 예외를 발생시키는 경우 발생할 수 있습니다.


PHP mail()함수 에서 경고를 표시하는 방법

이들은 일반적으로 기본적으로 소리가 나지 않지만 불행히도 WordPress는 캡처하지 않습니다. 단순히 제거를 표시하려면 @에서 징후 @mail(...wp-includes/class-phpmailer.phpmailPassthru()기능 :

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

Amazon EC2의 Ubuntu 서버와 동일한 문제가 있습니다. 비밀번호 재설정 링크를 사용하는 동안 문제가 발생하고 다른 알림 이메일이 작동하지 않았습니다.

그래서 여기에 나를 위해 일한 솔루션이 있습니다 .Word-press 는 php mailer에 저장된 클래스가 wp_mail()필요한 전자 메일을 보내는 기능을 PHPMailer사용했습니다 /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 메일러를 설치해야합니다. 이 명령을 사용하여 우분투 서버에 PHP 메일을 설치하십시오.

sudo apt-get install sendmail

그런 다음 워드 프레스 이메일 기능을 확인하십시오.


이 답변은 다른 답변보다 먼저 시도해야하는 답변입니다.가는 방법입니다
hatenine

1

여기에 다른 위대한 답변이 도움이되지 않으면 다음을 시도하십시오.

나는이 같은 문제가 발생하여 WordPress에 대한 제안에서 찾을 수있는 것이 아무것도 없습니다.

그런 다음 메일 기능을 비활성화 한 것이 PHP 설치 자체인지 조사하기 시작했지만 그중 어느 것도 작동하지 않았습니다. 모든 것이 제대로 구성된 것처럼 보였습니다.

SELinux (Security Enhanced Linux)를 사용하는 CentOS 7로 서버를 업그레이드하고 SELinux로 지난 몇 주 동안 배운 것은 문제가 발생하지 않지만 모든 것이 제대로 작동한다는 것입니다. 그것은 작동해야합니다 ... SELinux가 조용히 비밀리에 백그라운드에서 당신을 차단하고 있음을 의미합니다.

그리고 비올라.

SELinux를 사용하는 OS 및 운영 체제 인 경우 루트로 다음 명령을 실행하십시오.

setsebool -P httpd_can_sendmail=1

웹 서버가 전자 메일을 보내지 못하게하는 보안 설정이 있습니다. 해당 스위치를 뒤집어 SELinux에 알려 주면 웹 서버가 전자 메일을 보내는 것이 좋습니다. 모든 것이 갑자기 작동합니다.


0

나는 오늘 이것에 부딪쳤다; 필자의 경우 서버의 호스트 파일이 로컬 호스트를 가리키는 이메일 주소의 도메인 이름과 동일하기 때문에 상황이 발생했습니다. mx 레코드가 다른 서버를 가리 키지 만 hosts 파일이 DNS를 재정의하고 WP가 전자 메일을 로컬로 배달하려고합니다. hosts 파일에서 도메인을 제거하고 sendmail을 다시 시작하면이 문제가 해결되었습니다.


0

이것이 여전히 귀하와 관련이 있는지는 모르겠지만 답변을 선택하지 않았으므로 한 번 시도해 보았습니다.

사실, 오늘 오픈 시프트 호스트가 갑자기 갑자기 길을 잃고 메일 발송을 중단 한 이후로 똑같은 문제에 직면했습니다. 코드와 코덱을 통해 wp_mail () 함수에 대해 알게되었고 마침내 구글이 나를 이끌었고 어떻게 재정의 될 수 있는지 보았습니다.

@ Ralf912의 답변을 바탕으로 코드에서 sendgrid.com의 웹 API를 사용하여 워드 프레스 기본 메일 대신 메일을 보내도록 스크립트를 약간 수정했습니다 (예상 :

<?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 () 함수에 'parameters'라는 마지막 매개 변수를 지정하지 않았습니다. 그리고 WP는 그것을 사용합니다.

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

따라서 기본적으로 플래그가 "-f"인이 매개 변수 ( "-fexample@exmaple.com")는 "trusted emails"목록에 나열된 전자 메일 주소 "example@exmaple.com"이 있는지 mail () 함수를 확인합니다.

그렇지 않으면 false를 반환하여 wp_mail ()이 false를 반환하고 오류 메시지가 나타납니다.

따라서 해결책은 호스팅 업체에 요청하거나 cPanel을 사용하는 경우이 주소의 이메일 계정을 추가하면 자동으로 "신뢰할 수있는 목록"에 추가됩니다.


0

스크립트를 통해 메일을 보내기 위해 등록 된 이메일 ID 관리-즉, WordPress

  1. Cpanel에 로그인하십시오.
  2. 이메일 섹션으로 이동 한 다음 등록 된 이메일 ID를 클릭하십시오.
  3. 그런 다음 (wordpress@yourdomain.com) 또는 워드 프레스가 호스팅 된 위치를 추가하십시오. 즉 (wordpress@blog.yourdomain.com). 그런 다음 제출하면 호스팅 제공 업체에 따라 15 분에서 1 시간 동안 대기하는 데 몇 분이 걸리면 작동합니다.

0

나는 오랫동안이 오류가 있었고 작동하지 않는 많은 솔루션을 시도했습니다. AWS EC2에 사용자 정의 Wordpress를 설치했습니다. 먼저 지원을 통해 AWS SES 메일을 활성화하고 SES 및 EC2에서 동일한 (또는 가까운) 리전에 있어야합니다. 메일 수신 / 보내기를 위해 Google 스위트 (gsuite)를 이메일로 사용했습니다.

테스트 이메일이 AWS SES 및 Gsuite로 전송되는지 확인하십시오.

Wordpress 플러그인 WP Mail SMTP를 설치하고 "기타 SMTP"옵션을 사용하고 AWS SES에서 SMTP 자격 증명을 가져옵니다.

암호화에 "SSL"확인란을 활성화해야합니다. 그러면 포트가 465로 변경됩니다. 마침내 내 이메일 테스트가 Worpdress에서 성공적으로 전송되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.