Skip to content

Commit ec906bf

Browse files
committed
Add to_symfony_emails() helper
1 parent 68d2a53 commit ec906bf

File tree

3 files changed

+135
-2
lines changed

3 files changed

+135
-2
lines changed

README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ Laravel-specific and pure PHP Helper Functions.
7575
- [is_email](#is_email)
7676
- [to_rfc2822_email](#to_rfc2822_email)
7777
- [to_swiftmailer_emails](#to_swiftmailer_emails)
78+
- [to_symfony_emails](#to_symfony_emails)
7879
7980
- [Filesystem](#filesystem)
8081
- [relative_path](#relative_path)
@@ -330,6 +331,27 @@ to_swiftmailer_emails(['address' => '[email protected]', 'name' => 'John Doe'
330331
// ["[email protected]" => "John Doe"]
331332
```
332333
334+
#### `to_symfony_emails()`
335+
336+
Convert addresses data to [Symfony-suitable format](https://symfony.com/doc/current/mailer.html#email-addresses):
337+
338+
```php
339+
to_symfony_emails([
340+
['address' => '[email protected]', 'name' => 'John Doe'],
341+
['address' => '[email protected]'],
342+
]);
343+
344+
345+
```
346+
347+
Also, it supports simplified syntax for a single address:
348+
349+
```php
350+
to_symfony_emails(['address' => '[email protected]', 'name' => 'John Doe']);
351+
352+
// ["John Doe <[email protected]>"]
353+
```
354+
333355
## Filesystem
334356
335357
#### `relative_path()`

src/email.php

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ function is_email(mixed $string): bool
2121
*/
2222
function to_rfc2822_email(array $addresses): string
2323
{
24-
// Check if we're dealing with one address, without multiarray
2524
$addresses = !empty($addresses['address']) ? [$addresses] : $addresses;
2625

2726
return collect($addresses)
@@ -48,7 +47,6 @@ function to_rfc2822_email(array $addresses): string
4847
*/
4948
function to_swiftmailer_emails(array $addresses): array
5049
{
51-
// Check if we're dealing with one address, without multiarray
5250
$addresses = !empty($addresses['address']) ? [$addresses] : $addresses;
5351

5452
return collect($addresses)
@@ -66,3 +64,30 @@ function to_swiftmailer_emails(array $addresses): array
6664
->toArray();
6765
}
6866
}
67+
68+
if (!function_exists('to_symfony_emails')) {
69+
/**
70+
* Convert addresses data to Symfony-suitable format.
71+
*
72+
* @see https://symfony.com/doc/current/mailer.html#email-addresses
73+
*/
74+
function to_symfony_emails(array $addresses): array
75+
{
76+
$addresses = !empty($addresses['address']) ? [$addresses] : $addresses;
77+
78+
return collect($addresses)
79+
->map(function (array $item) {
80+
$name = Arr::get($item, 'name');
81+
$address = Arr::get($item, 'address');
82+
83+
if (!is_email($address)) {
84+
return false;
85+
}
86+
87+
return $name ? "{$name} <{$address}>" : $address;
88+
})
89+
->filter()
90+
->values()
91+
->toArray();
92+
}
93+
}

tests/email/ToSymfonyEmailsTest.php

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<?php
2+
3+
namespace Illuminated\Helpers\Tests\Email;
4+
5+
use Illuminated\Helpers\Tests\TestCase;
6+
7+
class ToSymfonyEmailsTest extends TestCase
8+
{
9+
/** @test */
10+
public function it_returns_an_empty_array_for_an_empty_array()
11+
{
12+
$this->assertEquals([], to_symfony_emails([]));
13+
}
14+
15+
/** @test */
16+
public function it_supports_simplified_syntax_for_one_email()
17+
{
18+
$this->assertEquals(
19+
['John Doe <[email protected]>'],
20+
to_symfony_emails(['address' => '[email protected]', 'name' => 'John Doe']),
21+
);
22+
}
23+
24+
/** @test */
25+
public function it_supports_multiple_emails()
26+
{
27+
$this->assertEquals(
28+
['John Doe <[email protected]>', 'Jane Doe <[email protected]>', 'Mary Doe <[email protected]>'],
29+
to_symfony_emails([
30+
['address' => '[email protected]', 'name' => 'John Doe'],
31+
['address' => '[email protected]', 'name' => 'Jane Doe'],
32+
['address' => '[email protected]', 'name' => 'Mary Doe'],
33+
]),
34+
);
35+
}
36+
37+
/** @test */
38+
public function it_skips_items_with_empty_addresses()
39+
{
40+
$this->assertEquals(
41+
['John Doe <[email protected]>', 'Mary Doe <[email protected]>'],
42+
to_symfony_emails([
43+
['address' => '[email protected]', 'name' => 'John Doe'],
44+
['address' => null, 'name' => 'Jane Doe'],
45+
['address' => false, 'name' => 'Jane Doe'],
46+
['address' => '', 'name' => 'Jane Doe'],
47+
['name' => 'Fake Doe'],
48+
['address' => '[email protected]', 'name' => 'Mary Doe'],
49+
]),
50+
);
51+
}
52+
53+
/** @test */
54+
public function it_skips_items_with_invalid_addresses()
55+
{
56+
$this->assertEquals(
57+
['John Doe <[email protected]>', 'Vicky Doe <[email protected]>'],
58+
to_symfony_emails([
59+
['address' => '[email protected]', 'name' => 'John Doe'],
60+
['address' => 'jane@', 'name' => 'Jane Doe'],
61+
['address' => 'jane@example', 'name' => 'Jane Doe'],
62+
['address' => '[email protected]', 'name' => 'Vicky Doe'],
63+
['address' => null, 'name' => 'Jane Doe'],
64+
]),
65+
);
66+
}
67+
68+
/** @test */
69+
public function name_is_optional_for_one_email()
70+
{
71+
$this->assertEquals(['[email protected]'], to_symfony_emails(['address' => '[email protected]']));
72+
}
73+
74+
/** @test */
75+
public function name_is_optional_for_multiple_emails()
76+
{
77+
$this->assertEquals(
78+
79+
to_symfony_emails([
80+
['address' => '[email protected]', 'name' => 'John Doe'],
81+
['address' => '[email protected]'],
82+
['address' => '[email protected]'],
83+
]),
84+
);
85+
}
86+
}

0 commit comments

Comments
 (0)