MessageTest.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. <?php
  2. /**
  3. * @category Zend
  4. * @package Zend_Mail
  5. * @subpackage UnitTests
  6. */
  7. /**
  8. * Zend_Mail_Message
  9. */
  10. require_once 'Zend/Mail/Message.php';
  11. /**
  12. * Zend_Mail_Storage_Mbox
  13. */
  14. require_once 'Zend/Mail/Storage/Mbox.php';
  15. /**
  16. * Zend_Mime_Decode
  17. */
  18. require_once 'Zend/Mime/Decode.php';
  19. /**
  20. * PHPUnit test case
  21. */
  22. require_once 'PHPUnit/Framework/TestCase.php';
  23. /**
  24. * @category Zend
  25. * @package Zend_Mail
  26. * @subpackage UnitTests
  27. */
  28. class Zend_Mail_MessageTest extends PHPUnit_Framework_TestCase
  29. {
  30. protected $_file;
  31. public function setUp()
  32. {
  33. $this->_file = dirname(__FILE__) . '/_files/mail.txt';
  34. }
  35. public function testInvalidFile()
  36. {
  37. try {
  38. $message = new Zend_Mail_Message(array('file' => '/this/file/does/not/exists'));
  39. } catch (Exception $e) {
  40. return; // ok
  41. }
  42. $this->fail('no exception raised while loading unknown file');
  43. }
  44. public function testIsMultipart()
  45. {
  46. $message = new Zend_Mail_Message(array('file' => $this->_file));
  47. $this->assertTrue($message->isMultipart());
  48. }
  49. public function testGetHeader()
  50. {
  51. $message = new Zend_Mail_Message(array('file' => $this->_file));
  52. $this->assertEquals($message->subject, 'multipart');
  53. }
  54. public function testGetDecodedHeader()
  55. {
  56. $message = new Zend_Mail_Message(array('file' => $this->_file));
  57. $this->assertEquals($message->from, iconv('UTF-8', iconv_get_encoding('internal_encoding'),
  58. '"Peter Müller" <peter-mueller@example.com>'));
  59. }
  60. public function testGetHeaderAsArray()
  61. {
  62. $message = new Zend_Mail_Message(array('file' => $this->_file));
  63. $this->assertEquals($message->getHeader('subject', 'array'), array('multipart'));
  64. }
  65. public function testGetHeaderFromOpenFile()
  66. {
  67. $fh = fopen($this->_file, 'r');
  68. $message = new Zend_Mail_Message(array('file' => $fh));
  69. $this->assertEquals($message->subject, 'multipart');
  70. }
  71. public function testGetFirstPart()
  72. {
  73. $message = new Zend_Mail_Message(array('file' => $this->_file));
  74. $this->assertEquals(substr($message->getPart(1)->getContent(), 0, 14), 'The first part');
  75. }
  76. public function testGetFirstPartTwice()
  77. {
  78. $message = new Zend_Mail_Message(array('file' => $this->_file));
  79. $message->getPart(1);
  80. $this->assertEquals(substr($message->getPart(1)->getContent(), 0, 14), 'The first part');
  81. }
  82. public function testGetWrongPart()
  83. {
  84. $message = new Zend_Mail_Message(array('file' => $this->_file));
  85. try {
  86. $message->getPart(-1);
  87. } catch (Exception $e) {
  88. return; // ok
  89. }
  90. $this->fail('no exception raised while fetching unknown part');
  91. }
  92. public function testNoHeaderMessage()
  93. {
  94. $message = new Zend_Mail_Message(array('file' => __FILE__));
  95. $this->assertEquals(substr($message->getContent(), 0, 5), '<?php');
  96. $raw = file_get_contents(__FILE__);
  97. $raw = "\t" . $raw;
  98. $message = new Zend_Mail_Message(array('raw' => $raw));
  99. $this->assertEquals(substr($message->getContent(), 0, 6), "\t<?php");
  100. }
  101. public function testMultipleHeader()
  102. {
  103. $raw = file_get_contents($this->_file);
  104. $raw = "sUBject: test\nSubJect: test2\n" . $raw;
  105. $message = new Zend_Mail_Message(array('raw' => $raw));
  106. $this->assertEquals($message->getHeader('subject', 'string'),
  107. 'test' . Zend_Mime::LINEEND . 'test2' . Zend_Mime::LINEEND . 'multipart');
  108. $this->assertEquals($message->getHeader('subject'), array('test', 'test2', 'multipart'));
  109. }
  110. public function testContentTypeDecode()
  111. {
  112. $message = new Zend_Mail_Message(array('file' => $this->_file));
  113. $this->assertEquals(Zend_Mime_Decode::splitContentType($message->ContentType),
  114. array('type' => 'multipart/alternative', 'boundary' => 'crazy-multipart'));
  115. }
  116. public function testSplitEmptyMessage()
  117. {
  118. $this->assertEquals(Zend_Mime_Decode::splitMessageStruct('', 'xxx'), null);
  119. }
  120. public function testSplitInvalidMessage()
  121. {
  122. try {
  123. Zend_Mime_Decode::splitMessageStruct("--xxx\n", 'xxx');
  124. } catch (Zend_Exception $e) {
  125. return; // ok
  126. }
  127. $this->fail('no exception raised while decoding invalid message');
  128. }
  129. public function testInvalidMailHandler()
  130. {
  131. try {
  132. $message = new Zend_Mail_Message(array('handler' => 1));
  133. } catch (Zend_Exception $e) {
  134. return; // ok
  135. }
  136. $this->fail('no exception raised while using invalid mail handler');
  137. }
  138. public function testMissingId()
  139. {
  140. $mail = new Zend_Mail_Storage_Mbox(array('filename' => dirname(__FILE__) . '/_files/test.mbox/INBOX'));
  141. try {
  142. $message = new Zend_Mail_Message(array('handler' => $mail));
  143. } catch (Zend_Exception $e) {
  144. return; // ok
  145. }
  146. $this->fail('no exception raised while mail handler without id');
  147. }
  148. public function testIterator()
  149. {
  150. $message = new Zend_Mail_Message(array('file' => $this->_file));
  151. foreach (new RecursiveIteratorIterator($message) as $num => $part) {
  152. if ($num == 1) {
  153. // explicit call of __toString() needed for PHP < 5.2
  154. $this->assertEquals(substr($part->__toString(), 0, 14), 'The first part');
  155. }
  156. }
  157. $this->assertEquals($part->contentType, 'text/x-vertical');
  158. }
  159. public function testDecodeString()
  160. {
  161. $is = Zend_Mime_Decode::decodeQuotedPrintable('=?UTF-8?Q?"Peter M=C3=BCller"?= <peter-mueller@example.com>');
  162. $should = iconv('UTF-8', iconv_get_encoding('internal_encoding'),
  163. '"Peter Müller" <peter-mueller@example.com>');
  164. $this->assertEquals($is, $should);
  165. }
  166. public function testSplitHeader()
  167. {
  168. $header = 'foo; x=y; y="x"';
  169. $this->assertEquals(Zend_Mime_Decode::splitHeaderField($header), array('foo', 'x' => 'y', 'y' => 'x'));
  170. $this->assertEquals(Zend_Mime_Decode::splitHeaderField($header, 'x'), 'y');
  171. $this->assertEquals(Zend_Mime_Decode::splitHeaderField($header, 'y'), 'x');
  172. $this->assertEquals(Zend_Mime_Decode::splitHeaderField($header, 'foo', 'foo'), 'foo');
  173. $this->assertEquals(Zend_Mime_Decode::splitHeaderField($header, 'foo'), null);
  174. }
  175. public function testSplitInvalidHeader()
  176. {
  177. $header = '';
  178. try {
  179. Zend_Mime_Decode::splitHeaderField($header);
  180. } catch (Zend_Exception $e) {
  181. return; // ok
  182. }
  183. $this->fail('no exception raised while decoding invalid header field');
  184. }
  185. public function testSplitMessage()
  186. {
  187. $header = 'Test: test';
  188. $body = 'body';
  189. $newlines = array("\r\n", "\n\r", "\n", "\r");
  190. foreach ($newlines as $contentEOL) {
  191. foreach ($newlines as $decodeEOL) {
  192. $content = $header . $contentEOL . $contentEOL . $body;
  193. $decoded = Zend_Mime_Decode::splitMessage($content, $decoded_header, $decoded_body, $decodeEOL);
  194. $this->assertEquals(array('test' => 'test'), $decoded_header);
  195. $this->assertEquals($body, $decoded_body);
  196. }
  197. }
  198. }
  199. public function testToplines()
  200. {
  201. $message = new Zend_Mail_Message(array('headers' => file_get_contents($this->_file)));
  202. $this->assertTrue(strpos($message->getToplines(), 'multipart message') === 0);
  203. }
  204. public function testNoContent()
  205. {
  206. $message = new Zend_Mail_Message(array('raw' => 'Subject: test'));
  207. try {
  208. $message->getContent();
  209. } catch (Zend_Exception $e) {
  210. return; // ok
  211. }
  212. $this->fail('no exception raised while getting content of message without body');
  213. }
  214. public function testEmptyHeader()
  215. {
  216. $message = new Zend_Mail_Message(array());
  217. $this->assertEquals(array(), $message->getHeaders());
  218. $message = new Zend_Mail_Message(array());
  219. $subject = null;
  220. try {
  221. $subject = $message->subject;
  222. } catch (Zend_Exception $e) {
  223. // ok
  224. }
  225. if ($subject) {
  226. $this->fail('no exception raised while getting header from empty message');
  227. }
  228. }
  229. public function testEmptyBody()
  230. {
  231. $message = new Zend_Mail_Message(array());
  232. $part = null;
  233. try {
  234. $part = $message->getPart(1);
  235. } catch (Zend_Exception $e) {
  236. // ok
  237. }
  238. if ($part) {
  239. $this->fail('no exception raised while getting part from empty message');
  240. }
  241. $message = new Zend_Mail_Message(array());
  242. $this->assertTrue($message->countParts() == 0);
  243. }
  244. /**
  245. * @group ZF-5209
  246. */
  247. public function testCheckingHasHeaderFunctionality()
  248. {
  249. $message = new Zend_Mail_Message(array('headers' => array('subject' => 'foo')));
  250. $this->assertTrue( $message->headerExists('subject'));
  251. $this->assertTrue( isset($message->subject) );
  252. $this->assertTrue( $message->headerExists('SuBject'));
  253. $this->assertTrue( isset($message->suBjeCt) );
  254. $this->assertFalse($message->headerExists('From'));
  255. }
  256. public function testWrongMultipart()
  257. {
  258. $message = new Zend_Mail_Message(array('raw' => "Content-Type: multipart/mixed\r\n\r\ncontent"));
  259. try {
  260. $message->getPart(1);
  261. } catch (Zend_Exception $e) {
  262. return; // ok
  263. }
  264. $this->fail('no exception raised while getting part from message without boundary');
  265. }
  266. public function testLateFetch()
  267. {
  268. $mail = new Zend_Mail_Storage_Mbox(array('filename' => dirname(__FILE__) . '/_files/test.mbox/INBOX'));
  269. $message = new Zend_Mail_Message(array('handler' => $mail, 'id' => 5));
  270. $this->assertEquals($message->countParts(), 2);
  271. $this->assertEquals($message->countParts(), 2);
  272. $message = new Zend_Mail_Message(array('handler' => $mail, 'id' => 5));
  273. $this->assertEquals($message->subject, 'multipart');
  274. $message = new Zend_Mail_Message(array('handler' => $mail, 'id' => 5));
  275. $this->assertTrue(strpos($message->getContent(), 'multipart message') === 0);
  276. }
  277. public function testManualIterator()
  278. {
  279. $message = new Zend_Mail_Message(array('file' => $this->_file));
  280. $this->assertTrue($message->valid());
  281. $this->assertEquals($message->getChildren(), $message->current());
  282. $this->assertEquals($message->key(), 1);
  283. $message->next();
  284. $this->assertTrue($message->valid());
  285. $this->assertEquals($message->getChildren(), $message->current());
  286. $this->assertEquals($message->key(), 2);
  287. $message->next();
  288. $this->assertFalse($message->valid());
  289. $message->rewind();
  290. $this->assertTrue($message->valid());
  291. $this->assertEquals($message->getChildren(), $message->current());
  292. $this->assertEquals($message->key(), 1);
  293. }
  294. public function testMessageFlagsAreSet()
  295. {
  296. $origFlags = array(
  297. 'foo' => 'bar',
  298. 'baz' => 'bat'
  299. );
  300. $message = new Zend_Mail_Message(array('flags' => $origFlags));
  301. $messageFlags = $message->getFlags();
  302. $this->assertTrue($message->hasFlag('bar'), var_export($messageFlags, 1));
  303. $this->assertTrue($message->hasFlag('bat'), var_export($messageFlags, 1));
  304. $this->assertEquals(array('bar' => 'bar', 'bat' => 'bat'), $messageFlags);
  305. }
  306. public function testGetHeaderFieldSingle()
  307. {
  308. $message = new Zend_Mail_Message(array('file' => $this->_file));
  309. $this->assertEquals($message->getHeaderField('subject'), 'multipart');
  310. }
  311. public function testGetHeaderFieldDefault()
  312. {
  313. $message = new Zend_Mail_Message(array('file' => $this->_file));
  314. $this->assertEquals($message->getHeaderField('content-type'), 'multipart/alternative');
  315. }
  316. public function testGetHeaderFieldNamed()
  317. {
  318. $message = new Zend_Mail_Message(array('file' => $this->_file));
  319. $this->assertEquals($message->getHeaderField('content-type', 'boundary'), 'crazy-multipart');
  320. }
  321. public function testGetHeaderFieldMissing()
  322. {
  323. $message = new Zend_Mail_Message(array('file' => $this->_file));
  324. $this->assertNull($message->getHeaderField('content-type', 'foo'));
  325. }
  326. public function testGetHeaderFieldInvalid()
  327. {
  328. $message = new Zend_Mail_Message(array('file' => $this->_file));
  329. try {
  330. $message->getHeaderField('fake-header-name', 'foo');
  331. } catch (Zend_Mail_Exception $e) {
  332. return;
  333. }
  334. $this->fail('No exception thrown while requesting invalid field name');
  335. }
  336. public function testCaseInsensitiveMultipart()
  337. {
  338. $message = new Zend_Mail_Message(array('raw' => "coNTent-TYpe: muLTIpaRT/x-empty\r\n\r\n"));
  339. $this->assertTrue($message->isMultipart());
  340. }
  341. public function testCaseInsensitiveField()
  342. {
  343. $header = 'test; fOO="this is a test"';
  344. $this->assertEquals(Zend_Mime_Decode::splitHeaderField($header, 'Foo'), 'this is a test');
  345. $this->assertEquals(Zend_Mime_Decode::splitHeaderField($header, 'bar'), null);
  346. }
  347. public function testSpaceInFieldName()
  348. {
  349. $header = 'test; foo =bar; baz =42';
  350. $this->assertEquals(Zend_Mime_Decode::splitHeaderField($header, 'foo'), 'bar');
  351. $this->assertEquals(Zend_Mime_Decode::splitHeaderField($header, 'baz'), 42);
  352. }
  353. }