何がやりたいのか
- ユーザーが設定したメールアドレスから自動送信を行うシステムを作っている。
- .envで設定したメール設定ではなくて、データベースに登録された各ユーザーのメールサーバー情報を使い動的に設定を変えて送信する。
Laravel9ではSwiftMailerが使えなくなったため、こちらの方法で実装できなりました。
そのため別のやり方を解説します。
代替案Symfony Mailerを使う。
DynamicMailService.php
<?php
namespace App\Mail;
use Symfony\Component\Mailer\Transport;
use Symfony\Component\Mailer\Mailer;
use Symfony\Component\Mime\Email;
use Illuminate\Support\Facades\Log;
use Exception;
class DynamicMail
{
public function send()
{
$username = 'hoge';
$password = 'password';
$port = 587;
$host = 'sample.ne.jp';
$host = trim($host);
$transport = Transport::fromDsn("smtp://{$username}:{$password}@{$host}:{$port}");
$mailer = new Mailer($transport);
try {
$email = (new Email())
->from($from)
->to($to)
->subject($subject)
->text('Sending emails is fun again!')
->html('<p>テスト送信</p>');
$mailer->send($email);
}
//送信失敗時
catch (Exception $e) {
Log::error($e);
}
}
}
bladeのテンプレートを使う場合
Bladeテンプレートをレンダリングする。
例:resources/views/emails/test.blade.php
を使う場合
sample.php
<?php
public function send()
{
// Bladeテンプレートをレンダリング
$htmlContent = View::make('emails.test', ['variable' => '山田太郎'])->render();
$username = 'hoge';
$password = 'password';
$port = 587;
$host = 'sample.ne.jp';
$host = trim($host);
$transport = Transport::fromDsn("smtp://{$username}:{$password}@{$host}:{$port}");
$mailer = new Mailer($transport);
try {
$email = (new Email())
->from($from)
->to($to)
->subject($subject)
->html($htmlContent);
$mailer->send($email);
}
//送信失敗時
catch (Exception $e) {
Log::error($e);
}
}
test.blade.php
<p>こんにちは: {{ $variable }}</p>