Enviando emails autenticados do Gmail com PHP usando Swift Mailer

O Swift Mailer é uma biblioteca para envio de emails, usando PHP5. Conheci a biblioteca inicialmente no framework Symfony, pois a mesma é responsável pela tarefa de enviar emails no framework, pois seu uso é muito simples e a biblioteca é muito poderosa.

Tenho notado que muitas empresas estão adotando cada vez mais o uso do Google Apps como serviço de webmail, dada a facilidade de uso e configuração do sistema. O primeiro exemplo mostra como enviar emails autenticados a partir de uma conta de email do Google (Gmail ou Apps) e os outros tratam do envio de mensagens com anexo. Usei a versão 4.0.6 para o exemplo.

Enviando emails com autenticação no Gmail (incluindo Google Apps)

require('lib/swift_required.php');

$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
	->setUsername('usuario@gmail.com')
	->setPassword('senha');

$mailer = Swift_Mailer::newInstance($transport);

$message = Swift_Message::newInstance('Assunto')
	->setFrom(array('seuemail@dominio.com.br' => 'Seu Nome'))
	->setTo(array('fulano@teste.com.br'))
	->setReplyTo('seuemail@dominio.com.br')
	->setBody('Conteudo da mensagem');

if ($mailer->send($message)){
	echo 'Mensagem enviada com sucesso';
}
else{
	echo 'Problema ao enviar mensagem. Tente novamente mais tarde';
}


Enviando emails com imagens embutidas (inline)

Útil para enviar emails com imagens que não serão bloqueadas pelos softwares leitores de email, já que estão embutidas no código e não em servidores remotos.

require('lib/swift_required.php');

$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
	->setUsername('usuario@gmail.com')
	->setPassword('senha');

$mailer = Swift_Mailer::newInstance($transport);

$message = Swift_Message::newInstance('Assunto')
	->setFrom(array('seuemail@dominio.com.br' => 'Seu Nome'))
	->setTo(array('fulano@teste.com.br'))
	->setReplyTo('seuemail@dominio.com.br');

$imagem_inline = $message->embed(Swift_Image::fromPath('logotipo.png'));

$message->setBody(
	'<html>'.
	' <head></head>'.
	' <body>' .
	'  <img src="'.$imagem_inline.'" alt="Imagem embutida na mensagem" />'.
	'  <br /><br />Texto da mensagem'.
	' </body>'.
	'</html>',
  'text/html' //Definimos o tipo da mensagem para text/html, ao invés de texto puro
);

if ($mailer->send($message)){
	echo 'Mensagem enviada com sucesso';
}
else{
	echo 'Problema ao enviar mensagem. Tente novamente mais tarde';
}


Enviando emails com anexo

require_once 'lib/swift_required.php';

$transport = Swift_SmtpTransport::newInstance('smtp.seudominio.com', 25)
	->setUsername('seuemail@dominio.com')
	->setPassword('senha');

$mailer = Swift_Mailer::newInstance($transport);

$message = Swift_Message::newInstance()
	->setSubject('Email com PDF anexado')
	->setFrom(array('seuemail@seudominio.com' => 'Seu nome'))
	->setTo(array('contato1@teste.org', 'contato2@teste.org'))
	->setBody('Leia a apostila em anexo')
	->attach(Swift_Attachment::fromPath('apostilas/apostila_inicial.pdf'));

if ( ! $mailer->send($message)){
	echo 'Erro ao enviar email';
}

Bom, esses foram alguns exemplos bem básicos do uso da biblioteca Swift Mailer. Consulte a documentação oficial para mais informações e um guia de referência completo.

Abraço e até a próxima!

9 comments on “Enviando emails autenticados do Gmail com PHP usando Swift Mailer

  1. Grande Jonnas!

    Mais um da série “posts úteis, favorita aí”. Ajudou-me a migrar do PHPMailer, que estava dando problema de destinatário inválido. E, como tudo que é bom, o SwiftMailer tem plugin pro Yii Framework *____*.

    Um abraço,

  2. Valdivino on said:

    Não deu certo apresentou este erro

    Warning: fsockopen() [function.fsockopen]: unable to connect to ssl://smtp.gmail.com:465 (Unable to find the socket transport “ssl” – did you forget to enable it when you configured PHP?) in C:wamp2wwwsmtpSwift-4.0.6Swift-4.0.6libclassesSwiftTransportStreamBuffer.php on line 233

    Fatal error: Uncaught exception ‘Swift_TransportException’ with message ‘Connection could not be established with host smtp.gmail.com [Unable to find the socket transport \"ssl\" - did you forget to enable it when you configured PHP? #72449753]‘ in C:wamp2wwwsmtpSwift-4.0.6Swift-4.0.6libclassesSwiftTransportStreamBuffer.php:235 Stack trace: #0 C:wamp2wwwsmtpSwift-4.0.6Swift-4.0.6libclassesSwiftTransportStreamBuffer.php(70): Swift_Transport_StreamBuffer->_establishSocketConnection() #1 C:wamp2wwwsmtpSwift-4.0.6Swift-4.0.6libclassesSwiftTransportAbstractSmtpTransport.php(101): Swift_Transport_StreamBuffer->initialize(Array) #2 C:wamp2wwwsmtpSwift-4.0.6Swift-4.0.6libclassesSwiftMailer.php(74): Swift_Transport_AbstractSmtpTransport->start() #3 C:wamp2wwwsmtpSwift-4.0.6Swift-4.0.6emailgmail.php(21): Swift_Mailer->send(Object(Swift_Message)) #4 {main} thrown in C:wamp2wwwsmtpSwift-4.0.6Swift-4.0.6libclassesSwiftTransportStreamBuffer.php on line 235

    tem como me ajudar?

  3. @Valdivino Cara, acho que o problema está na configuração do seu PHP. Veja essa parte que está no meio do erro: [b]Unable to find the socket transport “ssl” – did you forget to enable it when you configured PHP? #72449753[/b]

  4. Wanderley on said:

    Olá Jonnas,

    Queria saber se o Valdivino resolveu o problema. Não tô sabendo como parametrizar isso no arquivo StreamBuffer.php na linha 233.

    Jonnas, por favor, pode me ajudar?

    Obrigado.

  5. @Wanderley Esse problema ocorre devido a extensão OpenSSL não estar habilitada no seu arquivo de configuração [b]php.ini[/b]. Basta procurar por “openssl” no arquivo, descomentar a linha referente e reiniciar o Apache.

  6. Jonnas! Executo o script e recebo o seguinte erro:

    Warning: fsockopen() [function.fsockopen]: unable to connect to ssl://smtp.gmail.com:465 (Connection timed out) in /home/astrostu/public_html/swift/lib/classes/Swift/Transport/StreamBuffer.php on line 233

    Fatal error: Uncaught exception ‘Swift_TransportException’ with message ‘Connection could not be established with host smtp.gmail.com [Connection timed out #110]‘ in /home/astrostu/public_html/swift/lib/classes/Swift/Transport/StreamBuffer.php:235 Stack trace: #0 /home/astrostu/public_html/swift/lib/classes/Swift/Transport/StreamBuffer.php(70): Swift_Transport_StreamBuffer->_establishSocketConnection() #1 /home/astrostu/public_html/swift/lib/classes/Swift/Transport/AbstractSmtpTransport.php(101): Swift_Transport_StreamBuffer->initialize(Array) #2 /home/astrostu/public_html/swift/lib/classes/Swift/Mailer.php(74): Swift_Transport_AbstractSmtpTransport->start() #3 /home/astrostu/public_html/envia-teste2.php(16): Swift_Mailer->send(Object(Swift_Message)) #4 {main} thrown in /home/astrostu/public_html/swift/lib/classes/Swift/Transport/StreamBuffer.php on line 235

    Pode me ajudar com isso? Valeu!

  7. Flávio Araújo on said:

    Cara, sensacional essa dica. Acabe de testar para um cliente que esta hospedado na locaweb e usa o email do google.

    Ai por conta do apontamento do MX, a locaweb nao deixa enviar os emails de forma alguma.

    Fiz o teste e chegou rapidinho, e o melhor, a mensagem enviada fica salva na pasta de itens enviados do webmail. Sensacional ;)

  8. Samuel Victor Mendes Silva on said:

    Belo post, funcionou perfeitamente. Entretanto existe um delay para chegar os e-mails onde posso ver isso?

    PARABÉNS!!!

  9. Muito bom, funcionou da forma que eu queria, obrigado!

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

HTML tags are not allowed.