douqiaotong8682 2018-10-20 11:33
浏览 231
已采纳

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

Laravel offers the config mail.from to allow specifying a global/default From address. This calls setFrom on the Swift-Message internally and sets the "Header From" that shows in the recipients email client. However, the message is then also sent with Return-Path/Envelope-From of this value, because of getReversePath, that derives this From value as no other option (Sender/Return-Path) has been set.

The site is running on a multi-project host with Exim4 running locally, so there are no restrictions to set these addresses like if I was using something like Gmail SMTP. Laravel is configured to use sendmail.

Let's assume the machines hostname is webX.hosts.our-company-intern.com and the project that runs on it belongs to a subdomain of customer-brand.com. E-Mails should be sent from the "main-domain" (without the subdomain part), though, like noreply@customer-brand.com. customer-brand.com. does not resolve to the machine the subdomain project is hosted.

I would like to send the mail with an Envelope address of my actual hostname (better: preserve the default Envelope-From/Return-Path Exim/Sendmail would use), like appname@webX.hosts.our-company-intern.com and only have From: noreply@customer-brand.com.

Reason for that is, I'd like to have a valid Return-Path indicating from which host it actually came from. SPF is also a reason, but not the main one; we control the customer-brand.com domain and could just add our hosts address, I'd still like to avoid it if possible and use our domain that already have all our hosts in their SPF record.

When I put the following line in the Laravel vendor class-method Mailer::send:

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

This yields my desired result, but of course I cannot just edit it in vendor code. Where can I configure this properly (maybe via a callback that executes for every message)? Or isn't there any such option and I should write an issue in the Laravel/Mail package?

I also tried putting -f in the sendmail command: /usr/sbin/sendmail -bs -f"appname@webX.hosts.our-company-intern.com" - however this already fails at the _establishProcessConnection(). Called in CLI the error is:

exim: incompatible command-line options or arguments


Versions:

  • Laravel 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-Shell test code:

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

Current mail 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
  • 写回答

2条回答 默认 最新

  • dousongxuan7507 2018-10-26 20:25
    关注

    On the top of my head: you could hook in the Illuminate\Mail\Events\MessageSending event and add the sender there.

    Given the corporate environment I'll assume you know how to listen to events (if not, let me know). In that case, here's the listener you'll need:

    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');
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • dongni3854 2018-10-20 11:52
    关注

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

    I hope this will help you

    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥60 PCDN如何使用宽带的电视业务通道拨号叠加带宽?
  • ¥15 遇到这种校园宽带网络应该怎么样解决?
  • ¥30 AXI VIP验证多余打印问题
  • ¥15 利用加权最小二乘法求某品牌手机价格指标,已按照总销量计算出权重,各类型号手机价格已知,如何求得价格指标?
  • ¥15 如何自制一个硬件钱包,有兴趣的朋友一起交流
  • ¥15 (关键词-聊天软件)
  • ¥15 求大家看看这个编程的编法没有思路啊
  • ¥20 WSL打开图形化程序子窗口无法点击
  • ¥15 Jupyter Notebook 数学公式不渲染
  • ¥20 ERR_CACHE_MISS 确认重新提交表单