워드프레스 다음 SMTP 사용시 망보드 이메일 발송 안 됨

프로그래밍2018. 9. 6. 18:42


아마존 세일라이트로 구성한 서버에서 워드프레스에  망보드를 설치해 테스트 중이다..


WP Mail SMTP의 설정에서 gmail을 설정해 놓으면.. 망보드 회원 아이디 찾기/비밀번호 찾기를 통한 메일 발송이 정상적으로 되는데 gmail이 아닌 daum메일을 설정해 놓으면 메일 발송이 안된다..


daum SMTP를 설정해 놓고 Email Test 페이지에서 테스트를 해보면 정상적으로 발송이 된다..

그런데 왜 망보드에서는 메일 발송을 못하는 걸까..


WP Mail SMTP에서 테스트 메일 보낼 때 사용되는 코드


Test.php

1
2
3
4
5
6
7
8
9
10
11
// Send the test mail.
$result = wp_mail(
    $data['test_email'],
    /* translators: %s - email address a test email will be sent to. */
    'WP Mail SMTP: ' . sprintf( esc_html__( 'Test email to %s', 'wp-mail-smtp' ), $data['test_email'] ),
    sprintf(
        /* translators: %s - mailer name. */
        esc_html__( 'This email was sent by %s mailer, and generated by the WP Mail SMTP WordPress plugin.', 'wp-mail-smtp' ),
        wp_mail_smtp()->get_providers()->get_options( Options::init()->get( 'mail', 'mailer' ) )->get_title()
    )
);
cs



망보드에서 아이디/비번 찾을 때 사용되는 메일 보내는 코드


mb_user.php

1
2
3
if (!wp_mail( mbw_get_param("user_email"), wp_specialchars_decode($title), $message ) ){
    mbw_error_message( __('The e-mail could not be sent2.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function.'));            
}
cs


wp_mail이 실패하면
wp_mail_failed 액션?이 불리게 되어있는 것 같은데
이 액션이 불릴 때 내가 만든 함수가 호출되게 만들어도.. 이상하게 호출이 안된다.

디버깅이 너무 힘들다.. 무슨 방법이 없을까.. 정보도 없고 ㅜㅜ


음.. 왜 그런지는 모르겠지만
망보드에서 메일 보내기 기능을 해도 로그가 안찍히는 것 같다.
WP Mail SMTP에서 메일 보내기 기능을 하면 로그가 찍히는 것 같고..

같은 wp_mail 함수가 불리는 것 같은데 왜 다를까..?


아니다 확인을 좀 해보니 WP Mail SMTP에서는 wp_mail 함수를 부르기 전에 PHPMailer를 상속한 MailCapcher?에서 추가 작업이 약간 있다. 이 때문에 차이가 생기는 걸까??


그리고 망보드에서 에러 로그가 안나오는 거에 대해서도 테스트를 좀 해봤는데 kleo 테마 사용과 관련된 게 아니라.. 망보드 자체의 문제같다. 도대체 어디에 로그를 끄는 코드라도 있는 것인가? 검색해봐도 정보가 너무 없어 답답하다.. 좀 더 찾아보자..


mangboard/includes/mb-settings.php

1
2
3
4
5
6
7
8
9
10
11
if((defined("MBW_REQUEST_MODE") && (MBW_REQUEST_MODE=="API")) || !empty($_REQUEST["action"])){
    // Api mode    
    error_reporting(0);
    @ini_set('display_errors',0);
    $mb_request_mode            = "API";
    mbw_set_params();
    mbw_check_request_size();    
    mbw_is_permission_level();    
}
require_once(MBW_PLUGIN_PATH."includes/class.board.php");            // Board Class
if(!empty($_REQUEST["mb_ext"])) { error_reporting(0); @ini_set('display_errors',0);}
cs


드디어 찾은 것 같다..

위의 부분이 망보드에서 에러를 잠시? 끄는 코드이다.

3~4번의 라인만 주석으로 막아도 에러 로그가 나온다.


htdocs/wp-includes/functions.php

1
2
3
4
5
6
7
function action_wp_mail_failed($wp_error) 
{
    return error_log(print_r($wp_error, true));
}
          
// add the action 
add_action('wp_mail_failed', 'action_wp_mail_failed', 10, 1);
cs

functions.php에 action_wp_mail_failed()를 정의하고 wp_mail함수가 실패하면 불리도록(콜백이 되도록) add_action 함수를 이용해 등록한다.

그러면 wp_mail이 실패하면 에러가 찍히는데..


htdocs/wp-content/debug.log

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[07-Sep-2018 15:15:41 UTC] WP_Error Object
(
    [errors] => Array
        (
            [wp_mail_failed] => Array
                (
                    [0] => SMTP Error: data not accepted.
                )
 
        )
 
    [error_data] => Array
        (
            [wp_mail_failed] => Array
                (
                    [to] => Array
                        (
                            [0] => xxxx@naver.com
                        )
 
                    [subject] => xxxx
                    [message] => xxxx
                    [headers] => Array
                        (
                        )
 
                    [attachments] => Array
                        (
                        )
 
                    [phpmailer_exception_code] => 2
                )
 
        )
 
)
cs

에러 로그는 위와 같다. 계속 분석해보자..


로그를 엄청나게 심고.. 여러 번의 테스트 끝에.. 드디어 원인을 찾았다 ㅜㅜ


구글 SMTP 서버의 경우 설정된 From(보내는 사람의 메일 주소)을 무시하고 연결된 계정의 이메일 주소를 설정하여 메일을 보내는 것 같다.

그러나 다음 SMTP 서버의 경우 다음 서버로 전달된 From이 연결된 다음 계정의 이메일 주소와 다른 경우 서버쪽에서 연결을 끊어버리는 것 같다.


From은 워드프레스 General Settings에서 Email Address 항목에 의해 정해진다..

그래서 다음 SMTP를 사용하는 경우 이 메일 주소는 연결된 다음 SMTP에 맞는 메일 주소를 입력하면 된다.


그러면 드디어.. 망보드에서 메일이 성공적으로 보내는 것을 확인할 수 있다 ㅜㅜ



워드프레스, php에 익숙하지 않아 디버깅하는데 상당히 많이 시간이 들었다.. 3일 정도?


그리고 신기한 점은 워드프레스 php코드에서 서로 다른 폴더에 있는 클래스도 딱히 제약없이 사용할 수 있는 것 같다. use 명령어로 네임스페이스만 잘 지정하면 되는듯.

mangboard 코드에서 WP Mail SMTP쪽 코드를 불러오는데 문제가 없었다.







작성자

Posted by 드리머즈

관련 글

댓글 영역