Files
ladill-events/app/Services/Events/EventMailer.php
T
isaaccladandCursor 1746874aaa
Deploy Ladill Events / deploy (push) Successful in 49s
Use noreply@ladill.com for Events mail like other Ladill apps.
Stop overriding the From display name with the event title; rely on MAIL_FROM_ADDRESS and MAIL_FROM_NAME only.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 17:20:45 +00:00

98 lines
2.7 KiB
PHP

<?php
namespace App\Services\Events;
use App\Services\Billing\BillingClient;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
/**
* Sends Ladill Events transactional email via the platform mailer
* (noreply@ladill.com — same as CRM and other Ladill apps).
*/
class EventMailer
{
public const EMAIL_PRICE_MINOR = 1;
private ?string $lastError = null;
public function __construct(private readonly BillingClient $billing) {}
public function lastError(): ?string
{
return $this->lastError;
}
public function isConfigured(): bool
{
return filter_var((string) config('mail.from.address'), FILTER_VALIDATE_EMAIL) !== false;
}
public function send(
string $ownerPublicId,
string $to,
string $subject,
string $html,
?string $text = null,
?string $replyToEmail = null,
?string $replyToName = null,
): bool {
$this->lastError = null;
if (! $this->isConfigured()) {
$this->lastError = 'Outbound email is not configured on this Events instance.';
return false;
}
if (! $this->billing->canAfford($ownerPublicId, self::EMAIL_PRICE_MINOR)) {
$this->lastError = 'Insufficient Ladill wallet balance. Add funds in Billing and try again.';
return false;
}
$reference = 'events_email:'.Str::uuid();
try {
Mail::html($html, function ($message) use ($to, $subject, $text, $replyToEmail, $replyToName): void {
$message->to($to)
->subject($subject)
->from(
(string) config('mail.from.address'),
(string) config('mail.from.name'),
);
if ($replyToEmail) {
$message->replyTo($replyToEmail, $replyToName ?: null);
}
if ($text) {
$message->text($text);
}
});
} catch (\Throwable $e) {
Log::warning('Events mail send failed', ['error' => $e->getMessage(), 'to' => $to]);
$this->lastError = 'The email could not be sent. Please try again.';
return false;
}
if (! $this->billing->debit(
$ownerPublicId,
self::EMAIL_PRICE_MINOR,
'smtp',
'events_email',
$reference,
null,
'Events email to '.$to,
)) {
$this->lastError = 'Insufficient Ladill wallet balance. Add funds in Billing and try again.';
return false;
}
return true;
}
}