답변:
우선 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();
}
그리고 그게 다야.
wp_mail
기능을 사용 하지 않고 "프로그램 적으로 이메일 설정을 변경하는 방법"에 대한 모범 사례 입니다.
@EugeneManuilov 답변 추가.
@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
}
기본적으로 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에서 사용할 수 있으므로 업데이트를 가져 오려면 플러그인을 확인하십시오.
이 게시물에 대한 다른 답변은 작동하는 솔루션을 제공하면서 플러그인 파일 또는 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에 있습니다 .
.env
대신 파일을 . 그러나 민감한 것에 민감한 것을 가진 사람은 wp-config.php
어쨌든 버전 관리를 사용 하지 않습니다 …