1--TEST-- 2Bug #80751 (Comma in recipient name breaks email delivery) 3--EXTENSIONS-- 4imap 5--CONFLICTS-- 6imap 7--SKIPIF-- 8<?php 9if (PHP_OS_FAMILY !== 'Windows') die('skip Windows only test'); 10if (getenv("SKIP_SLOW_TESTS")) die('skip slow test'); 11require_once __DIR__ . '/mail_skipif.inc'; 12?> 13--INI-- 14SMTP=localhost 15smtp_port=25 16--FILE-- 17<?php 18require_once __DIR__ . '/mail_include.inc'; 19 20function find_and_delete_message($username, $subject) { 21 global $default_mailbox, $password, $users, $domain; 22 23 $imap_stream = imap_open($default_mailbox, $username, $password); 24 if ($imap_stream === false) { 25 die("Cannot connect to IMAP server $server: " . imap_last_error() . "\n"); 26 } 27 28 $found = false; 29 $repeat_count = 20; // we will repeat a max of 20 times 30 while (!$found && $repeat_count > 0) { 31 // sleep for a while to allow msg to be delivered 32 sleep(1); 33 34 $num_messages = imap_check($imap_stream)->Nmsgs; 35 for ($i = $num_messages; $i > 0; $i--) { 36 $info = imap_headerinfo($imap_stream, $i); 37 if ($info->subject === $subject) { 38 $header = imap_fetchheader($imap_stream, $i); 39 echo "Return-Path header found: "; 40 var_dump(strpos($header, 'Return-Path: joe@example.com') !== false); 41 echo "To header found: "; 42 var_dump(strpos($header, "To: \"<bob@example.com>\" <{$users[1]}@$domain>") !== false); 43 echo "From header found: "; 44 var_dump(strpos($header, 'From: "<bob@example.com>" <joe@example.com>') !== false); 45 echo "Cc header found: "; 46 var_dump(strpos($header, "Cc: \"Lastname, Firstname\\\\\" <{$users[2]}@$domain>") !== false); 47 imap_delete($imap_stream, $i); 48 $found = true; 49 break; 50 } 51 } 52 $repeat_count--; 53 } 54 55 imap_close($imap_stream, CL_EXPUNGE); 56 return $found; 57} 58 59$to = "\"<bob@example.com>\" <{$users[1]}@$domain>"; 60$subject = bin2hex(random_bytes(16)); 61$message = 'hello'; 62$headers = "From: \"<bob@example.com>\" <joe@example.com>\r\n" 63 . "Cc: \"Lastname, Firstname\\\\\" <{$users[2]}@$domain>\r\n" 64 . "Bcc: \"Firstname \\\"Ni,ck\\\" Lastname\" <{$users[3]}@$domain>\r\n"; 65 66$res = mail($to, $subject, $message, $headers); 67if ($res !== true) { 68 die("TEST FAILED : Unable to send test email\n"); 69} else { 70 echo "Message sent OK\n"; 71} 72 73foreach ([$users[1], $users[2], $users[3]] as $user) { 74 if (!find_and_delete_message("$user@$domain", $subject)) { 75 echo "TEST FAILED: email not delivered\n"; 76 } else { 77 echo "TEST PASSED: Message sent and deleted OK\n"; 78 } 79} 80?> 81--EXPECT-- 82Message sent OK 83Return-Path header found: bool(true) 84To header found: bool(true) 85From header found: bool(true) 86Cc header found: bool(true) 87TEST PASSED: Message sent and deleted OK 88Return-Path header found: bool(true) 89To header found: bool(true) 90From header found: bool(true) 91Cc header found: bool(true) 92TEST PASSED: Message sent and deleted OK 93Return-Path header found: bool(true) 94To header found: bool(true) 95From header found: bool(true) 96Cc header found: bool(true) 97TEST PASSED: Message sent and deleted OK 98