Laravel 9 动态邮箱配置

7 浏览
0 Comments

Laravel 9 动态邮箱配置

我遇到了一个问题,在谷歌上搜索了几个小时也找不到解决方法,所以我来向你请教。

我想要能够在运行时使用不同的SMTP电子邮件配置发送邮件,这些配置可以随时添加或更改。我正在建设一个为许多客户托管许多项目的网站,我们需要能够代表他们发送电子邮件。我知道可以在.env文件中设置不同的配置,但这个解决方案不够好,因为我希望将配置保存在数据库中,方便进行查询/更新等操作。

其中一个解决方案是使用这个教程中的方法。它使用Swift Mailer创建一个返回新邮件对象的方法,但在Laravel 9中似乎不起作用。显然,Swift Mailer已不再维护,被Symfony Mailer取代。不幸的是,我找不到一种可以按照我刚才描述的方式使用新的Symfony Mailer的方法,尽管如果能让它工作的话,我当然更愿意使用它。

我想知道是否可以使用同样的方法来使用Symfony Mailer?当我使用教程中的相同代码时,出现了以下错误:

找不到类"Swift_SmtpTransport"

我将该类添加到了命名空间,并且还将语法从new Swift_SmtpTransport更改为\Swift_SmtpTransport::newInstance,但这并没有解决错误。

如果有人有任何想法/建议,我将非常感激!我真的没有想到这么简单的事情会如此困难。

0
0 Comments

Laravel 9动态邮件配置问题的原因是,在生产环境(Forge)中,无论在发送电子邮件之前如何重写,系统始终使用环境变量中指定的FROM_USERNAME。即使升级到Laravel V9,因为邮件系统已经重新设计,也无法解决这个问题。

解决方法是将用户特定的SMTP凭据保存在用户表中,并生成一个Mailable类,将其作为调用sendEmail函数的第一个参数。在Mailable类中,envelope()函数是多余的,可以避免创建它,可以直接使用content()函数。

User.php文件中,引入相关类,并定义sendEmail函数的实现,具体代码如下:

use Symfony\Component\Mailer\Transport\Dsn;
use Symfony\Component\Mailer\Transport\Smtp\EsmtpTransportFactory;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Illuminate\Mail\Mailable;
public function sendEmail(Mailable $mailable, string $subject, string $to, string $cc = "")
{
    $email = (new Email())->html($mailable->render())->to($to)->subject($subject)->from(new Address($this->mail_from_address, $this->name));
    $mailer = new \Symfony\Component\Mailer\Mailer((new EsmtpTransportFactory)
                ->create(new Dsn('smtp', $this->mail_host, $this->mail_username, Crypt::decryptString($this->mail_password), $this->mail_port)));
    $mailer->send($email);
}

通过以下方式发送电子邮件:

// 使用用户的SMTP凭据发送邮件
$user->sendEmail(new OrderShipped($this->order), "Subject", "to.com");

其中,OrderShipped是一个Mailable类。

对于报错信息 'Argument #1 ($mailable) must be of type App\Http\Controllers\Mailable,',是否使用了'Mailable $mailable'的类?这个解决方法有效,是一个不错的解决方案。

0
0 Comments

问题原因:邮件配置文件中只能定义一个邮件账户,无法动态切换不同的账户发送邮件。

解决方法:可以在邮件配置文件中定义多个邮件账户,并在控制器或模型中根据需要选择使用哪个邮件账户发送邮件。具体步骤如下:

1. 打开config/mail.php文件,在'mailers'数组中定义不同的邮件账户,如下所示:

'mailers' => [
    'smtp' => [
        'transport' => 'smtp',
        'host' => 'smtp.google',
        'port' => 465,
        'encryption' => 'ssl',
        'username' => 'youraccount.com',
        'password' => 'password',
        'timeout' => null,
        'local_domain' => env('MAIL_EHLO_DOMAIN'),
    ],
    'OtherMailer' => [
        'transport' => 'smtp',
        'host' => 'smtp.gmail.com',
        'port' => '465',
        'encryption' => 'ssl',
        'username' => 'otheraccount.com',
        'password' => 'password',
        'timeout' => null,
        'local_domain' => env('MAIL_EHLO_DOMAIN'),
    ],
],

2. 在控制器或模型中使用Mail::mailer()方法来设置使用哪个邮件账户发送邮件,如下所示:

Mail::mailer('otherMailer')->to('person.com')->send(new SendLetter($sendMail));

通过以上步骤,就可以动态配置不同的邮件账户,并选择使用哪个账户发送邮件了。

0
0 Comments

Laravel 9动态电子邮件配置的问题和解决方法

Laravel 9.x使用的symfony/mailer可能会引起冲突。相反,您可以使用mailer()选项在运行时更改邮件驱动程序。

您可以在文档中找到详细信息。

更新:

我检查了symfony/mailer的文档,并且我猜这就是您想要的。您还可以使用动态SMTP详细信息即时构建自己的传输。

谢谢,我已阅读了文档,如果我理解正确,那么每次我想要编辑电子邮件配置时,我都必须编辑mail.php文件。我希望我是错的,但是对于我的用例来说,这个解决方案并不是很动态。

请查看更新的答案,也许这可以帮助您使邮件更具动态性。

不,抱歉这没有帮助我,谢谢!但是我找到了另一个解决方案,很快我会回答我自己的问题。

嗨!我遇到了同样的问题,我对你的解决方案很好奇。我希望您能抽出时间回答自己的问题。

你好,我回答了自己的问题。希望能帮到你 🙂

_pi,这个方法有效,有办法将Laravel的电子邮件类插入到这个mailer中吗?

_pi,有办法将Markup Mail类添加到这个mailer中吗?

0