Skip to content

Commit ea35c47

Browse files
committed
Merge branch 'master' into 9.x
2 parents f6530d3 + ec906bf commit ea35c47

File tree

3 files changed

+142
-18
lines changed

3 files changed

+142
-18
lines changed

Diff for: README.md

+26-4
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)
@@ -295,10 +296,10 @@ Convert addresses data to [RFC 2822](http://faqs.org/rfcs/rfc2822.html) string,
295296
```php
296297
to_rfc2822_email([
297298
['address' => '[email protected]', 'name' => 'John Doe'],
298-
['address' => 'mary[email protected]'],
299+
['address' => 'jane[email protected]'],
299300
]);
300301
301-
302+
302303
```
303304
304305
Also, it supports simplified syntax for a single address:
@@ -316,10 +317,10 @@ Convert addresses data to [SwiftMailer-suitable format](https://swiftmailer.org/
316317
```php
317318
to_swiftmailer_emails([
318319
['address' => '[email protected]', 'name' => 'John Doe'],
319-
['address' => 'mary[email protected]'],
320+
['address' => 'jane[email protected]'],
320321
]);
321322
322-
// ["[email protected]" => "John Doe", "mary[email protected]"]
323+
// ["[email protected]" => "John Doe", "jane[email protected]"]
323324
```
324325
325326
Also, it supports simplified syntax for a single address:
@@ -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()`

Diff for: src/email.php

+30-14
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,8 @@
55
if (!function_exists('is_email')) {
66
/**
77
* Check whether the given string is an email address or not.
8-
*
9-
* @param mixed $string
10-
* @return bool
118
*/
12-
function is_email($string)
9+
function is_email(mixed $string): bool
1310
{
1411
return (bool) filter_var($string, FILTER_VALIDATE_EMAIL);
1512
}
@@ -21,13 +18,9 @@ function is_email($string)
2118
*
2219
* @see http://faqs.org/rfcs/rfc2822.html
2320
* @see https://php.net/manual/en/function.mail.php
24-
*
25-
* @param array $addresses
26-
* @return string
2721
*/
28-
function to_rfc2822_email(array $addresses)
22+
function to_rfc2822_email(array $addresses): string
2923
{
30-
// Check if we're dealing with one address, without multiarray
3124
$addresses = !empty($addresses['address']) ? [$addresses] : $addresses;
3225

3326
return collect($addresses)
@@ -51,13 +44,9 @@ function to_rfc2822_email(array $addresses)
5144
* Convert addresses data to SwiftMailer-suitable format.
5245
*
5346
* @see https://swiftmailer.org/docs/messages.html
54-
*
55-
* @param array $addresses
56-
* @return array
5747
*/
58-
function to_swiftmailer_emails(array $addresses)
48+
function to_swiftmailer_emails(array $addresses): array
5949
{
60-
// Check if we're dealing with one address, without multiarray
6150
$addresses = !empty($addresses['address']) ? [$addresses] : $addresses;
6251

6352
return collect($addresses)
@@ -75,3 +64,30 @@ function to_swiftmailer_emails(array $addresses)
7564
->toArray();
7665
}
7766
}
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+
}

Diff for: tests/email/ToSymfonyEmailsTest.php

+86
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)