Laravel Mail / Swift / Как глобально настроить адрес отправителя - PullRequest
0 голосов
/ 20 октября 2018

Laravel предлагает конфигурацию mail.from, позволяющую указать глобальный адрес / адрес по умолчанию From.Это вызывает setFrom внутри Swift-Message и устанавливает « Header From », который отображается в почтовом клиенте получателя.Однако затем сообщение также отправляется с Return-Path / Envelope-From этого значения из-за getReversePath, которое выводит это значение From какникакая другая опция ( Отправитель / обратный путь ) не была установлена.

Сайт работает на многопроектном хосте с Exim4, работающим локально, поэтому нет никаких ограничений для установки этих адресовкак если бы я использовал что-то вроде Gmail SMTP.Laravel настроен на использование sendmail.

Предположим, что имя хоста машины - webX.hosts.our-company-intern.com, а выполняемый на нем проект принадлежит поддомену customer-brand.com.Электронные письма должны отправляться с «основного домена» (без части поддоменов), например, 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 Mailer::send:

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

Это дает желаемый результат, но, конечно, я не могу просто отредактировать его в коде поставщика. Где я могу настроить это правильно (возможно, с помощью обратного вызова, который выполняется для каждого сообщения)?Или такой опции нет, и я должен написать проблему в пакете Laravel / Mail?

Я также попытался вставить -f в команду sendmail: /usr/sbin/sendmail -bs -f"appname@webX.hosts.our-company-intern.com" - однако это уже не удаетсяна _establishProcessConnection().В CLI вызывается ошибка:

exim: несовместимые параметры или аргументы командной строки


Версии:

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

Текущие заголовки почты:

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 ]

0 голосов
/ 26 октября 2018

На моей голове: вы можете подключить событие Illuminate\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');
    }
}
0 голосов
/ 20 октября 2018

Как написано Саджал Сони

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

Надеюсь, это поможет вам

...