【问题标题】:Mailgun emails not sending from Laravel 8 Valet appMailgun 电子邮件未从 Laravel 8 Valet 应用程序发送
【发布时间】:2021-03-30 20:48:53
【问题描述】:

这是我的相关@​​987654323@:

MAIL_MAILER=mailgun
MAIL_HOST=smtp.mailgun.org
MAIL_PORT=587
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"
MAILGUN_DOMAIN=https://api.mailgun.net/v3/mail.example.com
MAILGUN_SECRET=fb...a1

注意:我使用 example.com 作为上面的示例,但我已将我的实际域名放在那里。我没有从 Laravel 应用程序中收到任何错误,并且在 Mailgun 仪表板上的日志中看不到任何内容。我的域已通过验证。 fb...a1 也是经过编辑的 API 代码,我当然会使用从 mailgun 仪表板获得的完整 API 代码。

config/mail.php:

<?php

return [
    'default' => env('MAIL_MAILER', 'mailgun'),

    'mailers' => [
        'mailgun' => [
            'transport' => 'mailgun',
        ],
    ],
];

config/services.php:

'mailgun' => [
    'domain' => env('MAILGUN_DOMAIN'),
    'secret' => env('MAILGUN_SECRET'),
    'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),
],

在我的控制器中,我有:

$email = $validated['email']; // I've verified this is my actual email
Mail::to($email)->send(new OrderCreated());

app/Mail/OrderCreated.php:

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class OrderCreated extends Mailable
{
    use Queueable, SerializesModels;

    public function __construct()
    {
        //
    }

    public function build()
    {
        return $this
            ->from('no-reply@example.com')
            ->markdown('emails.order-created');
    }
}

最后,resources/views/emails/order-created.blade.php:

@component('mail::message')
# Order Confirmation

This email is  test.
@endcomponent

我正在使用 Laravel 8.14.0 和 Valet 2.13.0,所以我在本地使用 https://my-app.test 域对其进行测试。该应用程序正在使用 InertiaJS,以防万一。控制器代码运行没有错误,但我在 mailgun 仪表板上看不到任何日志,并且电子邮件从未到达我的收件箱。我不知道出了什么问题或如何调试它。

更新:

我注意到如果我将 MAILGUN_DOMAINMAILGUN_SECRET 设置为 null,我会得到与上述相同的行为。如果我将 MAILGUN_DOMAIN 设置为像 abcd 这样的无意义值,我会收到以下错误:

GuzzleHttp\Exception\ClientException
Client error: `POST https://api.mailgun.net/v3/abcd/messages.mime` resulted in a `401 UNAUTHORIZED` response: Forbidden

如果我将MAILGUN_SECRET 设置为abcd,它会按照最初描述的方式工作(没有错误,但也没有电子邮件)。

【问题讨论】:

  • 您是否在 Mailgun 帐户中检查了域的正确端点?如果您的域是在其欧盟端点中创建的,并且您尝试将其与美国端点一起使用,它可能会像您描述的那样静默失败。
  • MAIL_FROM_ADDRESS=null - 这可能是你的问题,我知道你在课堂上设置它但是我过去曾遇到过这个问题。确保它也是您的 mailgun 的正确域。
  • @EnricoDias 我使用美国端点创建了它,api.mailgun.net/v3... 是我在仪表板中显示的内容。
  • @MichaelMano 我已经设置了 MAIL_FROM_ADDRESS,它似乎没有什么区别。确保它是正确的域作为我的 mailgun 域是什么意思?我的域设置为 mail.example.com,我尝试了 no-reply@exmaple.com 和 no-reply@mail.example.com。
  • @chipit24 mail.example.com 就是我的意思。但我想那不是问题,驱动程序设置为 smtp?你安装 guzzle 了吗?

标签: php laravel email mailgun laravel-8


【解决方案1】:

这些天我一直在使用 mailgun。它在 Laravel 7 上,并且运行良好。我认为这不会对 v8 造成问题。 实际上我已经从控制器发送了电子邮件,但是您可以根据需要为您实施相同的操作。 所以无论如何我都会分享我的经验。

.env

#MAIL_DRIVER=mailgun
MAIL_MAILER=mailgun
MAIL_HOST="smtp.mailgun.org"
MAIL_PORT=587
MAIL_USERNAME="postmaster@sandbox********************************.mailgun.org"
MAIL_PASSWORD="123456"
MAIL_ENCRYPTION=tls
MAILGUN_DOMAIN="sandbox********************************.mailgun.org"
MAILGUN_SECRET="key-********************************"
MAIL_FROM_NAME="ProjectName"
MAIL_FROM_ADDRESS="no-reply@yourfuturesite.com"
MAIL_ENV=test
MAIL_TEST="recipient@yourfuturesite.com"
#MAIL_LOG_CHANNEL
#MAILGUN_ENDPOINT="api.eu.mailgun.net"

config/mail.php

<?php

return [
    'default' => env('MAIL_MAILER'),
    'mailers' => [
        'smtp' => [
            'transport' => 'smtp',
            'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
            'port' => env('MAIL_PORT', 587),
            'encryption' => env('MAIL_ENCRYPTION', 'tls'),
            'username' => env('MAIL_USERNAME'),
            'password' => env('MAIL_PASSWORD'),
            'timeout' => null,
            'auth_mode' => null,
        ],
        'ses' => [
            'transport' => 'ses',
        ],
        'mailgun' => [
            'transport' => 'mailgun',
            'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
            'port' => env('MAIL_PORT', 587),
            'encryption' => env('MAIL_ENCRYPTION', 'tls'),
            'username' => env('MAIL_USERNAME'),
            'password' => env('MAIL_PASSWORD'),
            'timeout' => null,
            'auth_mode' => null,
        ],
        'postmark' => [
            'transport' => 'postmark',
        ],
        'sendmail' => [
            'transport' => 'sendmail',
            'path' => '/usr/sbin/sendmail -bs',
        ],
        'log' => [
            'transport' => 'log',
            'channel' => env('MAIL_LOG_CHANNEL'),
        ],
        'array' => [
            'transport' => 'array',
        ],
    ],
    'from' => [
        'address' => env('MAIL_FROM_ADDRESS'),
        'name' => env('MAIL_FROM_NAME'),
    ],
    'markdown' => [
        'theme' => 'default',
        'paths' => [
            resource_path('views/vendor/mail'),
        ],
    ],
    // CUSTOM CONFIGS
    'mail_env' => env('MAIL_ENV'), // 'local' for testing via mailgun, 'production' for all mails
    'mail_test' => env('MAIL_TEST'), // test email for 'local' testing
    // ADDITIONAL UNNECESSARY CONFIGS
    // 'sendmail' => '/usr/sbin/sendmail -bs',
    // 'sendmail' => '/usr/sbin/sendmail -t-i',
    // 'pretend' => false,
    // 'log_channel' => env('MAIL_LOG_CHANNEL'),
    // 'pretend' => false,
];

config/services.php(和你一样)

控制器

try {
    $name = array_key_exists('first_name', $email_data) ? $email_data['first_name'] : $email_data['name'];

    Mail::send('emails.confirm-registration', [
        'role' => $email_data['role'],
        'name' => $name,
        'email' => $email_data['email'],
        'confirm_registration' => route('front.auth.confirm_registration', ['registration_token' => $email_data['registration_token']]),
    ], function ($message) use ($email_data, $name) {
        $to = (config('mail.mail_env') == 'prod' || config('mail.mail_env') == 'production') ? $email_data['email'] : config('mail.mail_test');
        $message
            ->subject(config('app.name') . ": Email Confirmation")
            ->from(config('mail.from.address'), config('mail.from.name'))
            ->to($to, $name);
    });

    return true;
}
catch(\Exception $e) {
    // TODO: report all the "$e->message"s like this
    return false;
}

resources/views/emails/confirm-registration.php

<a href="{{ route('front.main') }}" target="_blank">
    <img label="logo" alt="{{ config('app.name') }}"
         src="{{ $message->embed(public_path('images/logo.svg')) }}" width="128" height="96">
</a>
<p>{{ $name }}</p>
<p>{{ $confirm_registration }}</p>
<p>© {{ date("Y") == 2020 ? '2020' : '2020-' . date("Y") }} {{ config('app.name') }}</p>

这只是我的示例,因此您可能需要根据需要进行替换。 请注意“config/mail.php”文件。我认为你需要设置一些额外的道具。 (也不要忘记在这些最后的配置更改后重新加载缓存:“php artisan config:cache”)

【讨论】:

  • 谢谢,我发现我为 MAILGUN_DOMAIN 使用了错误的值。我原始配置中的其他一切都很好。
猜你喜欢
  • 2021-03-09
  • 1970-01-01
  • 2018-03-27
  • 2017-10-12
  • 2016-11-20
  • 2014-04-14
  • 2021-05-12
  • 2016-04-24
  • 2019-10-18
相关资源
最近更新 更多