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');
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵