Laravel Notifications usando mais de um SMTP

Recentemente precisei efetuar mudanças em minha plataforma para o envio de notificações. Por utilizar um TLD pouco usado, nem todos nossos clientes recebiam um email por serem considerados *spam* ou *blacklisted* e foi ai que eu precisei encontrar uma maneira de enviar emails usando um smtp secundário para garantir que eles recebam as notificações.

Primeira idéia foi que eu precisaria criar uma flag no cadastro do usuário para dizer se ele deve usar o primário ou secundário e dar algum jeito para fazer ele decidir por onde enviar usando a fala.

As Notificações do Laravel permite que eu crie Custom Channels. Então eu pensei em reaproveitar o MailChannel mas não foi tão simples como eu pensei… por que ele utiliza a instância do SwiftTransport (responsável pelo envio dos emails) e ela é registrada já com os dados do SMTP[1][2], isto é, para eu alterar os dados eu teria que registrar novamente o SwiftTransport.

Então eu criei meu FallbackMailChannel e extendi ao MailChannel para reaproveitar tudo, já que é uma modificação relativamente pequena. O tchan do negócio é sobrescrever os dados das configurações usando variáveis de ambiente e registrar o SwiftTransport novamente. Eu utilizei o padrão de variáveis de ambiente MAIL_*_ALT para sobrescrever o MAIL_*.

.env com MAIL_*_ALT
registro do Channel alternativo

Feito! Agora temos um MailChannel que envia email usando o FallbackMailChannel, basta alterar o método via que faça a tratativa para retornar qual Channel ele deve utilizar para enviar a notificação.

tratativa para enviar usando Channel diferente de acordo com o cadastro do usuario

Bom… era isso que eu queria compartilhar, apesar da solução parecer simples me demandou um tempo até eu chegar nisso que passei para vocês.

vlw flw.