Skip to content

Commit 869cda6

Browse files
Merge pull request #19 from #18
fix: the "name"-part of a MailAddress gets quoted multiple times
2 parents ec170f3 + d8a0989 commit 869cda6

File tree

2 files changed

+57
-40
lines changed

2 files changed

+57
-40
lines changed

src/Mail/Client/Data/MailAddress.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public function __construct(string $address, string $name)
8383
throw new InvalidArgumentException("\"address\" must be set for a MailAddress");
8484
}
8585
$this->address = $address;
86-
$this->name = $this->escapeName($name);
86+
$this->name = $name;
8787
}
8888

8989

@@ -150,7 +150,7 @@ public static function fromString(string $value): Jsonable
150150
}
151151

152152
$address = $val["address"];
153-
$name = $val["name"] ?? $val["address"];
153+
$name = isset($val["name"]) ? self::escapeName($val["name"]) : $val["address"];
154154

155155
try {
156156
return new self($address, $name);
@@ -200,20 +200,19 @@ public function toString(): string
200200
*/
201201
public function toJson(JsonStrategy $strategy = null): array
202202
{
203-
204203
return [
205204
'address' => $this->getAddress(),
206205
'name' => $this->getName()
207206
];
208207
}
209208

210209

211-
private function escapeName(string $name): string
210+
private static function escapeName(string $name): string
212211
{
213212
$regex = '/(,|"|\')/m';
214213

215214
if (preg_match($regex, $name) === 1) {
216-
return "\"" . addslashes($name) . "\"";
215+
return '"'.addslashes($name).'"' ;
217216
}
218217
return $name;
219218
}

tests/Mail/Client/Data/MailAddressTest.php

Lines changed: 53 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,59 @@ public function testToString()
111111
public function testFromString()
112112
{
113113

114+
/**
115+
* @see conjoon/php-lib-conjoon#12
116+
*/
117+
$tests = [
118+
[
119+
["Peter, Parker", "[email protected]"],
120+
["\"Peter, Parker\"", "[email protected]"]
121+
],
122+
[
123+
["Parker Peter", "[email protected]"],
124+
["Parker Peter", "[email protected]"],
125+
],
126+
[
127+
["Parker \" Peter", "[email protected]"],
128+
["\"Parker \\\" Peter\"", "[email protected]"],
129+
],
130+
[
131+
["Parker ' Peter", "[email protected]"],
132+
["\"Parker \' Peter\"", "[email protected]"],
133+
],
134+
[
135+
["Parker \"Parker, Peter Peter", "[email protected]"],
136+
["\"Parker \\\"Parker, Peter Peter\"", "[email protected]"],
137+
],
138+
[
139+
["Schäfer, Peter", "[email protected]"],
140+
["\"Schäfer, Peter\"", "[email protected]"]
141+
],
142+
[
143+
['"Schäfer, Peter"', "[email protected]"],
144+
['"\"Schäfer, Peter\""', "[email protected]"]
145+
],
146+
[
147+
['"Schä"fer, Pe"ter"', "[email protected]"],
148+
['"\"Schä\"fer, Pe\"ter\""', "[email protected]"]
149+
]
150+
151+
];
152+
153+
foreach ($tests as $test) {
154+
[$input, $output] = $test;
155+
156+
$mailAddress = new MailAddress($input[1], $input[0]);
157+
158+
$jsonString = json_encode($mailAddress->toJson());
159+
$fromStringMailAddress = MailAddress::fromString($jsonString);
160+
161+
$this->assertSame($output[1], $fromStringMailAddress->getAddress());
162+
$this->assertSame($output[0], $fromStringMailAddress->getName());
163+
}
164+
165+
166+
114167
$name = "Peter Parker";
115168
$address = "[email protected]";
116169
$mailAddress = new MailAddress($address, $name);
@@ -166,39 +219,4 @@ public function testCopy()
166219
}
167220

168221

169-
/**
170-
* @see conjoon/php-lib-conjoon#12
171-
*/
172-
public function testForAddressThatNeedToBeSanitized()
173-
{
174-
$tests = [
175-
[
176-
["Parker, Peter", "[email protected]"],
177-
["\"Parker, Peter\"", "[email protected]"],
178-
],
179-
[
180-
["Parker Peter", "[email protected]"],
181-
["Parker Peter", "[email protected]"],
182-
],
183-
[
184-
["Parker \" Peter", "[email protected]"],
185-
["\"Parker \\\" Peter\"", "[email protected]"],
186-
],
187-
[
188-
["Parker ' Peter", "[email protected]"],
189-
["\"Parker \' Peter\"", "[email protected]"],
190-
],
191-
[
192-
["Parker \"Parker, Peter Peter", "[email protected]"],
193-
["\"Parker \\\"Parker, Peter Peter\"", "[email protected]"],
194-
]
195-
];
196-
197-
foreach ($tests as $test) {
198-
[$input, $output] = $test;
199-
$mailAddress = new MailAddress($input[1], $input[0]);
200-
$this->assertSame($output[1], $mailAddress->getAddress());
201-
$this->assertSame($output[0], $mailAddress->getName());
202-
}
203-
}
204222
}

0 commit comments

Comments
 (0)