[Mailer] Mailjet Add ability to pass custom headers to API
This commit is contained in:
parent
27bb2828e3
commit
7b14ef3678
@ -0,0 +1,82 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Symfony\Component\Mailer\Bridge\Mailjet\Tests\Transport;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use Symfony\Component\Mailer\Bridge\Mailjet\Transport\MailjetApiTransport;
|
||||||
|
use Symfony\Component\Mailer\Envelope;
|
||||||
|
use Symfony\Component\Mime\Address;
|
||||||
|
use Symfony\Component\Mime\Email;
|
||||||
|
|
||||||
|
class MailjetApiTransportTest extends TestCase
|
||||||
|
{
|
||||||
|
protected const USER = 'u$er';
|
||||||
|
protected const PASSWORD = 'pa$s';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider getTransportData
|
||||||
|
*/
|
||||||
|
public function testToString(MailjetApiTransport $transport, string $expected)
|
||||||
|
{
|
||||||
|
$this->assertSame($expected, (string) $transport);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTransportData()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
[
|
||||||
|
new MailjetApiTransport(self::USER, self::PASSWORD),
|
||||||
|
'mailjet+api://api.mailjet.com',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
(new MailjetApiTransport(self::USER, self::PASSWORD))->setHost('example.com'),
|
||||||
|
'mailjet+api://example.com',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testPayloadFormat()
|
||||||
|
{
|
||||||
|
$email = (new Email())
|
||||||
|
->subject('Sending email to mailjet API');
|
||||||
|
$email->getHeaders()
|
||||||
|
->addTextHeader('X-authorized-header', 'authorized')
|
||||||
|
->addTextHeader('X-MJ-TemplateLanguage', 'forbidden'); // This header is forbidden
|
||||||
|
$envelope = new Envelope(new Address('foo@example.com', 'Foo'), [new Address('bar@example.com', 'Bar'), new Address('baz@example.com', 'Baz')]);
|
||||||
|
|
||||||
|
$transport = new MailjetApiTransport(self::USER, self::PASSWORD);
|
||||||
|
$method = new \ReflectionMethod(MailjetApiTransport::class, 'getPayload');
|
||||||
|
$method->setAccessible(true);
|
||||||
|
$payload = $method->invoke($transport, $email, $envelope);
|
||||||
|
|
||||||
|
$this->assertArrayHasKey('Messages', $payload);
|
||||||
|
$this->assertNotEmpty($payload['Messages']);
|
||||||
|
|
||||||
|
$message = $payload['Messages'][0];
|
||||||
|
$this->assertArrayHasKey('Subject', $message);
|
||||||
|
$this->assertEquals('Sending email to mailjet API', $message['Subject']);
|
||||||
|
|
||||||
|
$this->assertArrayHasKey('Headers', $message);
|
||||||
|
$headers = $message['Headers'];
|
||||||
|
$this->assertArrayHasKey('X-authorized-header', $headers);
|
||||||
|
$this->assertEquals('authorized', $headers['X-authorized-header']);
|
||||||
|
$this->assertArrayNotHasKey('x-mj-templatelanguage', $headers);
|
||||||
|
$this->assertArrayNotHasKey('X-MJ-TemplateLanguage', $headers);
|
||||||
|
|
||||||
|
$this->assertArrayHasKey('From', $message);
|
||||||
|
$sender = $message['From'];
|
||||||
|
$this->assertArrayHasKey('Email', $sender);
|
||||||
|
$this->assertArrayHasKey('Name', $sender);
|
||||||
|
$this->assertEquals('foo@example.com', $sender['Email']);
|
||||||
|
$this->assertEquals('Foo', $sender['Name']);
|
||||||
|
|
||||||
|
$this->assertArrayHasKey('To', $message);
|
||||||
|
$recipients = $message['To'];
|
||||||
|
$this->assertIsArray($recipients);
|
||||||
|
$this->assertCount(2, $recipients);
|
||||||
|
$this->assertEquals('bar@example.com', $recipients[0]['Email']);
|
||||||
|
$this->assertEquals('', $recipients[0]['Name']); // For Recipients, even if the name is filled, it is empty
|
||||||
|
$this->assertEquals('baz@example.com', $recipients[1]['Email']);
|
||||||
|
$this->assertEquals('', $recipients[1]['Name']);
|
||||||
|
}
|
||||||
|
}
|
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Mailer\Bridge\Mailjet\Tests\Transport;
|
namespace Symfony\Component\Mailer\Bridge\Mailjet\Tests\Transport;
|
||||||
|
|
||||||
|
use Symfony\Component\Mailer\Bridge\Mailjet\Transport\MailjetApiTransport;
|
||||||
use Symfony\Component\Mailer\Bridge\Mailjet\Transport\MailjetSmtpTransport;
|
use Symfony\Component\Mailer\Bridge\Mailjet\Transport\MailjetSmtpTransport;
|
||||||
use Symfony\Component\Mailer\Bridge\Mailjet\Transport\MailjetTransportFactory;
|
use Symfony\Component\Mailer\Bridge\Mailjet\Transport\MailjetTransportFactory;
|
||||||
use Symfony\Component\Mailer\Test\TransportFactoryTestCase;
|
use Symfony\Component\Mailer\Test\TransportFactoryTestCase;
|
||||||
@ -26,6 +27,11 @@ class MailjetTransportFactoryTest extends TransportFactoryTestCase
|
|||||||
|
|
||||||
public function supportsProvider(): iterable
|
public function supportsProvider(): iterable
|
||||||
{
|
{
|
||||||
|
yield [
|
||||||
|
new Dsn('mailjet+api', 'default'),
|
||||||
|
true,
|
||||||
|
];
|
||||||
|
|
||||||
yield [
|
yield [
|
||||||
new Dsn('mailjet', 'default'),
|
new Dsn('mailjet', 'default'),
|
||||||
true,
|
true,
|
||||||
@ -52,6 +58,16 @@ class MailjetTransportFactoryTest extends TransportFactoryTestCase
|
|||||||
$dispatcher = $this->getDispatcher();
|
$dispatcher = $this->getDispatcher();
|
||||||
$logger = $this->getLogger();
|
$logger = $this->getLogger();
|
||||||
|
|
||||||
|
yield [
|
||||||
|
new Dsn('mailjet+api', 'default', self::USER, self::PASSWORD),
|
||||||
|
new MailjetApiTransport(self::USER, self::PASSWORD, $this->getClient(), $dispatcher, $logger),
|
||||||
|
];
|
||||||
|
|
||||||
|
yield [
|
||||||
|
new Dsn('mailjet+api', 'example.com', self::USER, self::PASSWORD),
|
||||||
|
(new MailjetApiTransport(self::USER, self::PASSWORD, $this->getClient(), $dispatcher, $logger))->setHost('example.com'),
|
||||||
|
];
|
||||||
|
|
||||||
yield [
|
yield [
|
||||||
new Dsn('mailjet', 'default', self::USER, self::PASSWORD),
|
new Dsn('mailjet', 'default', self::USER, self::PASSWORD),
|
||||||
new MailjetSmtpTransport(self::USER, self::PASSWORD, $dispatcher, $logger),
|
new MailjetSmtpTransport(self::USER, self::PASSWORD, $dispatcher, $logger),
|
||||||
|
@ -26,6 +26,15 @@ class MailjetApiTransport extends AbstractApiTransport
|
|||||||
{
|
{
|
||||||
private const HOST = 'api.mailjet.com';
|
private const HOST = 'api.mailjet.com';
|
||||||
private const API_VERSION = '3.1';
|
private const API_VERSION = '3.1';
|
||||||
|
private const FORBIDDEN_HEADERS = [
|
||||||
|
'Date', 'X-CSA-Complaints', 'Message-Id', 'X-Mailjet-Campaign', 'X-MJ-StatisticsContactsListID',
|
||||||
|
'DomainKey-Status', 'Received-SPF', 'Authentication-Results', 'Received', 'X-Mailjet-Prio',
|
||||||
|
'From', 'Sender', 'Subject', 'To', 'Cc', 'Bcc', 'Return-Path', 'Delivered-To', 'DKIM-Signature',
|
||||||
|
'X-Feedback-Id', 'X-Mailjet-Segmentation', 'List-Id', 'X-MJ-MID', 'X-MJ-ErrorMessage',
|
||||||
|
'X-MJ-TemplateErrorDeliver', 'X-MJ-TemplateErrorReporting', 'X-MJ-TemplateLanguage',
|
||||||
|
'X-Mailjet-Debug', 'User-Agent', 'X-Mailer', 'X-MJ-CustomID', 'X-MJ-EventPayload', 'X-MJ-Vars',
|
||||||
|
'X-Mailjet-TrackOpen', 'X-Mailjet-TrackClick', 'X-MJ-TemplateID', 'X-MJ-WorkflowID',
|
||||||
|
];
|
||||||
|
|
||||||
private $privateKey;
|
private $privateKey;
|
||||||
private $publicKey;
|
private $publicKey;
|
||||||
@ -104,6 +113,14 @@ class MailjetApiTransport extends AbstractApiTransport
|
|||||||
$message['HTMLPart'] = $html;
|
$message['HTMLPart'] = $html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach ($email->getHeaders()->all() as $header) {
|
||||||
|
if (\in_array($header->getName(), self::FORBIDDEN_HEADERS, true)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$message['Headers'][$header->getName()] = $header->getBodyAsString();
|
||||||
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'Messages' => [$message],
|
'Messages' => [$message],
|
||||||
];
|
];
|
||||||
|
@ -17,7 +17,8 @@
|
|||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^7.2.5",
|
"php": "^7.2.5",
|
||||||
"symfony/mailer": "^4.4|^5.0"
|
"symfony/mailer": "^4.4|^5.0",
|
||||||
|
"symfony/mime": "^5.2"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"symfony/http-client": "^4.4|^5.0"
|
"symfony/http-client": "^4.4|^5.0"
|
||||||
|
Reference in New Issue
Block a user