【问题标题】:How to get Mandrill message ID using Mail::send() - Laravel 4如何使用 Mail::send() 获取 Mandrill 消息 ID - Laravel 4
【发布时间】:2018-02-28 08:41:15
【问题描述】:

有没有办法使用 Laravel 4 中的邮件功能(或任何其他功能)从 Mandrill 获得响应?

使用消息下方的代码可以正常发送,但只返回 null:

$response = Mail::send('emails.test', [], function($message) 
{
    $message->to('test@email.com')->subject('test email');
});

dd($response);

我尝试同时使用 smtp 驱动程序和 Mandrill 驱动程序,但没有任何区别

【问题讨论】:

    标签: php laravel email laravel-4 mandrill


    【解决方案1】:

    在记录从 Mandrill 发送事件中获取 _id 时也遇到了一些问题。
    为 Laravel 5.7 创建了一个解决方法;

    创建一个 CustomMailServiceProvider

    <?php
    // app/Providers/CustomMailServiceProvider.php
    
    namespace App\Providers;
    
    use App\Misc\Transport\CustomMandrillTransport;
    use Swift_Mailer;
    use Illuminate\Support\Arr;
    use GuzzleHttp\Client as HttpClient;
    
    class CustomMailServiceProvider extends \Illuminate\Mail\MailServiceProvider {
    
        public function register(){
            parent::register();
    
            $this->registerMandrillMailer();
        }
        /**
         * Register the CustomMandrill Swift Transport instance.
         *
         * @param  array  $config
         * @return void
         */
        protected function registerMandrillMailer()
        {
            if ($this->app['config']['mail.driver'] == 'mandrill') {
                $this->app->singleton('swift.mailer', function ($app) {
                    $mandrillConfig = $app['config']->get('services.mandrill', []);
                    return new Swift_Mailer(new CustomMandrillTransport( $this->guzzle($mandrillConfig), $mandrillConfig['secret']));
                });
            }
        }
    
        /**
         * Get a fresh Guzzle HTTP client instance.
         *
         * @param  array  $config
         * @return \GuzzleHttp\Client
         */
        protected function guzzle($config)
        {
            return new HttpClient(Arr::add(
                $config['guzzle'] ?? [], 'connect_timeout', 60
            ));
        }
    }
    

    创建一个 CustomMandrillTransport

    <?php
    // app/Misc/Transport/CustomMandrillTransport.php
    
    namespace App\Misc\Transport;
    
    use Swift_Mime_SimpleMessage;
    
    class CustomMandrillTransport extends \Illuminate\Mail\Transport\MandrillTransport {
    
        public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = null)
        {
            $this->beforeSendPerformed($message);
    
            $response = $this->client->request('POST', 'https://mandrillapp.com/api/1.0/messages/send-raw.json', [
                'form_params' => [
                    'key' => $this->key,
                    'to' => $this->getTo($message),
                    'raw_message' => $message->toString(),
                    'async' => true,
                ],
            ]);
    
            // Lets replace body by actually something useful -_-
            $message->setBody((string)$response->getBody());
    
            $this->sendPerformed($message);
    
            return $this->numberOfRecipients($message);
        }
    }
    

    创建一个电子邮件监听器

    <?php
    // app/Listeners/EmailSentListener.php
    namespace App\Listeners;
    
    use Illuminate\Mail\Events\MessageSent;
    use Mail;
    
    class EmailSentListener
    {
        /**
         * Create the event listener.
         *
         * @return void
         */
        public function __construct()
        {
        }
    
        /**
         * Handle the event.
         *
         * @param  \App\Events\OrderShipped  $event
         * @return void
         */
        public function handle(MessageSent $event)
        {
            $mandrillBody = $event->message->getBody(); // [{"email":"xxxxx@gmail.com","status":"queued","_id":"19219cfd3e0e4133aed48214ebb4ed71"}]
        }
    }
    

    在 config/app.php 注释原文

    //        Illuminate\Mail\MailServiceProvider::class,
    

    并添加您自己的:

    App\Providers\CustomMailServiceProvider::class,
    

    并确保收听发送的事件

    <?php
    
    namespace App\Providers;
    
    use Illuminate\Contracts\Events\Dispatcher as DispatcherContract;
    use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
    
    class EventServiceProvider extends ServiceProvider
    {
        /**
         * The event listener mappings for the application.
         *
         * @var array
         */
        protected $listen = [
            'App\Events\SomeEvent' => [
                'App\Listeners\EventListener',
            ],
            'Illuminate\Mail\Events\MessageSent' => [
                'App\Listeners\EmailSentListener',
            ]
        ];
    }
    

    希望对更多人有帮助

    【讨论】:

    • 嘿,我们使用了这个.....但由于某种原因,在我们的本地环境中,它没有接收客户邮件服务提供商,而 getBody 只是返回所发送电子邮件的 html。任何想法为什么会这样?
    【解决方案2】:

    看来你不能。 MandrillTransport::send 不返回任何内容,也不公开 HttpClient。

    【讨论】:

    • 那么知道您应该如何从 Mandrill 获取消息 ID 吗?
    • 1.使用 MandrillTransport 并从中创建您自己的自定义传输,以便它执行您想要的操作。 2. 使用 Guzzle 并自己动手。
    猜你喜欢
    • 2019-10-10
    • 2013-04-02
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 2011-04-16
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多