Aprenda a enviar e-mails em massa com rapidez e eficiência usando PHP

Por Sérgio Oliveira

Quando se trabalha numa empresa que tem seu braço forte no setor de tecnologia de informação, uma das atividades que invariavelmente aparecem é a necessidade de enviar mensagens para milhões de usuários. Essa necessidade é ainda maior quando há uma lista de clientes inscritos no e-mail marketing da empresa. E aí surge a dúvida na cabeça do desenvolvedor: qual a melhor forma de desenvolver essa solução?

Tudo dependerá das habilidades do programador e com quais linguagens de programação ele está familiarizado. A forma como a necessidade será abordada também é muito importante e às vezes as exigências nos faz percorrer um caminho ou outro. Contudo, se houver liberdade de escolha, uma das opções mais práticas é o PHP.

Há quem não recomende o uso desta linguagem alegando lentidão e/ou falta de segurança. Porém, a verdade é que desde a introdução do Zend Engine 1 no PHP 4 o código fonte do PHP deixou de ser interpretado durante a execução e passou a ser compilado em byte code antes dela. Essa característica tornou o PHP não só mais parecido com o Java ou C#, por exemplo, mas também aumentou sua velocidade de execução assombrosamente.

Além disso, uma série de novas e antigas funções foi escrita em C em vez de PHP para aumentar ainda mais a velocidade de execução e processamento de dados. E aí o PHP só faz passar os parâmetros a serem processados – e o restante fica por conta do C.

Tal característica acelerou a realização de tarefas mais pesadas, como, por exemplo, o envio de mensagens de e-mails em massa. Neste cenário, há uma classe bem peculiar que agrega várias dessas funções em C, que é a MIME message. Vamos aprender a utilizá-la agora.

Enviando e-mails para muitos destinatários

Uma das otimizações presentes na classe Mime é a função SetBulkMail. Ela auxilia a classe a se preparar para enviar uma quantidade enorme de mensagens, uma após a outra, para que não haja travamento no processo.

Essa otimização só faz sentido, no entanto, quando o programador utiliza algumas sub-classes específicas, como a smtp_message_class, que utiliza servidores SMTP e evita que a classe feche a conexão com o servidor entre o envio das mensagens a dois destinatários. Dessa forma, o servidor não é sobrecarregado pelo processo de fechar e reabrir a mesma conexão SMTP.

A sub-classe sendmail_message_class, por outro lado, ajusta a variável delivery_mode para que o servidor de e-mails Sendmail armazene a mensagem em uma fila local ao invés de esperar para entregar a mensagem para o servidor SMTP de destino.

Um exemplo de como inicializar a sendmail_message_class para enviar e-mails em massa pode ser conferido abaixo. Lembre-se: use esta classe em um servidor executando PHP e que possui Sendmail ou outro servidor de e-mail compatível como Postfix, Qmail, etc.

Código de envio de e-mail em massa usando PHP

As newsletters são o caso mais comum de envio de e-mails em massa. Neste tipo de mensagem, a única coisa que muda de um destinatário para o outro é o cabeçalho do e-mail e nada mais.

E é aí que a variável cache_body da classe MIME message se destaca. Ela armazena em cache todo o corpo da mensagem montada quando o primeiro e-mail é enviado e só faz recuperá-lo nas próximas mensagens, dispensando o trabalho de remontagem de tudo para os destinatários subsequentes.

O exemplo abaixo mostra um loop de entrega de uma mensagem para vários destinatários com o mesmo corpo:

Código envio e-mail em massa PHP

Diferente dos e-mails de newsletters, o envio de mensagens personalizadas é um pouco mais complicado principalmente porque há necessidade de configurar diferentes dados de body para cada destinatário.

O exemplo abaixo mostra como fazer isso:

Código envio e-mail em massa PHP

Melhorando o que já está bom

Embora os exemplos acima já desafoguem consideravelmente o servidor quando ele for enviar mensagens em massa, ainda é possível executar alguns ajustes para que a tarefa seja processada mais rapidamente.

Para reduzir o tempo e o uso de CPU numa campanha de envio em massa é necessário otimizar o código que está dentro do loop do destinatário. Neste caso, o que mais sobrecarrega a CPU é a codificação das mensagens para formar o invólucro MIME das mensagens que serão enviadas ao servidor de e-mails.

No caso de mensagens HTML padrão, o que é mais custoso é codificar o corpo das mensagens utilizando o algoritmo de quoted-printable. Ele é usado principalmente para que as mensagens não tenham caracteres especiais que são ilegais e confundem os gateways dos servidores.

Se você estiver trabalhando com versões mais antigas do PHP, perceberá que elas não fornecem uma função para codificar mensagens de e-mail usando quoted-printable. Neste caso você pode usar as funções imap_8bit, que exigem a ativação da extensão PHP IMAP.

A classe email_message_class também fornece uma implementação em PHP puro do algoritmo de codificação quoted-printable, mas ela não é muito rápida e estaríamos trocando seis por meia dúzia aqui.

Outro aspecto que pode ser melhorado é a comunicação com o servidor de e-mail. O problema é que não há muito o que fazer além do que a classe já faz.

Mesmo assim, uma boa dica é usar a sub-classe de entrega especializada que possua o sendmail ou equivalente (Postfix, Qmail ou Exim, por exemplo) para agilizar o processo em detrimento do enfileiramento das mensagens no servidor via protocolo SMTP.

Com essas dicas e exemplos você não só poderá implementar tarefas pesadas como o envio de e-mails em PHP como também as fará com grande eficiência. Se você se interessou pelo assunto, talvez valha a pena investir um tempo extra para estudar a classe MIME message que está ativa e em desenvolvimento desde 1999. Ela não só já é bem madura, como também implementa muitas otimizações inteligentes para melhorar o desempenho de aplicativos de e-mail em massa.