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
版本:
- Laravel 5.4.36
- Swiftmailer 5.4.9
- Exim 4.89-2+deb9u2
配置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');
}
}
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
版本:
- Laravel 5.4.36
- Swiftmailer 5.4.9
- Exim 4.89-2+deb9u2
配置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');
}
}