Laravel Mail / Swift /如何全局配置“发件人”地址

时间:2018-10-20 11:33:17

标签: php email laravel-5 sendmail swiftmailer

Laravel提供配置mail.from,以允许指定全局/默认From地址。这会在内部调用Swift-Message上的setFrom,并设置显示在收件人电子邮件客户端中的“ Header From ”。 但是,由于getReversePath,此消息还随此值的 Return-Path / Envelope-From 发送,这使得该 From 值与其他值无关选项(发件人/返回路径)已设置。

该站点在本地运行Exim4的多项目主机上运行,​​因此设置这些地址没有限制,就像我使用的是Gmail SMTP一样。 Laravel配置为使用sendmail

让我们假设计算机的主机名是webX.hosts.our-company-intern.com,并且在其上运行的项目属于customer-brand.com的子域。但是,电子邮件应从“主域”发送(不包括子域部分),例如noreply@customer-brand.comcustomer-brand.com.不能解析托管子域项目的计算机。

我想使用实际主机名的信封地址发送邮件(更好:保留默认的 Envelope-From / Return-Path Exim / Sendmail会使用),例如{{1} },并且只有appname@webX.hosts.our-company-intern.com

原因是,我想要一个有效的 Return-Path 来指示它实际来自哪个主机。 SPF也是原因,但不是主要原因。我们控制着From: noreply@customer-brand.com域,可以只添加我们的主机地址,如果可能的话,我仍然想避免使用它,而使用已经在其SPF记录中包含所有主机的域。

当我将以下行放入Laravel vendor class-method Mailer::send时:

customer-brand.com

这会产生我想要的结果,但是我当然不能只在供应商代码中对其进行编辑。 该在哪里正确配置(也许通过对每条消息执行的回调)?还是没有这样的选择,我应该在Laravel / Mail包中写一个问题?

我还尝试将$message->sender('appname@webX.hosts.our-company-intern.com'); 放在sendmail命令中: -f -但是,这在/usr/sbin/sendmail -bs -f"appname@webX.hosts.our-company-intern.com"处已经失败。在CLI中调用该错误是:

  

exim:不兼容的命令行选项或参数


版本:

  • Laravel 5.4.36
  • Swiftmailer 5.4.9
  • Exim 4.89-2 + deb9u2

配置_establishProcessConnection()

mail.php

Tinker-Shell测试代码:

'from' => [
    'address' => 'noreply@customer-brand.com',
    'name' => 'Customer Brand',
],

当前邮件标题:

Mail::raw('Text to e-mail', function($message) {
  $message->to('my-personal-email-for-testing@domain.com');
})

2 个答案:

答案 0 :(得分:3)

在我的头上:您可以挂入Illuminate\Mail\Events\MessageSending事件,然后在其中添加发件人。

鉴于公司环境,我假设您知道如何listen to events(如果没有,请告诉我)。在这种情况下,这是您需要的监听器:

class MessageSendingListener
{
    /**
     * Handle the event.
     *
     * @param  \Illuminate\Mail\Events\MessageSending  $event
     * @return void
     */
    public function handle(MessageSending $event)
    {
        // $event->message is of type \Swift_Message
        // So you'll need the setSender() method here.

        $event->message->setSender('appname@webX.hosts.our-company-intern.com');
    }
}

答案 1 :(得分:0)

Sajal Soni撰写

<?php

namespace App\Mail;

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

class DemoEmail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * The demo object instance.
     *
     * @var Demo
     */
    public $demo;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($demo)
    {
        $this->demo = $demo;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->from('sender@example.com')
                    ->view('mails.demo')
                    ->text('mails.demo_plain')
                    ->with(
                      [
                            'testVarOne' => '1',
                            'testVarTwo' => '2',
                      ])
                      ->attach(public_path('/images').'/demo.jpg', [
                              'as' => 'demo.jpg',
                              'mime' => 'image/jpeg',
                      ]);
    }
}

我希望这会对您有所帮助