Qualquer website tem como objetivo atingir um público, seja este para vender um produto, criar uma comunidade, fazer uma apresentação ou mostrar uma ideia ou conceito, é certo e sabido que uma das maneira para o conseguir eficazmente é através da interacção por email com o usuário.

O WordPress envia por si só vários emails por defeito sempre que um usuário se inscreve, ou uma password é mudada, no entanto, esteticamente esses emails não são atractivos! Com este tutorial você ficará a saber como é que o sistema de emails do WordPress funciona, quais as funcionalidades que você pode extender, como personalizar os seus emails e como agendar o envio de novos emails quando determinadas acções acontecem.

O MECANISMO DE EMAILS DO WORDPRESS

O WordPress contém na sua API uma função bastante inteligente que é capaz de enviar qualquer tipo de email, desde texto plano a HTML passando por anexar ficheiros entre outras funcionalidades. É com essa função

wp_mail()
que iremos principalmente trabalhar.

Essa função corre uma instância da já bem conhecida classe PHPMailer para manipulação de emails da WorxWare e por isso é facilmente modificável através dos action hooks do WordPress. Além disso temos disponíveis imensos filtros que iremos utilizar mais à frente para modificar o remetente, email e a forma como enviamos os emails.

Acrescento também que esta função, que se encontra no ficheiro

wp-includes/pluggables.php
pode ser totalmente recriada através de um novo plugin, no entanto recomendo que isso seja feito apenas em casos extremos, em que a necessidade de customização seja bastante ou que então seja mais viável mudar  o sistema de envio para outra classe ou para um sistema nativo.

CRIAR O PLUGIN PARA A FUNCIONALIDADE

Primeiro que tudo iremos criar um plugin para albergar esta nossa funcionalidade. A criação de plugins é bastante fácil e não deve ser dificil para nenhum usuário mais leigo. Se você quiser aprofundar este assunto, poderá ver este meu post sobre como criar plugins específicos.

Crie um ficheiro denominado

custom-emails.php
dentro da directoria
wp-content/plugins/
e coloque o seguinte cabeçalho:

<?php
/*
Plugin Name: Emails Customizados
Plugin URI: http://www.escolawp.com/2012/09/customizar-emails-wordpress/
Description: Personalização dos emails do WordPress para algumas ações frequentes e importantes.
Version: 1.0
Author: Escola WP
Author URI: http://www.escolawp.com/
*/

Salve o arquivo, dirija-se à administração do seu WordPress no menu Plugins e active o seu recém criado plugin. Se for novo nesta área de criar plugins, então os meus parabéns! Acabou de criar um plugin para o WordPress. :)

NOME E EMAIL DO REMETENTE

Vamos começar a “encher” o nosso plugin com o código que modifica o nome e o email do remetente. Como você pode constatar, o WordPress envia seus próprios emails com o seguinte remetentes

WordPress, wordpress@o-seu-dominio.com
o que, obviamente, é completamente estranho para qualquer um de nós. Na verdade o WordPress podia fazê-lo se fosse apenas para o administrador do website, no entanto ele fá-lo para qualquer usuário que se registe ou altere a sua password. Como o email não existe, alguns verificadores poderão até marcar estes emails por defeito como spam o que não é benéfico para ninguém que queira fazer com que o seu site cresça e seja reconhecido.

Para modificar estas informações vamos colocar o seguinte código dentro do ficheiro do nosso plugin:

// Incluir no cabeçalho do email o tipo de conteúdo HTML
add_filter( 'wp_mail_content_type', 'ewp_wp_mail_content_type' );
function ewp_wp_mail_content_type() {
	return "text/html";

}

// Modificar o email do remetente para outro email
add_filter( 'wp_mail_from', 'ewp_wp_mail_from' );
function ewp_wp_mail_from() {
	return "meu-email@meu-dominio.com.br";

}

// Modificar o nome do remetente
add_filter( 'wp_mail_from_name', 'ewp_ep_mail_from_name' );
function ewp_ep_mail_from_name() {
	return "O nome do meu blogue"; // Poderia também usar get_bloginfo( 'name' );

}

Com este código modificamos customizando os cabeçalho do nosso email para estarem de acordo com o nosso site. No entanto vamos avançar um pouco mais e aprofundar de modo a podermos criar um template HTML com o layout e cores do blogue. Desta maneira todo o usuário que receber esse email irá instantaneamente saber de onde veio criando aos poucos uma relação de proximidade.

USAR UM TEMPLATE GENÉRICO

Vamos criar um template baseado no esquema de cores e layout da Escola WordPress. Esse template será usado como exemplo para os tempaltes de emails aqui apresentados, assim você poderá modifcar a seu gosto e deve manter um layout que seja marcante e ligue ao seu website.

Para não termos que estar sempre a copiar o mesmo HTML para todos os nossos exemplo, vamos usar dois ficheiros, um para o cabeçalho do email e outro para o rodapé, que serão incluidos em cada um dos exemplos. Crie um ficheiro chamado

email_header.php
e outro ficheiro chamado
email_footer.php
no mesmo sitio do ficheiro do nosso plugin.

No cabeçalho vamos colocar o seguinte HTML:

<html>
<head>
<title>Escola WordPress</title>
<style type="text/css">
body {
	margin: 0;
	padding: 0;
	background: #F3F3F3;
	font-family: Arial, sans-serif;
	font-size: 14px;
	color: #333;
}
.wrapper {
	width: 600px;
	margin: 0 auto;
}
#header {
	background: #D6433B;
}
#page {
	-moz-border-radius: 3px;
	-khtml-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
	padding: 20px;
	margin-top: 25px;
	margin-bottom: 25px;
	border: 1px solid #CFCFCF;
	background: #FFF;
}
#logo {
	border-left: 1px solid #A20E06;
	border-right: 1px solid #A20E06;
	padding: 20px 20px;
}
</style>
</head>
<body>
	<div id="header">
		<div id="logo" class="wrapper">
			<a href="<?php echo site_url(); ?>">
				<img src="http://www.escolawp.com/wp-content/themes/escola-wordpress/img/escola-wordpress.png">
			</a>
		</div>
	</div>
	<div id="page" class="wrapper">

e no ficheiro de rodapé apenas o fechador da página:

	</div>
</body>
</html>

MODIFICAR OS EMAILS ENVIADOS

Nesta secção vamos aprender a alterar os emails enviados pelo WordPress em várias situações usando as nossas bem faladas action hooks. Ao contrário do que se poderia pensar, quase todos os envios de email do WordPress estão “minados” com action hooks o que nos possibilita modificá-los a nosso gosto.

EMAIL DE BOAS-VINDAS AO USUÁRIO

Este é o email por defeito gerado pelo WordPress quando um usuário novo se regista no site. Não é um email muito atrente, podemos todos concordar, nem sequer cria uma relação com a marca do website. Nesta secção vamos modificar este email de modo a acrescentar o cabeçalho e rodapé HTML que criámos na secção anterior, acrescentar um texto de boas-vindas e alguma informação que pode ser útil para o usuário.

A função responsável por enviar este email por defeito chama-se

wp_new_user_notification()
e como já se podia adivinhar, ela também é uma função plugável o que quer dizer que podemos (e temos mesmo) que recriá-la no nosso plugin:

function wp_new_user_notification( $user_id, $plaintext_pass = '' ) {
	$user = get_userdata( $user_id );

	$user_login = stripslashes( $user->user_login );
	$user_email = stripslashes( $user->user_email );
	$blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
	$subject = 'Bem-vindo ao meu site ' . $user_login;

	// Vamos enviar um email simples ao administrador
	$message  = sprintf(__('New user registration on your site %s:'), $blogname) . "\r\n\r\n";
	$message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
	$message .= sprintf(__('E-mail: %s'), $user_email) . "\r\n";

	@wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message);

	if ( empty($plaintext_pass) )
		return;

	/* Vamos enviar o email customizado para o usuário. */

	ob_start();

	include( 'email_header.php' );

	?>

	<p>Obrigado por se juntar ao website <?php echo $blogname; ?>, <?php echo esc_html( $user_login ); ?></p>

	<p>O seu usuário é <?php echo esc_html( $user_login ); ?> e a password <?php echo esc_html( $plaintext_pass ); ?>
	<br>Por favor mantenha-a segura!</p>

	<p>Para fazer login por favor, <a href="<?php echo wp_login_url(); ?>">clique aqui!</a></p>

	<p>Desejamos que aproveito o melhor deste website. Se tiver algum problema, comentários ou sugestões, por favor, sinta-se confortável para entrar em contacto connosco.</p>

	<?php

	include( 'email_footer.php' );

	$message = ob_get_contents();
	ob_end_clean();

	wp_mail( $user_email, $subject, $message );

}

E aqui está o resultado das nossas alterações. Sempre que um usuário se registar irá ver o seguinte email:

Você poderá fazer as customizações ao texto que achar necessárias. Tenha apenas em atenção que os seus usuários vão querer saber pelo menos três informaçoes: o seu login, as password e como entrar no seu website.

RECUPERAÇÃO DA PASSWORD

Outra situação em que o WordPress envia um email para o usuário é sempre que este pede a recuperação da password. Neste caso iremos usar uma action hook, uma vez que a função que processa este email tem uma dispponível. Assim o nosso código ficará do seguinte modo:

// Assunto do email para recuperação da password
add_filter( 'retrieve_password_title', 'ewp_wp_mail_retrieve_password_title' );
function ewp_wp_mail_retrieve_password_title() {
	return 'Recuperação da Password';

}

// Corpo da mensagem do emaild e recuperação da password
add_filter( 'retrieve_password_message' , 'ewp_wp_mail_retrieve_password_message' );
function ewp_wp_mail_retrieve_password_message( $content, $key ) {
	global $wpdb;

	// Através da chave de activação, vamos descobrir qual é o usuário.
	// Esta é uma query ao banco de dados. Desta forma recuperamos o usuário.
	// Tenha em atenção que esta parte é muito sensível e não queremos obter
	// dados de outros usuários a não ser este.
	$user_login = $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM {$wpdb->users} WHERE user_activation_key = %s" ), $key );

	// Vamos montar a URL para a reucperação da password
	$url = wp_login_url() . '?action=rp&key=' . $key . '&login=' . $user_login;

	// Iniciar o buffer
	ob_start();

	// Incluir o cabeçalho
	include( 'email_header.php' );
	?>

	<p>
		Alguém, possivelmente você, pediu para recuperar a sua password.
	</p>

	<p>
		Para recuperar a password, por favor, visite o seguinte endereço. Caso contrário, ignore esta mensagem.
		<br>
		<a href="<?php echo esc_attr( $url ); ?>"><?php echo esc_html( $url ); ?></a>
	<p>

	?>

	// Incluir o rodapé
	include( 'email_footer.php' );

	// Recuperar o buffer
	$message = ob_get_contents();
	ob_end_clean();

	return $message;

}

Você poderá também modificar o texto para ficar de acordo com o seu website porém tenha em atenção que se alterar o código SQL deverá saber bem o que está a fazer para que não haja problemas de informação pessoal a circular pela internet. :)

Estas são as únicas duas situações em que o WordPress envia email para o usuário. Haverá no entanto outras situações em que o envio de um email seria interessante. O WordPress envia nativamente emails para os autores de posts que receberam novos comentários. Se você quiser customizar esse email poderá replicar a função

wp_notify_postauthor
que se encontra também no ficheiro
wp-includes/pluggables.php

Outras situações o WordPress não tem o envio de emails agendado por defeito. É o caso em que queremos notificar um autor que o seu post foi publicado. Iremos ver como o fazer na secção seguinte.

NOTIFICAR O AUTOR DE UMA PUBLICAÇÃO

Podemos enviar vários emails quando determinadas acções acontecem no WordPress. Por exemplo: «O seu website tem vários autores e você gostaria de informá-los por email sempre que publicar seus posts». Através do código seguinte vamos conseguir fazer isso. A action hook responsável aqui chama-se publish_post e irá ajudar-nos a chegar ao nosso objetivo. Para isso uso o seguinte código:

add_action( 'publish_post', 'ewp_wp_mail_publish_post' );
function ewp_wp_mail_publish_post( $post_id ) {
	// A partir do ID do post, vamos obter o objeto desse post...
	$post = get_post( $post_id );
	//...e o objeto do seu autor
	$author = get_userdata( $post->post_author );

	// Email do autor
	$author_email = $author->user_email;

	// Assunto do email a enviar
	$email_subject = 'O seu artigo foi publicado!';

	// Iniciar o buffer PHP
	ob_start();
	// Incluir o nosso cabeçalho
	include("email_header.php");

	?>

	<p>
		Olá, <?php echo $author->display_name ?>. Acabei de publicar o seu artigo "<?php echo $post->post_title ?>".
	</p>

	<p>
		Para ver o seu artigo, <a href="<?php echo get_permalink( $post->ID ) ?>">clique aqui</a>. 
		Por favor, mantenha esta mensagem consigo, dessa maneira você poderá voltar ao site e responder a alguns comentários.
	</p>

	<?php
	// Incluir o rodapé
	include("email_footer.php");

	// Obter a mensagem do buffer	
	$message = ob_get_contents();
	ob_end_clean();

	// Enviar email ao autor
	wp_mail( $author_email, $email_subject, $message );

}

Este é um código que pode ditar o sucesso do seu website de publicação com vários autores. Com certeza será uma boa aposta.

ENVIAR EMAILS COM UM SERVIDOR SMTP

Existem muitos plugins que re-implementam a função wp_mail() para que o WordPress use SMTP para autenticação, no entanto essa opção não é necessária uma vez que através da action hook

phpmailer_init
é possível modificar todas as propriedades do objeto do PHPMailer e, assim, também ativar a funcionalidade de envio através de um servidor SMTP.

O seguinte código implementa essa modificação:

// Configurar o PHPMailer para usar um servidor SMTP
// em vez da função nativa mail()
add_action( 'phpmailer_init', 'ewp_configure_smtp' );
function ewp_configure_smtp( PHPMailer $phpmailer ) {
	$phpmailer->isSMTP(); // Vamos dar a instrução para mudar para SMTP
	$phpmailer->SMTPAuth = true; // Por questão de segurança usamos um sistema de autenticação

	$phpmailer->Host = 'mail.o-meu-dominio.com.br'; // O host do servidor SMTP
	$phpmailer->Username = 'email@o-meu-dominio.com.br'; // O email pretendido
	$phpmailer->Password = 'a-minha-password'; // A password associada ao email

}

Desta maneira, o WordPress usa o servidor SMTP definido no código para qualquer email que envia.

CONCLUSÃO

Actualmente o sistema de emails do WordPress permite-nos fazer imensas modificações sem ter que re-implementar a função wp_mail() e essas são funcionalidades que devem ser aproveitadas por nós desenvolvedores. A re-implementação desta função deixou de ser a maneira mais recomendada para modificar o sistema de emails, daí a existência de várias hooks, no entanto existem ainda imensos plugins que o fazem apenas para acrescentar a funcionalidade do SMTP. É importante salientar que existem casos em que essa necessidade está patente, mas deve-se sempre optar pela forma mais fácil.

Download do código fonte deste artigo

Espero que este artigo tenha dado uma nova visão de como modificar o seu blogue.

Até breve!