Enviando formulários no WordPress usando SMTP e PHPMailer nativo
Categoria: Snippets - Comentários (7)
Recentemente eu postei aqui uma forma simples de enviar um formulário pelo WordPress: Leia o post aqui.
Só que a função mostrada envia o formulário usando mail() do PHP. Acontece que hoje em dia, muitos hosts desabilitam a função mail() para fins de segurança. Por este motivo, resolvi ensinar a enviar formulários usando o PHPMailer nativo do WordPress, usando o SMTP da sua hospedagem.
Para tanto, será necessário que seja instalado o plugin WP Mail SMTP para que o WordPress possa enviar mensagens usando SMTP ao invés de usar a função mail().
Se você não quiser usar este plugin, também poderá optar por usar o SMTP do Gmail, ok? Na função abaixo, eu estou usando os campos criados pelo plugin WP Mail SMTP na tabela wp_options, pegando seus respectivos dados, através da função get_option(). Os campos são: smtp_host, smtp_user, smtp_pass e mail_from
Vamos lá! Abra o arquivo functions.php do seu tema e coloque a função abaixo:
|
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
function send_contact_form(){ require(ABSPATH . WPINC . '/class-phpmailer.php'); require(ABSPATH . WPINC . '/class-smtp.php'); date_default_timezone_set('America/Sao_Paulo');//corrige hora local $siteurl = trailingslashit( get_option('home') ); $mail = new PHPMailer(); $mail->IsSMTP(); $mail->CharSet='UTF-8'; $mail->From = get_option('smtp_user'); $mail->FromName = get_option('blogname'); $mail->Subject = '['. get_option('blogname') .'] nova mensagem'; $mail->AddReplyTo = $_POST['contact_email']; $mail->Sender = get_option('smtp_user'); //SMTP Config $mail->Host = get_option('smtp_host'); //Descomente as opções abaixo se for usar SMTP autenticado. Lembre-se que isto requer que o e-mail seja do domínio do site. //$mail->SMTPAuth = true; //$mail->Username = get_option('smtp_user'); //$mail->Password = get_option('smtp_pass'); $mail->AddAddress( get_option('mail_from') ); $message = 'Prezado Administrador,' . "\r\n\r\n"; $message .= 'Uma nova mensagem foi enviada em ' .date("d/m/Y \à\s H:i:s"). "\r\n\r\n"; $message .= 'MENSAGEM:' . "\r\n"; $message .= '------------------------' . "\r\n"; /***************************** no array abaixo, coloque o nome dos campos que quer remover do corpo da mensagem *******************************/ $campos_excluidos = array('submit'); while(list($campo, $valor) = each($_POST)){ if( !in_array( $campo, $campos_excluidos ) ){ $message.= ucfirst($campo) .": ". $valor . "\r\n\r\n"; } } $message .= '-------------------------' . "\r\n\r\n"; $message .= 'Atenciosamente,' . "\r\n"; $message .= get_option('blogname') . "\r\n"; $message .= $siteurl . "\r\n\r\n\r\n\r\n"; $mail->Body = $message; // Send Email. if(!$mail->Send()){ echo '<div class="msg_erro"> <h3>Erro!</h3> <p>A mensagem não pôde ser enviada. Por favor, tente novamente.</p> <p>[ Erro: ' . $mail->ErrorInfo . ' ]</p> </div>'; } else { echo '<div class="msg_sucesso"> <h3>Sucesso!</h3> <p><strong>Sua mensagem foi enviada corretamente!</strong></p> </div>'; } $mail->ClearAllRecipients(); } |
No html do seu template, onde irá mostrar o seu formulário, faça assim:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php /* na page-contato.php, ou onde estiver o formulário */ if ( $_SERVER['REQUEST_METHOD'] == "POST" ){ //envia o form send_contact_form(); } else { //mostra o formulario ?> <!-- Aqui vai o html do seu formulario --> <?php } ?> |
Parâmetros do PHPMailer que podem ser utilizados nessa função:
http://phpdocs.epesi.org/PHPMailer/PHPMailer.html
Para usar o SMTP do Gmail, veja as configurações abaixo:
http://support.google.com/mail/bin/answer.py?hl=pt&answer=13287
Bom, é isso então pessoal. Qualquer dúvida ou problema com a função, basta comentar aqui, ok?
Abraços e até a próxima!
Bom dia,
Estou com o mesmo problema dos amigos acima. Tenho um formulário no site, fiz vários testes como se eu fosse o clinte. Quando preencho o campo EMAIL com algum email @hotmail.com @live.com , diz que o email foi enviado com sucesso, porém o email não chega na caixa de entrada nem no spam. Quando preencho o campo EMAIL com qualquer outro @dominioqualquer.com.br ou .com apenas, o email é enviado e chega com sucesso na minha caixa. Eu estava utilizando o painel do gmail, pensei que o erro fosse nele, ai migrei o meu domínio para o painel do hotmail, mas o erro persistiu.
Pois bem, já liguei no host e me disseram que como estou roteando o email para fora do servidor, ou seja, estou usando as DNS do hotmail nas contas de email, o host não tem como corrigir isso. Disseram que o problema pode ser no hotmail.
Mas não acredito que seja, acho que é algo na função MAIL e SMPT. Alguém ai pode me ajudar? Vamos encontrar uma solução para isso.
Obrigado.
Tenho um formulário pronto no meu site desenvolvido em wordpress. Qdo uso email @gmail ou @hotmail para preencher tudo e enviar (como se fosse um cliente), aparece a mensagem de “enviado com sucesso”.Mas as mensagens não chegam no meu e-mail (nem na cx de spam). Qdo preencho com @outroservidor, as mensagens chegam no meu e-mail. Já atualizei os plugins etc…Podem me ajudar ?
Na maioria dos hosts, você deve usar um e-mail do seu domínio para efetuar os envios…
Olá.. gostaria de uma ajuda.
Tenho um formulário pronto no meu site desenvolvido em wordpress..
no formulário tem:
Nome:
e-mail:
Mensagem:
enviar.
eu preencho tudo e envio, aparece a mensagem de “enviado com sucesso”.
Mas as mensagens não chegam no meu e-mail.. e eu não sei pra onde elas vão. Como faço pra chegar no meu e-mail(e-mail da empresa)?
Por favor.. se poder me ajudar , obrigada =)
Olá Grazielly,
Difícil dizer o que pode estar errado… Pode ser N coisas. Está hospedado aonde? Já verificou se as mensagens não estão caindo na caixa de SPAM?
O formulário foi feito com algum plugin? Já tentou entrar em contato com o suporte do seu host e verificar se está tudo OK com a sua hospedagem?
Abs.
Miriam de Paula.
Olá Míriam,
Estou tentando usar o código e está apresentando um erro na linha 8 do segundo bloco de código, já inclui o primeiro bloco no funtions.php, descomentei as linhas para usar o SMTP autenticado e configurei o plugin.
Erro: “Parse error: syntax error, unexpected T_STRING in C:\Program Files\EasyPHP-5.3.8.1\www\wp-theme\wp-content\themes\GDB-V2\single-diretorio.php on line 46″
Coloquei os códigos no pastebin: http://pastebin.com/3QVv5JhC e http://pastebin.com/qZZSF3r5
Até!
Olá Rhenan!
Erro: “Parse error: syntax error, unexpected T_STRING in C:\Program Files\EasyPHP-5.3.8.1\www\wp-theme\wp-content\themes\GDB-V2\single-diretorio.php on line 46″
Isto está informando que houve um erro no arquivo single-diretorio.php, na linha 46 ….
Algo no seu tema está errado, tente verificar essa linha pra ver o que há de errado …
Abs.
Miriam de Paula