Laravel邮箱/Swift/如何全局配置"sender"地址

Laravel Mail / Swift / How to globally configure "sender" address

Laravel 提供配置 mail.from 以允许指定 global/default From 地址。这会在内部调用 Swift-Message 上的 setFrom 并设置收件人电子邮件客户端中显示的“Header From”。 但是,由于 From,因此也会使用此值的 Return-Path/Envelope-From 发送消息值,因为没有设置其他选项 (Sender/Return-Path)。

站点 运行 在 multi-project 主机上,本地有 Exim4 运行,所以设置这些地址没有限制,就像我使用 Gmail SMTP 一样。 Laravel 配置为使用 sendmail.

假设机器主机名是 webX.hosts.our-company-intern.com 并且在其上运行的项目属于 customer-brand.com 的子域。 E-Mails 应该从 "main-domain" 发送(没有子域部分),但是,就像 noreply@customer-brand.com 一样。 customer-brand.com. 没有解析到托管子域项目的机器。

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

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

当我在 Laravel vendor class-method Mailer::send 中输入以下行时:

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

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

我也试过在 sendmail 命令中加入 -f/usr/sbin/sendmail -bs -f"appname@webX.hosts.our-company-intern.com" - 然而这已经在 _establishProcessConnection() 处失败了。在 CLI 中调用错误是:

exim: incompatible command-line options or arguments


版本:

配置mail.php:

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

Tinker-Shell 测试代码:

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

当前邮件headers:

Received: from webX.hosts.our-company-intern.com (xxx.xxx.xxx.xxx) by ...
Received: from appname (helo=[127.0.0.1])
    by webX.hosts.our-company-intern.com with local-smtp (Exim 4.89)
    (envelope-from <noreply@customer-brand.com>)  // this should change
    ...
From: Customer Brand <noreply@customer-brand.com>
Return-Path: noreply@customer-brand.com  // this should change

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',
                      ]);
    }
}

希望对您有所帮助

在我的脑海中:您可以挂钩 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');
    }
}