# Como enviar e-mails com o PHPMailer

O PHPMailer é uma **biblioteca PHP** que permite o [envio de e-mails](https://www.ionos.com/pt-pt/digitalguide/e-mail/questoes-tecnicas/como-se-envia-um-e-mail/) através do PHP. Este tipo de envio de e-mails é utilizado principalmente para **formulários de contacto** em páginas web, embora também seja possível enviar e-mails privados.

## O que é o PHPMailer?

O PHPMailer é uma **extensão de e-mail** desenvolvida pela comunidade para o PHP. Ao contrário da função Mail, que está integrada no PHP desde o início, a probabilidade de os e-mails enviados com o PHPMailer acabarem na pasta de spam é muito menor, uma vez que os e-mails gerados com a biblioteca PHP são enviados utilizando SMTP (um protocolo de transferência simples de correio utilizado para transferir e-mails através da Internet). Além disso, o PHPMailer suporta, ao contrário da função Mail integrada, e-mails em HTML e anexos.

## Para que serve o PHPMailer?

A utilização do PHPMailer é um pouco mais complicada do que a utilização de fornecedores de e-mail ou programas de e-mail. Uma pergunta frequente é, portanto, em que contextos é recomendável utilizar o PHPMailer. A utilização do framework PHP facilita a criação de respostas automatizadas, como as que são geradas na gestão de uma **loja online**. O PHPMailer também é muito útil para **formulários de contacto**.

## Requisitos para a utilização do PHPMailer

Para poder trabalhar com o PHPMailer, primeiro precisas de um servidor SMTP. Podes optar por utilizar o **[servidor de e-mail](https://www.ionos.co.uk/office-solutions/email-server "Servidor de correo con IONOS")** de um fornecedor ou criar o **teu próprio**. Além disso, para a instalação da extensão PHP, recomenda-se a utilização de um gestor de pacotes para PHP, como o Composer.

Dica Outro requisito para utilizar o PHPMailer é dominar os conceitos básicos do PHP. Se ainda tiveres alguma dificuldade nesta matéria, o nosso tutorial de PHP para principiantes poderá ser-te útil.

## Instalação do PHPMailer: instruções passo a passo

### Passo 1. Descarregue a versão mais recente do PHPMailer

Descarregue a **versão mais recente do PHPMailer**. O download pode ser feito através do gestor de pacotes ou manualmente a partir do GitHub.

#### Opção 1. Transferência através do Composer

Se tiver instalado o gestor de pacotes [Composer](https://getcomposer.org/ "Página web de Composer"), utilize o comando:

```bash
composer require phpmailer/phpmailer
```

**Importante**. Se instalaste o PHPMailer com o Composer, deves incluir «composer» no teu código PHP para poderes enviar e-mails.

Para isso, introduza este código:

```php
require_once "vendor/autoload.php";
```

O termo\*\*«requiere\_once»\*\*garante que o Composer seja integrado apenas uma vez. Qualquer outra opção poderia causar um comportamento imprevisível ou erros no programa. A instalação com o Composer está concluída.

#### Opção 2: Transferir do GitHub

Os ficheiros-fonte do PHPMailer também podem ser descarregados **manualmente** clicando no botão «Code» no [repositório GitHub](https://github.com/PHPMailer/PHPMailer "PHPMailer en GitHub") correspondente e descarregando o ficheiro ZIP. Se o Git estiver instalado no seu sistema, também pode «clonar» o repositório utilizando um comando de linha de comandos.

### Passo 2. Descompactar os ficheiros

Se descarregou manualmente o código-fonte do PHPMailer, terá de abrir o ficheiro ZIP. Para tal, selecione o local onde pretende instalar o PHPMailer. Mais uma vez, deve primeiro **incluir o PHPMailer no seu script**. Depois de descompactar os ficheiros do PHPMailer num diretório chamado PHPMailer, utilize as seguintes linhas de código:

```php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
/*Clase para tratar con excepciones y errores*/
require 'C:/PHPMailer/src/Exception.php';
/*Clase PHPMailer*/
require 'C:/PHPMailer/src/PHPMailer.php';
/*Clase SMTP necesaria para la conexión con un servidor SMTP*/
require 'C:/PHPMailer/src/SMTP.php';
/*Al crear un objeto PHPMailer, pasa el parámetro "true" para activar las excepciones (mensajes en caso de error)*/
$email = new PHPMailer(true);
```

## Envio de e-mails com o PHPMailer: instruções passo a passo

### Passo 1. Incluir espaços de nomes

Para poder aceder ao PHPMailer, certifique-se primeiro de que os **namespaces** estão corretamente incluídos. Para tal, utilizam-se as instruções `use`, pelo que o seu código deve conter as seguintes linhas:

```php
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
```

Agora poderá aceder às aulas individuais utilizando o nome que aparece após a última barra.

### Passo 2. Detectar erros

Embora o PHPMailer seja uma opção muito fiável para enviar e-mails, podem ocorrer erros de vez em quando. Para evitar enviar dados confidenciais do seu servidor de e-mail aos utilizadores na forma de uma mensagem de erro, é recomendável envolver o envio de e-mails na instrução **Try-Catch**:

```php
try {
    // Intentar crear una nueva instancia de la clase PHPMailer con excepciones habilitadas
    $mail = new PHPMailer (true);
// (…)
} catch (Exception $e) {
        echo "Mailer Error: ".$e->getMessage());
}
```

### Passo 3. Autenticação com SMTP

Para utilizar o PHPMailer, tem **de se autenticar através do SMTP**. Para tal, introduza o endereço do seu servidor de e-mail, o protocolo correspondente (seja TLS/SSL ou SMTP), a porta, o seu nome de utilizador e a sua palavra-passe. O protocolo e a porta utilizados dependem do seu **fornecedor de e-mail**. Pode encontrar os dados do servidor em questão nos **sites dos fornecedores de e-mail**.

```php
$mail->isSMTP();
$mail->SMTPAuth = true;
// Datos personales
$mail->Host = "smtp.domain.es";
$mail->Port = 587;
$mail->Username = "nombre.apellidoo@domain.es";
$mail->Password = "ejemplocontraseña1234";
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
```

Em vez de utilizar o método de encriptação `ENCRYPTION_STARTTLS`, pode optar-se pelo `ENCRYPTION_SMTPS`. Com este último, a ligação ao servidor só é estabelecida se [o TLS](https://www.ionos.com/pt-pt/digitalguide/servidores/seguranca/tls-seguranca-da-camada-de-transporte/) estiver ativado. Além disso, a comunicação com o servidor só é possível se este suportar as medidas de encriptação necessárias. Por outro lado, com o StartTLS, a ligação ao servidor de correio é estabelecida primeiro sem encriptação. A encriptação é realizada posteriormente e, se a encriptação TLS não for possível, a troca de dados restante é realizada sem encriptação.

Embora o SMTPS ofereça um nível de segurança mais elevado, o StartTLS proporciona uma melhor compatibilidade. Por esse motivo, o StartTLS é utilizado com maior frequência.

### Passo 4. Introduzir o destinatário do e-mail

Agora pode introduzir o **destinatário** do e-mail.

```php
// Remitente
$mail->setFrom('info@example.com', 'name');
// Destinatario, opcionalmente también se puede especificar el nombre
$mail->addAddress('info@example.com', 'name');
// Copia
$mail->addCC('info@example.com');
// Copia oculta
$mail->addBCC('info@example.com', 'name');
```

### Passo 5. Adicionar o conteúdo do e-mail

É claro que não pode faltar o mais importante: o conteúdo do e-mail. Esse conteúdo consiste normalmente num assunto e num texto, que é disponibilizado **tanto na versão HTML como na versão não HTML**. Importante: os programas mais antigos nem sempre suportam o padrão HTML5, pelo que pode ser aconselhável criar o seu e-mail utilizando apenas HTML.

Com o PHPMailer, também podes enviar **anexos** sem qualquer problema: sejam imagens **, ficheiros de áudio, documentos, vídeos ou GIFs**. A função **addAttachment** ajuda-te a fazê-lo. Além disso, podes renomear os teus anexos com um segundo parâmetro opcional.

```php
$mail->isHTML(true);
// Asunto
$mail->Subject = 'Asunto de tu correo electrónico';
// Contenido HTML
$mail->Body = 'El contenido de tu correo en HTML. Los elementos en <b>negrita</b> también están permitidos,';
$mail->AltBody = 'El texto como elemento de texto simple';
// Agregar archivo adjunto
$mail->addAttachment("/home/user/Escritorio/imagendeejemplo.png", " imagendeejemplo.png");
```

### Passo 6. Utilizar a codificação de caracteres correta

Nos países de língua espanhola, é aconselhável ativar o UTF-8 no PHPMailer para evitar erros de visualização, especialmente quando se utilizam vários anexos. Para tal, adicione as seguintes linhas de código ao seu script PHP:

```php
$mail->CharSet = 'UTF-8';
$mail->Encoding = 'base64';
```

### Passo 7. Enviar o e-mail

No último passo, basta enviar o e-mail. Para isso, utiliza o comando:

```php
$mail->send();
```

Certifique-se de que coloca todo o código apresentado até ao pedido de envio no **bloco Try** do seu script, para que qualquer erro eventual seja capturado conforme descrito.

## Um exemplo de código para enviar um e-mail

Aqui está, mais uma vez, todo o código de que precisas para enviar um e-mail (com imagem anexada) utilizando o PHPMailer:

```php
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require_once "vendor/autoload.php";
// Activar o desactivar excepciones mediante variable
$debug = true;
try {
    // Crear instancia de la clase PHPMailer
    $mail = new PHPMailer($debug);
    if ($debug) {
        // Genera un registro detallado
        $mail->SMTPDebug = SMTP::DEBUG_SERVER; 
    }
    // Autentificación con SMTP
    $mail->isSMTP();
    $mail->SMTPAuth = true;
    // Login
    $mail->Host = "smtp.domain.es";
    $mail->Port = 587;
    $mail->Username = "nombre.apellido@domain.es";
    $mail->Password = "ejemplocontraseña1234";
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $mail->setFrom('info@example.com', 'name');
    $mail->addAddress('info@example.com', 'name');
    $mail->addAttachment("/home/user/Escritorio/imagendeejemplo.png", "imagendeejemplo.png");
    $mail->CharSet = 'UTF-8';
    $mail->Encoding = 'base64';
    $mail->isHTML(true);
    $mail->Subject = 'Asunto de tu correo';
    $mail->Body = 'El contenido de tu correo en HTML. Los elementos en <b>negrita</b> también están permitidos.';
    $mail->AltBody = 'Texto como elemento de texto simple';
    $mail->send();
} catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: ".$e->getMessage();
}
```


This is a markdown version of: [https://www.ionos.com/pt-pt/digitalguide/e-mail/questoes-tecnicas/phpmailer/](https://www.ionos.com/pt-pt/digitalguide/e-mail/questoes-tecnicas/phpmailer/) for AI/LLM consumption.