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

Php Laravel Mail/Swift/如何全局配置“;“发件人”;住址,php,email,laravel-5,sendmail,swiftmailer,Php,Email,Laravel 5,Sendmail,Swiftmailer,Laravel提供了配置mail.from以允许指定全局/默认from地址。这将在Swift邮件内部调用setFrom,并设置收件人电子邮件客户端中显示的“Header From”。 但是,由于没有设置其他选项(发送方/返回路径),因此消息也会随此值的返回路径/信封发件人一起发送,因为它从该值派生 该站点运行在一个多项目主机上,Exim4在本地运行,因此设置这些地址没有任何限制,就像我使用Gmail SMTP一样。 Laravel配置为使用sendmail 让我们假设机器主机名为webX.hos

Laravel提供了配置
mail.from
以允许指定全局/默认
from
地址。这将在Swift邮件内部调用
setFrom
,并设置收件人电子邮件客户端中显示的“Header From”。 但是,由于没有设置其他选项(发送方/返回路径),因此消息也会随此值的返回路径/信封发件人一起发送,因为它从该值派生

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

让我们假设机器主机名为
webX.hosts.our company intern.com
,在其上运行的项目属于
customer brand.com
的子域。电子邮件应该从“主域”(不包括子域部分)发送,就像
noreply@customer-brand.com
customer brand.com。
无法解析子域项目所在的计算机

我想用实际主机名的信封地址发送邮件(更好:保留Exim/Sendmail使用的默认信封/返回路径),如
appname@webX.hosts.our-company intern.com
,并且只有来自以下网站的
:noreply@customer-brand.com

原因是,我希望有一个有效的返回路径,指示它实际上来自哪个主机。 SPF也是一个原因,但不是主要原因;我们控制
customer brand.com
域,只需添加我们的主机地址,如果可能的话,我仍然希望避免添加,并使用我们的域,该域中已经有所有主机的SPF记录

当我将以下行放入

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

我还尝试在sendmail命令中添加
-f
/usr/sbin/sendmail-bs-f”appname@webX.hosts.our-公司实习生网站“
-但是,这在
\u establishProcessConnection()
上已经失败。在CLI中调用,错误为:

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


版本:

  • 拉威尔5.4.36
  • Swiftmailer 5.4.9
  • Exim 4.89-2+deb9u2
Config
mail.php

'from' => [
    'address' => 'noreply@customer-brand.com',
    'name' => 'Customer Brand',
],
Tinker外壳测试代码:

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

收到:来自webX.hosts.our-company-intern.com(xxx.xxx.xxx.xxx)的。。。
收到:来自appname(helo=[127.0.0.1])
通过webX.hosts.our-company-intern.com和本地smtp(Exim 4.89)
(信封从)//这应该更改
...
发件人:客户品牌
返回路径:noreply@customer-brand.com//这应该会改变
如作者所述


在我的头顶上:你可以钩住
照亮\Mail\Events\MessageSending
事件并将发送者添加到那里

考虑到公司的环境,我假设你知道如何(如果不知道,请告诉我)。在这种情况下,以下是您需要的侦听器:

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

我认为这个答案不适用于这个问题。您从
调用
,这导致了相同的问题,我没有看到设置“信封发送者”的代码。链接教程只是一个初学者如何发送电子邮件的解释。当我扫描邮件类代码时,似乎错过了那个事件。正是我想要的,谢谢!
<?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',
                      ]);
    }
}
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');
    }
}