Thiago
Thiago

Reputation: 91

Laravel not sending mail using AWS SES

I am trying to send email in my Laravel project using AWS SES.
The error messages are not being very helpful.

In AWS SES, I verified the identity of both my domain and the email address I’m using as sender in my test.
In AWS IAM Manager, I generated a Key-pair.
I’m confident that this part is working fine because I used it to send mail in a previous PHP application with PHPMailer in the same EC2 server.
On the server side, an EC2 instance running Ubuntu, I installed the package according to Laravel manual:
composer require aws/aws-sdk-php
In config/mail.php:

<?php
return [
'default' => env('MAIL_MAILER', 'smtp'),
'mailers' => [
'ses' => [
            'transport' => ‘ses',
            'host' => env('MAIL_HOST'),
            'key' => env('SES_ACCESS_KEY_ID'),
            'secret' => env('SES_SECRET_ACCESS_KEY'),
            'region' => env('SES_DEFAULT_REGION', 'us-east-1'),
            'encryption' => 'tls',
            'port' => 587,
        ],
], 
'from' => [
        'address' => env('MAIL_FROM_ADDRESS', '[email protected]'),
        'name' => env('MAIL_FROM_NAME', 'Example'),
    ],
];

In config/services.php:

<?php
return [
    'ses' => [
        'key' => env('SES_ACCESS_KEY_ID'),
        'secret' => env('SES_SECRET_ACCESS_KEY'),
        'region' => env('SES_DEFAULT_REGION', 'us-east-1'),
    ],
];

In .env:

MAIL_MAILER=ses
MAIL_HOST="email-smtp.sa-east-1.amazonaws.com"
MAIL_FROM_ADDRESS="[email protected]"
MAIL_FROM_NAME="${APP_NAME}"
MAIL_EHLO_DOMAIN="my-verified-domain.com"
SES_DEFAULT_REGION=sa-east-1
SES_ACCESS_KEY_ID=”MY-KEY-ID, TRIED QUOTED AND NOT QUOTED”
SES_SECRET_ACCESS_KEY= “MY-SAK, TRIED QUOTED AND NOT QUOTED”

After the setup, I ran:
php artisan config:clear (even though my project is not caching the configuration)
php artisan tinker
In Tinker:
Mail::raw("TEST BODY", function($msg){ $msg->to("[email protected]")->subject("TEST SUBJECT"); });
The command is throwing this Exception:

Exception Request to AWS SES API failed. Reason: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details..

For debugging purpose, I ran:
dd(config('mail'));
Everything seems OK:

array:4 [ // vendor/psy/psysh/src/ExecutionLoopClosure.php(53) : eval()'d code:1
  "default" => "ses"
  "mailers" => array:1 [
    "ses" => array:7 [
      "transport" => "ses"
      "host" => "email-smtp.sa-east-1.amazonaws.com"
      "key" => " MY-KEY-ID"
      "secret" => "MY-SECRET"
      "region" => "sa-east-1"
      "encryption" => "tls"
      "port" => 587
    ]
  ]
  "from" => array:2 [
    "address" => "[email protected]"
    "name" => " LARAVEL_APP "
  ]
  "contact" => array:1 [
    "address" => "LARAVEL_APP"
  ]
]

I don’t know if it is of any help, but I’ll add some additional testing I already tried:
If I change the Transport to ‘smtp’, the error is:

Symfony\Component\Mailer\Exception\TransportException Expected response code "250" but got code "530", with message "530 Authentication required".

As I said before, the SES credentials are working fine in another application (not a Laravel one) in the same EC2 server. Even so, I tried creating new ones also, facing the same error.
Finally, I tried different combinations of the mailer array, removing the keys: 'host', 'region', 'encryption' and 'port'.
What I am doing wrong here?!

Upvotes: 0

Views: 1643

Answers (1)

sahith palika
sahith palika

Reputation: 173

Confirm that the region you're using matches the region of your SES setup in AWS.

In your .env file, you've set SES_DEFAULT_REGION to sa-east-1, but in your SES configuration, the region is set to us-east-1.

Upvotes: 0

Related Questions