프로그래밍 방식으로 SMTP를 설정하는 방법


18

빈 WP 사이트가 있고 플러그인 또는 테마에서 SMTP 설정을 프로그래밍 방식으로 설정한다고 가정합니다. 코어 파일을 변경하지 않고 가장 쉬운 방법은 무엇입니까?

답변:


31

우선 wp_mail함수 구현을 살펴보면 이 함수가 PHPMailer클래스를 사용 하여 이메일을 보내는 것을 볼 수 있습니다. 또한 $phpmailer->IsMail();PHP의 mail()함수 를 사용하도록 설정된 하드 코딩 된 함수 호출이 있음을 알 수 있습니다. 이는 SMTP 설정을 사용할 수 없음을 의미합니다. 수업의 isSMTP기능 을 호출 할 필요가 PHPMailer있습니다. 또한 SMTP 설정도 설정해야합니다.

이를 위해서는 $phpmailer변수에 액세스해야 합니다. 그리고 여기서 우리 phpmailer_init는 이메일을 보내기 전에 호출되는 조치 를 취합니다. 액션 핸들러를 작성하여 필요한 것을 수행 할 수 있습니다.

add_action( 'phpmailer_init', 'wpse8170_phpmailer_init' );
function wpse8170_phpmailer_init( PHPMailer $phpmailer ) {
    $phpmailer->Host = 'your.smtp.server.here';
    $phpmailer->Port = 25; // could be different
    $phpmailer->Username = 'your_username@example.com'; // if required
    $phpmailer->Password = 'yourpassword'; // if required
    $phpmailer->SMTPAuth = true; // if required
    // $phpmailer->SMTPSecure = 'ssl'; // enable if required, 'tls' is another possible value

    $phpmailer->IsSMTP();
}

그리고 그게 다야.


좋은 물건, 유진, thx! 나는 ... 전체 SMTP 플러그인을 대체 할 수있는 코드의 10 개 라인을 추측 (?)
brasofilo

트윗 담아 가기 플러그인을 사용하면 관리자 패널에서 설정을 구성 할 수 있기 때문에 SMTP 플러그인을 대체 할 수 없다고 생각합니다. 이 스 니펫은 핵심 파일을 손상 시키거나 다시 쓰기 wp_mail기능을 사용 하지 않고 "프로그램 적으로 이메일 설정을 변경하는 방법"에 대한 모범 사례 입니다.
Eugene Manuilov

2
이 코드는 어디에 배치해야합니까? 모든 테마가 동일한 SMTP 서버를 사용하도록하고 싶습니다.
Anjan

1
매우 이상한 WP는 이것을 수정하는 것이 일반적이라고 생각할 때 이것을 쉽게 만들지 않습니다.
카슨 라인케

1
그것은 나를 위해 작동합니다, @ JackNicholson 당신도 당신의 끝에 그것을 확인해야합니다.
유진 마누엘 로프

7

@EugeneManuilov 답변 추가.

SMTP 설정

@EugeneManuilov가 이미 응답 한대로 기본적으로 이것들은에 연결된 콜백 동안에 만 설정 될 수 있습니다 do_action_ref_array(). 소스 / 코어 .

<?php
defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (WCM) PHPMailer SMTP Settings
 * Description: Enables SMTP servers, SSL/TSL authentication and SMTP settings.
 */

add_action( 'phpmailer_init', 'phpmailerSMTP' );
function phpmailerSMTP( $phpmailer )
{
    # $phpmailer->IsSMTP();
    # $phpmailer->SMTPAuth   = true;  // Authentication
    # $phpmailer->Host       = '';
    # $phpmailer->Username   = '';
    # $phpmailer->Password   = '';
    # $phpmailer->SMTPSecure = 'ssl'; // Enable if required - 'tls' is another possible value
    # $phpmailer->Port       = 26;    // SMTP Port - 26 is for GMail
}

SMTP 예외

기본적으로 WordPress는 디버그 출력을 제공하지 않습니다. 대신 FALSE오류가 발생하면 반환 합니다. 이 문제를 해결하는 작은 플러그인이 있습니다.

<?php
defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (WCM) PHPMailer Exceptions & SMTP
 * Description: WordPress by default returns <code>FALSE</code> instead of an <code>Exception</code>. This plugin fixes that.
 */

add_action( 'phpmailer_init', 'WCMphpmailerException' );
function WCMphpmailerException( $phpmailer )
{
    if ( ! defined( 'WP_DEBUG' ) OR ! WP_DEBUG )
    {
        $phpmailer->SMTPDebug = 0;
        $phpmailer->debug = 0;
        return;
    }
    if ( ! current_user_can( 'manage_options' ) )
        return;

    // Enable SMTP
    # $phpmailer->IsSMTP();
    $phpmailer->SMTPDebug = 2;
    $phpmailer->debug     = 1;

    // Use `var_dump( $data )` to inspect stuff at the latest point and see
    // if something got changed in core. You should consider dumping it during the
    // `wp_mail` filter as well, so you get the original state for comparison.
    $data = apply_filters(
        'wp_mail',
        compact( 'to', 'subject', 'message', 'headers', 'attachments' )
    );

    current_user_can( 'manage_options' )
        AND print htmlspecialchars( var_export( $phpmailer, true ) );

    $error = null;
    try
    {
        $sent = $phpmailer->Send();
        ! $sent AND $error = new WP_Error( 'phpmailerError', $sent->ErrorInfo );
    }
    catch ( phpmailerException $e )
    {
        $error = new WP_Error( 'phpmailerException', $e->errorMessage() );
    }
    catch ( Exception $e )
    {
        $error = new WP_Error( 'defaultException', $e->getMessage() );
    }

    if ( is_wp_error( $error ) )
        return printf(
            "%s: %s",
            $error->get_error_code(),
            $error->get_error_message()
        );
}

저장소

플러그인은 GitHub 의이 Gist에서 사용할 수 있으므로 업데이트를 가져 오려면 플러그인을 확인하십시오.


3

이 게시물에 대한 다른 답변은 작동하는 솔루션을 제공하면서 플러그인 파일 또는 functions.php에 SMTP 자격 증명을 저장하는 보안 문제를 다루지 않습니다. 경우에 따라 문제가되지 않지만 모범 사례에서는이 정보를보다 안전한 방식으로 저장해야합니다. 자격 증명을 보호 할 때 모범 사례를 따르지 않는 좋은 이유는 없습니다.

일부는 DB에 옵션으로 옵션을 저장하는 것이 좋지만 사이트에있는 관리 사용자 수와 해당 사용자가 이러한 로그인 자격 증명을 볼 수 있는지 여부에 따라 동일한 보안 문제를 제공합니다. 이것은 또한 플러그인을 사용하지 않는 것과 같은 이유입니다.

이를 수행하는 가장 좋은 방법은 wp-config.php 파일에서 phpmailer 정보의 상수를 정의하는 것입니다. 이것은 실제로 Mail Component의 기능 으로 논의 되었지만 현재로서는 실제 향상으로 받아 들여지지 않았습니다. 그러나 wp-config.php에 다음을 추가하여 직접 할 수 있습니다.

/**
 * Set the following constants in wp-config.php
 * These should be added somewhere BEFORE the
 * constant ABSPATH is defined.
 */
define( 'SMTP_USER',   'user@example.com' );    // Username to use for SMTP authentication
define( 'SMTP_PASS',   'smtp password' );       // Password to use for SMTP authentication
define( 'SMTP_HOST',   'smtp.example.com' );    // The hostname of the mail server
define( 'SMTP_FROM',   'website@example.com' ); // SMTP From email address
define( 'SMTP_NAME',   'e.g Website Name' );    // SMTP From name
define( 'SMTP_PORT',   '25' );                  // SMTP port number - likely to be 25, 465 or 587
define( 'SMTP_SECURE', 'tls' );                 // Encryption system to use - ssl or tls
define( 'SMTP_AUTH',    true );                 // Use SMTP authentication (true|false)
define( 'SMTP_DEBUG',   0 );                    // for debugging purposes only set to 1 or 2

이것들이 wp-config.php에 정의되면 정의 된 상수를 사용하여 어디서나 사용할 수 있습니다. 따라서 플러그인 파일이나 functions.php에서 사용할 수 있습니다. (OP에 따라 플러그인 파일을 사용하십시오.)

/**
 * This function will connect wp_mail to your authenticated
 * SMTP server. Values are constants set in wp-config.php
 */
add_action( 'phpmailer_init', 'send_smtp_email' );
function send_smtp_email( $phpmailer ) {
    $phpmailer->isSMTP();
    $phpmailer->Host       = SMTP_HOST;
    $phpmailer->SMTPAuth   = SMTP_AUTH;
    $phpmailer->Port       = SMTP_PORT;
    $phpmailer->Username   = SMTP_USER;
    $phpmailer->Password   = SMTP_PASS;
    $phpmailer->SMTPSecure = SMTP_SECURE;
    $phpmailer->From       = SMTP_FROM;
    $phpmailer->FromName   = SMTP_NAME;
}

이 게시물 과 이것 대한 자세한 내용은 여기 github에 있습니다 .


정말 좋은 해결책!
Phill Healey

1
작은 추가 사항 : 말할 필요도없이 버전 관리에 자격 증명을 저장하지 마십시오. gitignored 사용.env대신 파일을 . 그러나 민감한 것에 민감한 것을 가진 사람은 wp-config.php어쨌든 버전 관리를 사용 하지 않습니다 …
jsphpl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.