115 lines
3.8 KiB
PHP
115 lines
3.8 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use Mailjet\Client;
|
|
use Mailjet\Resources;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Illuminate\Support\Facades\Storage;
|
|
|
|
class MailjetService
|
|
{
|
|
protected Client $client;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->client = new Client(
|
|
getenv('MAILJET_APIKEY_PUBLIC'),
|
|
getenv('MAILJET_SECRETKEY'),
|
|
true,
|
|
['version' => 'v3.1']
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Send an email via Mailjet API
|
|
*
|
|
* @param string $toEmail Recipient email address
|
|
* @param string $toName Recipient name
|
|
* @param string $subject Email subject
|
|
* @param string $htmlContent HTML email content
|
|
* @param string|null $textContent Plain text email content
|
|
* @param array|null $attachments Array of file paths to attach
|
|
* @param array|null $attachmentNames Optional custom filenames for attachments (by file path)
|
|
* @return bool Success status
|
|
*/
|
|
public function send(
|
|
string $toEmail,
|
|
string $toName,
|
|
string $subject,
|
|
string $htmlContent,
|
|
?string $textContent = null,
|
|
?array $attachments = null,
|
|
?array $attachmentNames = null
|
|
): bool {
|
|
try {
|
|
$body = [
|
|
'Messages' => [
|
|
[
|
|
'From' => [
|
|
'Email' => config('mail.from.address'),
|
|
'Name' => config('mail.from.name'),
|
|
],
|
|
'To' => [
|
|
[
|
|
'Email' => $toEmail,
|
|
'Name' => $toName,
|
|
]
|
|
],
|
|
'Subject' => $subject,
|
|
'HTMLPart' => $htmlContent,
|
|
]
|
|
]
|
|
];
|
|
|
|
// Add text part if provided
|
|
if ($textContent) {
|
|
$body['Messages'][0]['TextPart'] = $textContent;
|
|
}
|
|
|
|
// Add attachments if provided
|
|
if ($attachments && is_array($attachments)) {
|
|
$body['Messages'][0]['Attachments'] = [];
|
|
foreach ($attachments as $filePath) {
|
|
if (file_exists($filePath)) {
|
|
$fileContent = file_get_contents($filePath);
|
|
// Use custom filename if provided, otherwise use basename
|
|
$filename = $attachmentNames[$filePath] ?? basename($filePath);
|
|
$body['Messages'][0]['Attachments'][] = [
|
|
'ContentType' => mime_content_type($filePath) ?: 'application/octet-stream',
|
|
'Filename' => $filename,
|
|
'Base64Content' => base64_encode($fileContent),
|
|
];
|
|
}
|
|
}
|
|
}
|
|
|
|
$response = $this->client->post(Resources::$Email, ['body' => $body]);
|
|
|
|
if ($response->success()) {
|
|
Log::info('Mailjet email sent successfully', [
|
|
'to' => $toEmail,
|
|
'subject' => $subject,
|
|
'response' => $response->getData(),
|
|
]);
|
|
return true;
|
|
} else {
|
|
Log::error('Mailjet email failed', [
|
|
'to' => $toEmail,
|
|
'subject' => $subject,
|
|
'error' => $response->getStatus(),
|
|
'data' => $response->getData(),
|
|
]);
|
|
return false;
|
|
}
|
|
} catch (\Exception $e) {
|
|
Log::error('Mailjet email exception', [
|
|
'to' => $toEmail,
|
|
'subject' => $subject,
|
|
'exception' => $e->getMessage(),
|
|
]);
|
|
return false;
|
|
}
|
|
}
|
|
}
|