Qual é a maneira mais fácil de configurar as configurações de SMTP de forma programática?

Suponhamos ter um site WP em branco e queremos configurar configurações SMTP de forma programática em nosso plugin ou tema. Qual é a maneira mais fácil de fazer isso sem alterar os arquivos do núcleo?

Solutions Collecting From Web of "Qual é a maneira mais fácil de configurar as configurações de SMTP de forma programática?"

Em primeiro lugar, se analisarmos a implementação da function wp_mail , veremos que essa function usa a class PHPMailer para enviar e-mails. Também podemos notar que há uma function codificada dura chamada $phpmailer->IsMail(); , que define para usar a function de mail() do PHP. Isso significa que não podemos usar as configurações de SMTP com ele. Precisamos chamar a function PHPMailer class PHPMailer . E também precisamos configurar nossas configurações SMTP também.

Para alcançá-lo, precisamos acessar a variável $phpmailer . E aqui chegamos à ação phpmailer_init que é chamada antes de enviar um e-mail. Então, podemos fazer o que precisamos, escrevendo nosso manipulador de ação:

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

E isso é tudo.

Adição à resposta @EugeneManuilov.

Configurações SMTP

Por padrão, esses podem apenas obter – como @EugeneManuilov já respondidas – ser configurado por uma chamada de retorno anexada a um do_action_ref_array() . Fonte / núcleo .

 < ?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 } 

Exceções SMTP

Por padrão, o WordPress não oferece nenhuma saída de debugging. Em vez disso, ele simplesmente retorna FALSE se ocorrer um erro. Aqui está o pequeno plugin para corrigir isso:

 < ?php defined( 'ABSPATH' ) OR exit; /** * Plugin Name: (WCM) PHPMailer Exceptions & SMTP * Description: WordPress by default returns FALSE instead of an Exception. 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() ); } 

Repositório

Os plugins estão disponíveis neste Gist no GitHub , então considere verificar esses plugins a partir daí para agarra todas as atualizações.

O outro responde a esta publicação, ao fornecer uma solução de trabalho, não aborda o problema de segurança de armazenar suas credenciais SMTP em um arquivo de plugin ou functions.php. Em alguns casos, isso pode estar certo, mas as melhores práticas ditariam o armazenamento desta informação de forma mais segura. Realmente não há um bom motivo para não seguir as melhores práticas quando se trata de proteger suas credenciais.

Alguns sugeririam salvá-lo para o database como uma opção, mas também fornece os mesmos problemas de segurança dependendo do número de usuários administrativos do seu site e se esses usuários devem poder ver essas credenciais de login. Esta é também a mesma razão para não usar um plugin para isso.

A melhor maneira de fazer isso é definir constantes para as informações do phpmailer no seu arquivo wp-config.php. Isso realmente foi discutido como um recurso no componente de email , mas não foi aceito como um aprimoramento real neste momento. Mas você pode fazê-lo sozinho, adicionando o seguinte a 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', 'eg 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 

Uma vez que estes são definidos em wp-config.php, eles podem ser usados ​​em qualquer lugar usando a constante definida. Então você pode usar aqueles em um arquivo de plugin ou em suas funções.php. (Específico para o OP, use um arquivo de plugin.)

 /** * 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; } 

Há um pouco mais de detalhes sobre isso neste post e uma essência no github aqui .