Как проверить email с sendgrid для тестирования? - PullRequest
0 голосов
/ 24 апреля 2020

В моем приложении Laravel 7.6 я использую sendgrid для отправки электронной почты с кодом, например:

  \Mail
    ::to($newContactUs->author_email)->
   send(new SendgridMail('emails/contact_us_was_sent', $newContactUs->author_email, '', $subject, $additiveVars, $attachFiles));

с классом в приложении / Mail / SendgridMail. php:

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Sichikawa\LaravelSendgridDriver\SendGrid;
use App\Settings;
use App\Http\Traits\funcsTrait;

class SendgridMail extends Mailable
{
    use Queueable, SerializesModels;
    use SendGrid;
    use funcsTrait;

    private  $m_view_name;
    private  $m_to;
    private  $m_cc;
    private  $m_subject;
    private  $m_additiveVars;
    private  $m_attachFiles;

    public function __construct( $view_name, $to= [], $cc= '', $subject= '', $additiveVars= [], $attachFiles= [] )
    {
        $this->m_view_name= $view_name;
        $this->m_to= $to;
        $this->m_cc= $cc;
        $this->m_subject= $subject;
        $all_emails_copy      =   \Config::get('app.all_emails_copy');

        if ( empty($this->m_cc) and !empty($all_emails_copy)) {
            $this->m_cc= $all_emails_copy;
        }


        $additiveVars['site_home_url']         = \URL::to('/');
        $additiveVars['site_name']             = Settings::getValue('site_name');
        $additiveVars['noreply_email']         = Settings::getValue('noreply_email');
        $additiveVars['support_signature']     = Settings::getValue('support_signature');
        $additiveVars['medium_slogan_img_url'] = config('app.url').config('app.medium_slogan_img_url');

        $this->m_additiveVars= $additiveVars;
        $this->m_attachFiles= $attachFiles;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build( )
    {
        $mailObject= $this
            ->view( $this->m_view_name)
            ->subject($this->m_subject)
            ->to([$this->m_to])
            ->cc([$this->m_cc])
            ->with( $this->m_additiveVars )
            ->sendgrid( $this->m_additiveVars );
        foreach( $this->m_attachFiles as $next_attach_file) {
            if ( file_exists($next_attach_file) ) {
                $mailObject->attach($next_attach_file);
            }
        }
        return $mailObject;
    }

}

и шаблоны ресурсов / views / emails / contact_us_was_sent.blade. php:

...
<div class="wrapper">
    @inject('viewFuncs', 'App\library\viewFuncs')


    <h4 class="email_title">
        Hello, {!! $to_user_name !!} !
    </h4>
    ...

    @include( 'emails.app_footer')
    @include( 'emails.emails_style')
</div>

, и теперь это работает для меня, но теперь с «несколькими драйверами почты» я добавил mailtrap в свой .env :

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=NNNNNNNN
MAIL_PASSWORD=NNNNNNNN

и я хочу использовать mailtrap при тестировании приложения, используя тот же шаблон ресурсов / views / emails / contact_us_was_sent.blade. php и переходя с mailtrap на sendgrid как можно проще.

Я пробовал что-то вроде:

\Mail::mailer('smtp')
->to($newContactUs->author_email)
->send( \Mail('emails/contact_us_was_sent', $newContactUs->author_email, '', $subject, $additiveVars, $attachFiles) );

Но получил ошибку, так как \ Mail не поддерживает шаблоны. Есть ли что-то, чтобы использовать шаблоны поддержки для метода почты? Какая-нибудь оболочка?

Обновлено: Ранее я работал с sendgrid и для этого в файле config / mail. php Я записал все параметры sendgrid. Теперь я хочу написать 2 сервера emeil и fi = или это в .env. Я написал:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=mailtrip_id
MAIL_PASSWORD=mailtrip_password

SENDGRID_HOST=smtp.sendgrid.net
SENDGRID_PORT=587
SENDGRID_ENCRYPTION=tls
SENDGRID_USERNAME=sendgrid_user
SENDGRID_PASSWORD=sendgrid_user_password

и переделал config / mail. php (Я получил образец):

<?php
return [


    'driver' => env('MAIL_DRIVER', 'smtp'),


    'host' => env('MAIL_HOST', 'smtp.mailgun.org'),


    'port' => env('MAIL_PORT', 587),


    'from' => [
        'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
        'name' => env('MAIL_FROM_NAME', 'Example'),
    ],


    'encryption' => env('MAIL_ENCRYPTION', 'tls'),

    'username' => env('MAIL_USERNAME'),

    'password' => env('MAIL_PASSWORD'),

    'sendmail' => '/usr/sbin/sendmail -bs',

    'markdown' => [
        'theme' => 'default',

        'paths' => [
            resource_path('views/vendor/mail'),
        ],
    ],

    'log_channel' => env('MAIL_LOG_CHANNEL'),

    'mailers' => [
        'smtp' => [
            'transport' => 'smtp',
            'host' => env('MAIL_HOST'),
            'port' => env('MAIL_PORT'),
            'encryption' => env('MAIL_ENCRYPTION', 'tls'),
            'username' => env('MAIL_USERNAME'),
            'password' => env('MAIL_PASSWORD'),
            'timeout' => null,
            'auth_mode' => null,
        ],

        'sendgrid' => [
            'transport' => 'sendgrid',
            'host' => env('SENDGRID_HOST', 'smtp.sendgrid.net'),
            'port' => env('SENDGRID_PORT', 587),
            'encryption' => env('SENDGRID_ENCRYPTION', 'tls'),
            'username' => env('SENDGRID_USERNAME'),
            'password' => env('SENDGRID_PASSWORD'),
            'timeout' => null,
            'auth_mode' => null,
        ],

        'ses' => [
            'transport' => 'ses',
        ],

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

        'postmark' => [
            'transport' => 'postmark',
        ],

        'sendmail' => [
            'transport' => 'sendmail',
            'path' => '/usr/sbin/sendmail -bs',
        ],

        'log' => [
            'transport' => 'log',
            'channel' => env('MAIL_LOG_CHANNEL'),
        ],

        'array' => [
            'transport' => 'array',
        ],
    ],

];

Я не уверен, что этот файл конфигурации действителен? Параметры конфигурации почты считываются из массива почтовых программ? Похоже, что почтовый конфиг по умолчанию (mailtrip) используется всегда. Это неверный формат?

В моем контроле Ido:

        $email_mode= 'live';
//        $email_mode= 'debug';

        if( $email_mode== 'debug' ) {
            \Log::info( '-10 Send to mailtrap ::' );

            \Mail
                ::mailer('smtp')
                ->to('myemail@yahoo.com') // DEBUG
                ->send(new TestEmail);  // 
            \Log::info( '-10 Send to mailtrap AFTER::' );
        }

        // sendgrid
        if( $email_mode== 'live') {
            \Log::info( '-11 Send to sendgrid ::' );
            \Mail
                ::mailer('sendgrid')
                ->to('myemail@yahoo.com') // DEBUG
                ->send(new SendgridMail('emails/contact_us_was_sent', $newContactUs->author_email, '', $subject, $additiveVars, $attachFiles));
            \Log::info( '-11 Send to sendgrid AFTER::' );
        }

Я проверяю в журналах, что живой поток запущен, но в любом случае я получил письмо на mailtrap.

Спасибо!

1 Ответ

1 голос
/ 08 мая 2020

Короткий ответ: вы используете \ Mail (), которая является нативной php функцией, см. https://www.php.net/manual/en/function.mail.php и пытаетесь встроить ее в laravel Mailer.

Это не то, как вы должны его использовать, это действительно не рекомендуется.

Еще несколько подробностей: когда вы пишете почтовые сообщения, вы уже должны учитывать, что Mailable не должен определять драйвер, поэтому не рекомендуется называть это SendGridMailA .. увидеть его как отправку MailA с Mail :: mailer ($ mailDriver)

См .: https://laravel.com/docs/7.x/mail#writing -mailables

Длинный ответ, см. это видео, объясняет, как реализовать несколько почтовых драйверов: https://www.youtube.com/watch?v=HCONO0cwsoI

Однако похоже, что вы используете его в качестве метода отладки. Это не то, почему несколько почтовых драйверов были введены в laravel 7. Это больше похоже на то, что вы должны использовать другой драйвер, например, для массовых рассылок и для сброса пароля ...

Это имеет смысл ..

Для отладки более целесообразно сделать драйвер по умолчанию, например, зависеть от конфигурации APP_DEBUG или ввести собственный ENV var, чтобы переключить ваше производственное приложение в режим отладки ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...