Posted on: March 14, 2022 12:24 PM
Posted by: Renato
Categories: Laravel aws PHP 100DaysOfCode developer
Views: 3270
Como enviar e-mail em massa no Laravel com Amazon (AWS) SES
Envio de e-mail em massa no Laravel com Amazon SES permitido o envio Limit, isso será útil se você quiser enviar mais e-mails por segundo para seu cliente e usuários.
O melhor suporte por e-mail para Laravel - Simple Email Service (SES) da Amazon
O Amazon SES possui limites rígidos no número de e-mails que pode enviar por segundo. Portanto, se nosso aplicativo ultrapassar esse limite, o SES descartará os e-mails acima desse limite. Isso não é um problema no envio de emails transacionais, ao enviar campanhas é importante acompanhar a velocidade de envio.
Com acesso à caixa de areia, você pode enviar e-mails para e-mails verificados no SES. Se você quiser sair da caixa de areia, você deve solicitar o aumento do limite de envio de SES. Depois de sair do sandbox, você pode começar a enviar mais e-mails para seus usuários em um limite por segundo.
Etapas para enviar e-mail em massa no Laravel com Amazon (AWS) SES
- Criar credenciais de usuário com o Amazon SES
- Configurar o Laravel para usar suas credenciais do Amazon SES
- Configurando e instalando o Amazon AWS SDK no Laravel
- Envie e-mails em massa com a API da AWS em Laravel
Etapa 1. Criar credenciais de usuário com o Amazon SES
Ao fazer login na AWS, vá para a lista de serviços da web da Amazon, onde você precisa selecionar SES.
Lista de Amazon Web Services
Depois de selecionar SES, você será redirecionado para o SES Dashboard. Lá você pode ver os limites de envio, número de emails enviados e algumas métricas.
Painel SES
Novas contas de usuário no SES estão no modo sandbox e podem enviar e-mails apenas para e-mails verificados no SES com determinado limite de envio. Ao solicitar um aumento do limite de envio, você obterá uma melhor velocidade de envio e seu aplicativo poderá enviar e-mails para qualquer endereço.
O AWS SES possui uma ótima API, que pode ser útil para grandes campanhas de e-mail. Para gerar um novo conjunto de chaves, você deve visitar Conta - Minhas credenciais de segurança.
Ao clicar no botão Get Started with IAM Users, você será redirecionado para a página do IAM. O IAM é um sistema da AWS para gerenciamento de identidades (simplificado: geração de chaves para diferentes serviços da AWS). Crie sua conta de usuário e obtenha sua chave de acesso e chave secreta.
Se você tiver problemas para criar chaves de conta, basta seguir nosso tutorial sobre como configurar a conta de usuário do Amazon IAM para envio de e-mail.
Agora temos todas as informações necessárias para enviar e-mails usando o AWS SES.
Nos sistemas de produção, a AWS solicita aos remetentes que tenham web hooks que capturarão a devolução e cumprirão as solicitações da AWS. Abordaremos isso em alguns dos tutoriais futuros.
Vale a pena ler
1. Práticas recomendadas de envio de e-mail do Amazon Simple Email Service
2. Guia do desenvolvedor
Etapa 2. Configurar o Laravel para usar suas credenciais do Amazon SES
Inserindo detalhes de SMTP no arquivo .env
MAIL_DRIVER=smtp
MAIL_HOST=email-smtp.us-west-2.amazonaws.com
MAIL_PORT=587
MAIL_USERNAME=XXXXXXXXXXXXXXXXXXXXXXXX
MAIL_PASSWORD=XXXXXXXXXXXXXXXXXXXXXXXX
MAIL_ENCRYPTION=tls
Se precisar enviar e-mails em massa, você pode fornecer suas credenciais da Aws no arquivo para o qual está enviando o e-mail. Para nossos aplicativos Laravel, podemos usar qualquer serviço de fila, como Redis, Amazon SQS, Beanstalk e muito mais. Para nosso projeto, usaremos o Beanstalk como Queue. Para detalhes de instalação e envio de e-mails na fila, leia nosso tutorial dedicado ao Beanstalk e Laravel Queue.
Se você estiver na fase de teste, poderá usar o driver de sincronização ou o banco de dados para a fila, que imitará a fila sem realmente usá-lo. Isso ajuda você a codificar tudo como se houvesse uma fila, mas sem realmente configurá-la.
No arquivo .env:
QUEUE_DRIVER=sincronizar
ou
QUEUE_DRIVER=banco de dados
Mais tarde, você mudará isso com o Beanstalk ou o driver redis para Laravel
Etapa 3. Configurando e instalando o Amazon AWS SDK no Laravel
Instalando o AWS SDK para PHP
Você pode seguir as etapas fornecidas nos documentos do GitHub ou do Amazon SES .
O AWS Service Provider pode ser instalado via Composer exigindo o pacote aws/aws-sdk-php-laravel no composer.json do seu projeto.
{
"require": {
"aws/aws-sdk-php-laravel": "~3.0"
}
}
Em seguida, execute uma atualização do compositor
atualização do php composer.phar
Para usar o AWS Service Provider, você deve registrar o provedor ao inicializar seu aplicativo.
Lúmen
No Lumen, encontre o Register Service Providers em seu bootstrap/app.php e registre o AWS Service Provider.
$app->register(Aws\Laravel\AwsServiceProvider::class);
Laravel
No Laravel encontre a chave do provedor em seu config/app.php e registre o AWS Service Provider.
'providers' => array(
// ...
Aws\Laravel\AwsServiceProvider::class,
)
Encontre a chave de aliases em seu config/app.php e adicione o alias de fachada da AWS.
'aliases' => array(
// ...
'AWS' => Aws\Laravel\AwsFacade::class,
)
Configuração
Por padrão, o pacote usa as seguintes variáveis de ambiente para configurar automaticamente o plug-in sem modificação:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_REGION (padrão = us-east-1)
Para personalizar o arquivo de configuração, publique a configuração do pacote usando Artisan.
php artisan vendor:publish --provider="Aws\Laravel\AwsServiceProvider"
Atualize suas configurações no arquivo de configuração app/config/aws.php gerado.
return [
'credentials' => [
'key' => 'YOUR_AWS_ACCESS_KEY_ID',
'secret' => 'YOUR_AWS_SECRET_ACCESS_KEY',
],
'region' => 'us-west-2',
'version' => 'latest',
// Você pode substituir as configurações de serviços específicos
'Ses' => [
'region' => 'us-east-1',
],
];
Consultando o guia de atualização do Laravel 5.2.0, você deve usar o arquivo de configuração em vez da opção de variável de ambiente se estiver usando php artisan config:cache.
Etapa 4. Enviar e-mail em massa com API Aws em Laravel
Você pode usar diferentes métodos para testar sua aplicação, no nosso caso usaremos o Laravel Controller
Alguns métodos simples para testar o envio de e-mail em massa no Laravel
1. Criando um comando Laravel e adicionando a parte de envio de e-mail a uma fila Laravel
2. Crie um comando e teste no seu terminal
3. Criar um Controller simples e testar os resultados.
Código:
<?php
namespace App\Http\Controllers;
usar Log;
use Exceção;
use Aws\CommandPool;
use Aws\Ses\SesClient;
use GuzzleHttp\Client;
use Aws\ResultInterface;
use Aws\CommandInterface;
use Illuminate\Http\Request;
use Aws\Exception\AwsException;
use Illuminate\Queue\SerializaModels;
use GuzzleHttp\Promise\PromiseInterface;
use GuzzleHttp\Exception\GuzzleException;
class TestController extends Controller
{
public function test()
{
$client = new SesClient([
'version' => 'latest',
'region' => 'us-west-2',
'credentials' => [
'key'
'segredo' => 'XXXXXXXXXXXXXXXXXX',
],
]);
$recipients = [
'[email protected]',
'[email protected]',
'[email protected]',
];
// Embaralha os destinatários para fins de teste
shuffle($recipients);
// Enfileira de emails como comandos SendEmail
$i = 100;
$comandos = [];
foreach ($recipients as $recipient) {
$commands[] = $client->getCommand('SendEmail', [
// Passa o id da mensagem para que possa ser atualizado após o processamento (é ignorado pelo SES)
'x-message -id' => $i,
'Source' => 'Teste paralelo AWS SES <[email protected]>',
'
'ToAddresses' => [$recipient],
],
'Message' => [
'Subject' => [
'Data' => 'SES API test',
'Charset' => 'UTF-8',
],
'Body ' => [
'Html' => [
'Dados' => 'Este é um <b>teste</b>.',
'Charset' => 'UTF-8',
],
],
],
]);
$i++;
}
try
{
$timeStart = microtime(true);
$pool = new CommandPool($client, $commands, [
'simultaneidade' => 10,
'antes' =>
// echo sprintf('Prestando para enviar %d: %s' . PHP_EOL, $iteratorId, $a['Destination']['ToAddresses'][0]);
Log::info('Para enviar ' .$iteratorId .': '. $a['Destination']['ToAddresses'][0]);
},
'fulfilled' => function (ResultInterface $result, $iteratorId) use ($commands) {
// echo sprintf(
// 'Concluído %d: %s' . PHP_EOL,
// $commands[$iteratorId][' x-message-id'],
// $commands[$iteratorId]['Destination']['ToAddresses'][0]
// );
Log::info('Concluído ' .$commands[$iteratorId]['x-message-id'].' :'.$commands[$iteratorId]['Destination']['ToAddresses'][0]);
// echo sprintf(
// 'Falha %d: %s' . PHP_EOL,
// $commands[$iteratorId]['x-message-id'],
// $commands[$iteratorId]['Destination'][ 'ToAddresses'][0]
// ); Log::info('Motivo: '.$motivo); Log::error('Amazon SES Failed Rejected:' . $commands[$iteratorId]['x-message-id'] . ' :' . $commands[$iteratorId]['Destination']['ToAddresses'][ 0]); }, ]); // Inicia as transferências do pool $promise = $pool->promise(); // Força o pool a completar de forma síncrona $promise->wait(); $timeEnd = microtime(true); // echo sprintf('Operação concluída em %s segundos' . PHP_EOL, $timeEnd - $timeStart); } catch (Exceção $e) {
// echo sprintf('Erro: %s' . PHP_EOL, $e->getMessage());
Log::error('Catch Block: Amazon SES Exception : ' . $e->getMessage());
}
}
}
Espero que o tutorial tenha ajudado você. Boa sorte. Saúde!
Fonte:
- https://vannstudios.com/send-bulk-email-in-laravel-with-amazon-ses-t-1
Donate to Site
Renato
Developer