Enviar e-mails via PHP com o PHPMailer

0
1069
views

Uma das coisas mais importantes num site é o formulário de contacto, pois este permitirá os seus utilizadores/clientes contactarem consigo de forma a obterem ajuda ou esclarecimento relativamente às suas duvidas.

Para quem programa em PHP, provavelmente já conhece a função nativa mail() que permite o envio fácil de e-mails, no entanto esta tem várias limitações e nem sempre é a melhor solução, tornando-se complicado caso pretenda efectuar o envio de e-mails mais complexos, com vários anexos, autenticação SMTP em servidores remotos, etc.

PHP Mailer

Neste caso recomendamos normalmente aos nossos clientes a utilização do PHPMailer, uma classe PHP utilizada por milhares de plataformas (WordPress, Drupal, Joomla, SugarCRM, entre outras), que permite facilmente a criação e envio de e-mails com autenticação SMTP (vários mecanismos de autenticação), múltiplos destinatários (TO, CC, BCC, Reply-TO), e-mails em HTML com alternativa em plain-text, anexos e imagens inline, múltiplas opções de encoding do texto, assinaturas DKIM e S/MIME e muito mais.

A implementação do PHPMailer é bastante fácil, pelo que tentaremos explicar abaixo como efectuar uma implementação mínima do PHPMailer para o envio de e-mails no seu site.

O código e a documentação completa do PHPMailer estão disponíveis no Github, podendo saltar este guia caso pretenda uma implementação mais avançada.

O ficheiro base para implementação do PHPMailer é o class.phpmailer.php, no entanto como vamos efectuar o envio de e-mails com autenticação num servidor SMTP, teremos também que utilizar o class.smtp.php. De forma a carregar ambos estes ficheiros, utilizaremos o PHPMailerAutoload.php.

Poderá criar uma pasta no seu site para testar o PHPMailer, por exemplo com o nome “mailer”, onde deverá ter neste momento três ficheiros:

  • class.phpmailer.php
  • class.smtp.php
  • PHPMailerAutoload.php

Vamos agora criar o ficheiro responsável pelo envio do e-mail, neste caso “mailer.php” (poderá ter outro nome qualquer), onde será colocado o seguinte código:

<?php
require 'PHPMailerAutoload.php'; // Carrega as classes PHP necessárias

$mail = new PHPMailer;

//$mail->SMTPDebug = 3;                               // Activa o modo debug para depuração de error

$mail->isSMTP();                                      // Define a utilização de envio por SMTP
$mail->Host = 'mail.oseudominio.pt';                  // Especifica o servidor ou servidores SMTP utilizados para envio dos e-mails
$mail->SMTPAuth = true;                               // Activa a autenticação SMTP
$mail->Username = 'website@oseudominio.pt';                 // Define o utilizador SMTP
$mail->Password = 'P4ssw0rd';                           // Define a password do utilizador SMTP acima
$mail->SMTPSecure = 'ssl';                            // Activa encriptação SSL, `tls` também é aceite
$mail->Port = 465;                                    // Define a porta TCP para ligação do servidor SMTP

$mail->setFrom('website@oseudominio.pt', 'Nome do Site');
$mail->addAddress('jon.snow@oseudominio.pt', 'Jon Snow');     // Adiciona destinatário
$mail->addAddress('john.doe@oseudominio.pt');               // Outro destinatário, sendo o nome opcional
$mail->addReplyTo('info@oseudominio.pt', 'Informação');
$mail->addCC('cc@oseudominio.pt');
$mail->addBCC('bcc@oseudominio.pt');

$mail->addAttachment('/var/tmp/file.tar.gz');         // Adicionar anexo
$mail->isHTML(true);                                  // Define o formato HTML para o e-mail

$mail->Subject = 'Assunto do E-mail';
$mail->Body    = 'Conteúdo da mensagem de e-mail com <b>HTML</b><br>Segunda linha do e-mail';
$mail->AltBody = 'Texto alternativo da mensagem de e-mail, será visto em clientes de e-mail que não suportam HTML.';

if(!$mail->send()) {
    echo 'A mensagem não pôde ser enviada.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'A mensagem foi enviada com sucesso!';
}

Bastará alterar os parâmetros no ficheiro acima conforme as suas necessidades e esse ficheiro irá estar pronto para envio de e-mails, no entanto o que estará provavelmente à procura será uma forma de criar facilmente um formulário de contacto.

Criar formulário de contacto em PHP

Se pretende criar um formulário de contacto, poderá copiar o código do exemplo disponibilizado pelo PHPMailer e alterar os parâmetros do mesmo.

Deixamos abaixo um exemplo completo comentado com toda a informação que necessita para criar um formulário de contacto simples em PHP com envio dos e-mails utilizando o PHPMailer:

<?php
/**
 * Formulário de Contacto simples em PHP com PHPMailer
 */

$msg = '';
if (array_key_exists('email', $_POST)) {

    require './PHPMailerAutoload.php';

    //Criar nova instância do PHPMailer
    $mail = new PHPMailer;
    // Indicar que pretende utilizar SMTP e definir servidor
    $mail->isSMTP();
    $mail->Host = 'mail.oseudominio.pt';
    $mail->SMTPAuth = true;
    $mail->Username = 'website@oseudominio.pt';
    $mail->Password = 'P4ssw0rd';
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;

 // Definir o charset dos e-mails enviados
 $mail->CharSet = 'UTF-8';

    //Utilize um endereço de e-mail fixo do seu domínio para endereço de remetente
    //Aconselhamos que crie uma conta de e-mail, por exemplo "website@oseudominio.pt" para utilizar como e-mail de FROM
    //Não utilize aqui o endereço de e-mail do remetente, pois irá provocar a que o e-mail seja considerado Spam
    //devido a falhar a autenticação SPF
    $mail->setFrom('website@oseudominio.pt', 'Contacto via Website');
    //Defina o endereço de e-mail para onde a mensagem será enviada. Normalmente será o seu endereço de e-mail.
    $mail->addAddress('eu@oseudominio.pt', 'O Seu Nome');
    //Indique o endereço do remetente como Endereço de Resposta (Reply-to)
    if ($mail->addReplyTo($_POST['email'], $_POST['name'])) {
        //Definir assunto do e-mail
        $mail->Subject = 'Contacto via Website';
        //Definir que vamos utilizar HTML
        $mail->isHTML(true);

        //Definir versão HTML do e-mail
        $mail->Body = "<p><b>E-mail:</b> ". $_POST['email'] ."<br><b>Nome:</b> ". $_POST['name'] ."<br><b>Mensagem:</b><br>". $_POST['message']." </p><p>Mensagem enviada através do seu site - oseudominio.pt</p>";

        //Definir versão alternativa do e-mail apenas em plain text
        $mail->AltBody = <<<EOT
E-mail: {$_POST['email']}
Nome: {$_POST['name']}
Mensagem: {$_POST['message']}
EOT;
        //Enviar a mensagem e verificar se ocorreram erros
        if (!$mail->send()) {
            //O motivo pelo qual um envio falha é mostrado em $mail->ErrorInfo
            //no entanto não deverá mostrar estes erros ao utilizador, pelo que deverá apenas activar em situações de debug
            $msg = 'Desculpe, ocorreu um problema a enviar o e-mail. Por favor tente novamente mais tarde.';
        } else {
            $msg = 'Mensagem Enviada! Obrigado por nos contactar.';
        }
    } else {
        $msg = 'Endereço de e-mail inválido. Mensagem ignorada.';
    }
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Formulário de Contacto</title>
</head>
<body>
<h1>Contacte-nos</h1>
<?php if (!empty($msg)) {
    echo "<h2>$msg</h2>";
} ?>
<form method="POST">
    <label for="name">Nome: <input type="text" name="name" id="name"></label><br>
    <label for="email">Endereço de E-mail: <input type="email" name="email" id="email"></label><br>
    <label for="message">Mensagem: <br><textarea name="message" id="message" rows="8" cols="20"></textarea></label><br>
    <input type="submit" value="Enviar">
</form>
</body>
</html>

Existem outras formas de efectuar o envio de e-mails via PHP, como por exemplo o componente ZendMail ou o Swiftmailer. Bastará analisar e verificar aquele que se adapta melhor à sua solução.

Se necessitar de uma implementação mais avançada, poderá contactar-nos para que lhe possamos apresentar uma proposta de desenvolvimento à medida.