ImapTest.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852
  1. <?php
  2. /**
  3. * @category Zend
  4. * @package Zend_Mail
  5. * @subpackage UnitTests
  6. */
  7. /**
  8. * Zend_Mail_Storage_Imap
  9. */
  10. require_once 'Zend/Mail/Storage/Imap.php';
  11. /**
  12. * Zend_Mail_Protocol_Imap
  13. */
  14. require_once 'Zend/Mail/Protocol/Imap.php';
  15. /**
  16. * Zend_Config
  17. */
  18. require_once 'Zend/Config.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_ImapTest extends PHPUnit_Framework_TestCase
  29. {
  30. protected $_params;
  31. public function setUp()
  32. {
  33. $this->_params = array('host' => TESTS_ZEND_MAIL_IMAP_HOST,
  34. 'user' => TESTS_ZEND_MAIL_IMAP_USER,
  35. 'password' => TESTS_ZEND_MAIL_IMAP_PASSWORD);
  36. if (defined('TESTS_ZEND_MAIL_SERVER_TESTDIR') && TESTS_ZEND_MAIL_SERVER_TESTDIR) {
  37. if (!file_exists(TESTS_ZEND_MAIL_SERVER_TESTDIR . DIRECTORY_SEPARATOR . 'inbox')
  38. && !file_exists(TESTS_ZEND_MAIL_SERVER_TESTDIR . DIRECTORY_SEPARATOR . 'INBOX')) {
  39. $this->markTestSkipped('There is no file name "inbox" or "INBOX" in '
  40. . TESTS_ZEND_MAIL_SERVER_TESTDIR . '. I won\'t use it for testing. '
  41. . 'This is you safety net. If you think it is the right directory just '
  42. . 'create an empty file named INBOX or remove/deactived this message.');
  43. }
  44. $this->_cleanDir(TESTS_ZEND_MAIL_SERVER_TESTDIR);
  45. $this->_copyDir(dirname(__FILE__) . '/_files/test.' . TESTS_ZEND_MAIL_SERVER_FORMAT,
  46. TESTS_ZEND_MAIL_SERVER_TESTDIR);
  47. }
  48. }
  49. protected function _cleanDir($dir)
  50. {
  51. $dh = opendir($dir);
  52. while (($entry = readdir($dh)) !== false) {
  53. if ($entry == '.' || $entry == '..') {
  54. continue;
  55. }
  56. $fullname = $dir . DIRECTORY_SEPARATOR . $entry;
  57. if (is_dir($fullname)) {
  58. $this->_cleanDir($fullname);
  59. rmdir($fullname);
  60. } else {
  61. unlink($fullname);
  62. }
  63. }
  64. closedir($dh);
  65. }
  66. protected function _copyDir($dir, $dest)
  67. {
  68. $dh = opendir($dir);
  69. while (($entry = readdir($dh)) !== false) {
  70. if ($entry == '.' || $entry == '..' || $entry == '.svn') {
  71. continue;
  72. }
  73. $fullname = $dir . DIRECTORY_SEPARATOR . $entry;
  74. $destname = $dest . DIRECTORY_SEPARATOR . $entry;
  75. if (is_dir($fullname)) {
  76. mkdir($destname);
  77. $this->_copyDir($fullname, $destname);
  78. } else {
  79. copy($fullname, $destname);
  80. }
  81. }
  82. closedir($dh);
  83. }
  84. public function testConnectOk()
  85. {
  86. try {
  87. $mail = new Zend_Mail_Storage_Imap($this->_params);
  88. } catch (Exception $e) {
  89. $this->fail('exception raised while loading connection to imap server');
  90. }
  91. }
  92. public function testConnectConfig()
  93. {
  94. try {
  95. $mail = new Zend_Mail_Storage_Imap(new Zend_Config($this->_params));
  96. } catch (Exception $e) {
  97. $this->fail('exception raised while loading connection to imap server');
  98. }
  99. }
  100. public function testConnectFailure()
  101. {
  102. $this->_params['host'] = 'example.example';
  103. try {
  104. $mail = new Zend_Mail_Storage_Imap($this->_params);
  105. } catch (Exception $e) {
  106. return; // test ok
  107. }
  108. // I can only hope noone installs a imap server there
  109. $this->fail('no exception raised while connecting to example.example');
  110. }
  111. public function testNoParams()
  112. {
  113. try {
  114. $mail = new Zend_Mail_Storage_Imap(array());
  115. } catch (Exception $e) {
  116. return; // test ok
  117. }
  118. $this->fail('no exception raised with empty params');
  119. }
  120. public function testConnectSSL()
  121. {
  122. if (!TESTS_ZEND_MAIL_IMAP_SSL) {
  123. return;
  124. }
  125. $this->_params['ssl'] = 'SSL';
  126. try {
  127. $mail = new Zend_Mail_Storage_Imap($this->_params);
  128. } catch (Exception $e) {
  129. $this->fail('exception raised while loading connection to imap server with SSL');
  130. }
  131. }
  132. public function testConnectTLS()
  133. {
  134. if (!TESTS_ZEND_MAIL_IMAP_TLS) {
  135. return;
  136. }
  137. $this->_params['ssl'] = 'TLS';
  138. try {
  139. $mail = new Zend_Mail_Storage_Imap($this->_params);
  140. } catch (Exception $e) {
  141. $this->fail('exception raised while loading connection to imap server with TLS');
  142. }
  143. }
  144. public function testInvalidService()
  145. {
  146. $this->_params['port'] = TESTS_ZEND_MAIL_IMAP_INVALID_PORT;
  147. try {
  148. $mail = new Zend_Mail_Storage_Imap($this->_params);
  149. } catch (Exception $e) {
  150. return; // test ok
  151. }
  152. $this->fail('no exception while connection to invalid port');
  153. }
  154. public function testWrongService()
  155. {
  156. $this->_params['port'] = TESTS_ZEND_MAIL_IMAP_WRONG_PORT;
  157. try {
  158. $mail = new Zend_Mail_Storage_Imap($this->_params);
  159. } catch (Exception $e) {
  160. return; // test ok
  161. }
  162. $this->fail('no exception while connection to wrong port');
  163. }
  164. public function testWrongUsername()
  165. {
  166. // this also triggers ...{chars}<NL>token for coverage
  167. $this->_params['user'] = "there is no\nnobody";
  168. try {
  169. $mail = new Zend_Mail_Storage_Imap($this->_params);
  170. } catch (Exception $e) {
  171. return; // test ok
  172. }
  173. $this->fail('no exception while using wrong username');
  174. }
  175. public function testWithInstanceConstruction()
  176. {
  177. $protocol = new Zend_Mail_Protocol_Imap($this->_params['host']);
  178. $protocol->login($this->_params['user'], $this->_params['password']);
  179. // if $protocol is invalid the constructor fails while selecting INBOX
  180. $mail = new Zend_Mail_Storage_Imap($protocol);
  181. }
  182. public function testWithNotConnectedInstance()
  183. {
  184. $protocol = new Zend_Mail_Protocol_Imap();
  185. try {
  186. $mail = new Zend_Mail_Storage_Imap($protocol);
  187. } catch (Zend_Mail_Protocol_Exception $e) {
  188. return; // test ok
  189. }
  190. $this->fail('no exception while using not connected low-level class');
  191. }
  192. public function testWithNotLoggedInstance()
  193. {
  194. $protocol = new Zend_Mail_Protocol_Imap($this->_params['host']);
  195. try {
  196. $mail = new Zend_Mail_Storage_Imap($protocol);
  197. } catch (Zend_Mail_Storage_Exception $e) {
  198. return; // test ok
  199. }
  200. $this->fail('no exception while using not logged in low-level class');
  201. }
  202. public function testWrongFolder()
  203. {
  204. $this->_params['folder'] = 'this folder does not exist on your server';
  205. try {
  206. $mail = new Zend_Mail_Storage_Imap($this->_params);
  207. } catch (Exception $e) {
  208. return; // test ok
  209. }
  210. $this->fail('no exception with not existing folder');
  211. }
  212. public function testClose()
  213. {
  214. $mail = new Zend_Mail_Storage_Imap($this->_params);
  215. try {
  216. $mail->close();
  217. } catch (Exception $e) {
  218. $this->fail('exception raised while closing imap connection');
  219. }
  220. }
  221. /*
  222. currently imap has no top
  223. public function testHasTop()
  224. {
  225. $mail = new Zend_Mail_Storage_Imap($this->_params);
  226. $this->assertTrue($mail->hasTop);
  227. }
  228. */
  229. public function testHasCreate()
  230. {
  231. $mail = new Zend_Mail_Storage_Imap($this->_params);
  232. $this->assertFalse($mail->hasCreate);
  233. }
  234. public function testNoop()
  235. {
  236. $mail = new Zend_Mail_Storage_Imap($this->_params);
  237. try {
  238. $mail->noop();
  239. } catch (Exception $e) {
  240. $this->fail('exception raised while doing nothing (noop)');
  241. }
  242. }
  243. public function testCount()
  244. {
  245. $mail = new Zend_Mail_Storage_Imap($this->_params);
  246. $count = $mail->countMessages();
  247. $this->assertEquals(7, $count);
  248. }
  249. public function testSize()
  250. {
  251. $mail = new Zend_Mail_Storage_Imap($this->_params);
  252. $shouldSizes = array(1 => 397, 89, 694, 452, 497, 101, 139);
  253. $sizes = $mail->getSize();
  254. $this->assertEquals($shouldSizes, $sizes);
  255. }
  256. public function testSingleSize()
  257. {
  258. $mail = new Zend_Mail_Storage_Imap($this->_params);
  259. $size = $mail->getSize(2);
  260. $this->assertEquals(89, $size);
  261. }
  262. public function testFetchHeader()
  263. {
  264. $mail = new Zend_Mail_Storage_Imap($this->_params);
  265. $subject = $mail->getMessage(1)->subject;
  266. $this->assertEquals('Simple Message', $subject);
  267. }
  268. /*
  269. currently imap has no top
  270. public function testFetchTopBody()
  271. {
  272. $mail = new Zend_Mail_Storage_Imap($this->_params);
  273. $content = $mail->getHeader(3, 1)->getContent();
  274. $this->assertEquals('Fair river! in thy bright, clear flow', trim($content));
  275. }
  276. */
  277. public function testFetchMessageHeader()
  278. {
  279. $mail = new Zend_Mail_Storage_Imap($this->_params);
  280. $subject = $mail->getMessage(1)->subject;
  281. $this->assertEquals('Simple Message', $subject);
  282. }
  283. public function testFetchMessageBody()
  284. {
  285. $mail = new Zend_Mail_Storage_Imap($this->_params);
  286. $content = $mail->getMessage(3)->getContent();
  287. list($content, ) = explode("\n", $content, 2);
  288. $this->assertEquals('Fair river! in thy bright, clear flow', trim($content));
  289. }
  290. public function testRemove()
  291. {
  292. $mail = new Zend_Mail_Storage_Imap($this->_params);
  293. $count = $mail->countMessages();
  294. $mail->removeMessage(1);
  295. $this->assertEquals($mail->countMessages(), $count - 1);
  296. }
  297. public function testTooLateCount()
  298. {
  299. $mail = new Zend_Mail_Storage_Imap($this->_params);
  300. $mail->close();
  301. // after closing we can't count messages
  302. try {
  303. $mail->countMessages();
  304. } catch (Exception $e) {
  305. return; // test ok
  306. }
  307. $this->fail('no exception raised while counting messages on closed connection');
  308. }
  309. public function testLoadUnkownFolder()
  310. {
  311. $this->_params['folder'] = 'UnknownFolder';
  312. try {
  313. $mail = new Zend_Mail_Storage_Imap($this->_params);
  314. } catch (Exception $e) {
  315. return; // test ok
  316. }
  317. $this->fail('no exception raised while loading unknown folder');
  318. }
  319. public function testChangeFolder()
  320. {
  321. $mail = new Zend_Mail_Storage_Imap($this->_params);
  322. try {
  323. $mail->selectFolder('subfolder/test');
  324. } catch (Exception $e) {
  325. $this->fail('exception raised while selecting existing folder');
  326. }
  327. $this->assertEquals($mail->getCurrentFolder(), 'subfolder/test');
  328. }
  329. public function testUnknownFolder()
  330. {
  331. $mail = new Zend_Mail_Storage_Imap($this->_params);
  332. try {
  333. $mail->selectFolder('/Unknown/Folder/');
  334. } catch (Exception $e) {
  335. return; // test ok
  336. }
  337. $this->fail('no exception raised while selecting unknown folder');
  338. }
  339. public function testGlobalName()
  340. {
  341. $mail = new Zend_Mail_Storage_Imap($this->_params);
  342. try {
  343. // explicit call of __toString() needed for PHP < 5.2
  344. $this->assertEquals($mail->getFolders()->subfolder->__toString(), 'subfolder');
  345. } catch (Exception $e) {
  346. $this->fail('exception raised while selecting existing folder and getting global name');
  347. }
  348. }
  349. public function testLocalName()
  350. {
  351. $mail = new Zend_Mail_Storage_Imap($this->_params);
  352. try {
  353. $this->assertEquals($mail->getFolders()->subfolder->key(), 'test');
  354. } catch (Zend_Mail_Exception $e) {
  355. $this->fail('exception raised while selecting existing folder and getting local name');
  356. }
  357. }
  358. public function testKeyLocalName()
  359. {
  360. $mail = new Zend_Mail_Storage_Imap($this->_params);
  361. $iterator = new RecursiveIteratorIterator($mail->getFolders(), RecursiveIteratorIterator::SELF_FIRST);
  362. // we search for this folder because we can't assume a order while iterating
  363. $search_folders = array('subfolder' => 'subfolder',
  364. 'subfolder/test' => 'test',
  365. 'INBOX' => 'INBOX');
  366. $found_folders = array();
  367. foreach ($iterator as $localName => $folder) {
  368. if (!isset($search_folders[$folder->getGlobalName()])) {
  369. continue;
  370. }
  371. // explicit call of __toString() needed for PHP < 5.2
  372. $found_folders[$folder->__toString()] = $localName;
  373. }
  374. $this->assertEquals($search_folders, $found_folders);
  375. }
  376. public function testSelectable()
  377. {
  378. $mail = new Zend_Mail_Storage_Imap($this->_params);
  379. $iterator = new RecursiveIteratorIterator($mail->getFolders(), RecursiveIteratorIterator::SELF_FIRST);
  380. foreach ($iterator as $localName => $folder) {
  381. $this->assertEquals($localName, $folder->getLocalName());
  382. }
  383. }
  384. public function testCountFolder()
  385. {
  386. $mail = new Zend_Mail_Storage_Imap($this->_params);
  387. $mail->selectFolder('subfolder/test');
  388. $count = $mail->countMessages();
  389. $this->assertEquals(1, $count);
  390. }
  391. public function testSizeFolder()
  392. {
  393. $mail = new Zend_Mail_Storage_Imap($this->_params);
  394. $mail->selectFolder('subfolder/test');
  395. $sizes = $mail->getSize();
  396. $this->assertEquals(array(1 => 410), $sizes);
  397. }
  398. public function testFetchHeaderFolder()
  399. {
  400. $mail = new Zend_Mail_Storage_Imap($this->_params);
  401. $mail->selectFolder('subfolder/test');
  402. $subject = $mail->getMessage(1)->subject;
  403. $this->assertEquals('Message in subfolder', $subject);
  404. }
  405. public function testHasFlag()
  406. {
  407. $mail = new Zend_Mail_Storage_Imap($this->_params);
  408. $this->assertTrue($mail->getMessage(1)->hasFlag(Zend_Mail_Storage::FLAG_RECENT));
  409. }
  410. public function testGetFlags()
  411. {
  412. $mail = new Zend_Mail_Storage_Imap($this->_params);
  413. $flags = $mail->getMessage(1)->getFlags();
  414. $this->assertTrue(isset($flags[Zend_Mail_Storage::FLAG_RECENT]));
  415. $this->assertTrue(in_array(Zend_Mail_Storage::FLAG_RECENT, $flags));
  416. }
  417. public function testRawHeader()
  418. {
  419. $mail = new Zend_Mail_Storage_Imap($this->_params);
  420. $this->assertTrue(strpos($mail->getRawHeader(1), "\r\nSubject: Simple Message\r\n") > 0);
  421. }
  422. public function testUniqueId()
  423. {
  424. $mail = new Zend_Mail_Storage_Imap($this->_params);
  425. $this->assertTrue($mail->hasUniqueId);
  426. $this->assertEquals(1, $mail->getNumberByUniqueId($mail->getUniqueId(1)));
  427. $ids = $mail->getUniqueId();
  428. foreach ($ids as $num => $id) {
  429. foreach ($ids as $inner_num => $inner_id) {
  430. if ($num == $inner_num) {
  431. continue;
  432. }
  433. if ($id == $inner_id) {
  434. $this->fail('not all ids are unique');
  435. }
  436. }
  437. if ($mail->getNumberByUniqueId($id) != $num) {
  438. $this->fail('reverse lookup failed');
  439. }
  440. }
  441. }
  442. public function testWrongUniqueId()
  443. {
  444. $mail = new Zend_Mail_Storage_Imap($this->_params);
  445. try {
  446. $mail->getNumberByUniqueId('this_is_an_invalid_id');
  447. } catch (Exception $e) {
  448. return; // test ok
  449. }
  450. $this->fail('no exception while getting number for invalid id');
  451. }
  452. public function testCreateFolder()
  453. {
  454. $mail = new Zend_Mail_Storage_Imap($this->_params);
  455. $mail->createFolder('subfolder/test1');
  456. $mail->createFolder('test2', 'subfolder');
  457. $mail->createFolder('test3', $mail->getFolders()->subfolder);
  458. try {
  459. $mail->getFolders()->subfolder->test1;
  460. $mail->getFolders()->subfolder->test2;
  461. $mail->getFolders()->subfolder->test3;
  462. } catch (Exception $e) {
  463. $this->fail('could not get new folders');
  464. }
  465. }
  466. public function testCreateExistingFolder()
  467. {
  468. $mail = new Zend_Mail_Storage_Imap($this->_params);
  469. try {
  470. $mail->createFolder('subfolder/test');
  471. } catch (Exception $e) {
  472. return; // ok
  473. }
  474. $this->fail('should not be able to create existing folder');
  475. }
  476. public function testRemoveFolderName()
  477. {
  478. $mail = new Zend_Mail_Storage_Imap($this->_params);
  479. $mail->removeFolder('subfolder/test');
  480. try {
  481. $mail->getFolders()->subfolder->test;
  482. } catch (Exception $e) {
  483. return; // ok
  484. }
  485. $this->fail('folder still exists');
  486. }
  487. public function testRemoveFolderInstance()
  488. {
  489. $mail = new Zend_Mail_Storage_Imap($this->_params);
  490. $mail->removeFolder($mail->getFolders()->subfolder->test);
  491. try {
  492. $mail->getFolders()->subfolder->test;
  493. } catch (Exception $e) {
  494. return; // ok
  495. }
  496. $this->fail('folder still exists');
  497. }
  498. public function testRemoveInvalidFolder()
  499. {
  500. $mail = new Zend_Mail_Storage_Imap($this->_params);
  501. try {
  502. $mail->removeFolder('thisFolderDoestNotExist');
  503. } catch (Exception $e) {
  504. return; // ok
  505. }
  506. $this->fail('no error while removing invalid folder');
  507. }
  508. public function testRenameFolder()
  509. {
  510. $mail = new Zend_Mail_Storage_Imap($this->_params);
  511. try {
  512. $mail->renameFolder('subfolder/test', 'subfolder/test1');
  513. $mail->renameFolder($mail->getFolders()->subfolder->test1, 'subfolder/test');
  514. } catch (Exception $e) {
  515. $this->fail('renaming failed');
  516. }
  517. try {
  518. $mail->renameFolder('subfolder/test', 'INBOX');
  519. } catch (Exception $e) {
  520. return; // ok
  521. }
  522. $this->fail('no error while renaming folder to INBOX');
  523. }
  524. public function testAppend()
  525. {
  526. $mail = new Zend_Mail_Storage_Imap($this->_params);
  527. $count = $mail->countMessages();
  528. $message = '';
  529. $message .= "From: me@example.org\r\n";
  530. $message .= "To: you@example.org\r\n";
  531. $message .= "Subject: append test\r\n";
  532. $message .= "\r\n";
  533. $message .= "This is a test\r\n";
  534. $mail->appendMessage($message);
  535. $this->assertEquals($count + 1, $mail->countMessages());
  536. $this->assertEquals($mail->getMessage($count + 1)->subject, 'append test');
  537. try {
  538. $mail->appendMessage('');
  539. } catch (Exception $e) {
  540. return; // ok
  541. }
  542. $this->fail('no error while appending empty message');
  543. }
  544. public function testCopy()
  545. {
  546. $mail = new Zend_Mail_Storage_Imap($this->_params);
  547. $mail->selectFolder('subfolder/test');
  548. $count = $mail->countMessages();
  549. $mail->selectFolder('INBOX');
  550. $message = $mail->getMessage(1);
  551. $mail->copyMessage(1, 'subfolder/test');
  552. $mail->selectFolder('subfolder/test');
  553. $this->assertEquals($count + 1, $mail->countMessages());
  554. $this->assertEquals($mail->getMessage($count + 1)->subject, $message->subject);
  555. $this->assertEquals($mail->getMessage($count + 1)->from, $message->from);
  556. $this->assertEquals($mail->getMessage($count + 1)->to, $message->to);
  557. try {
  558. $mail->copyMessage(1, 'justARandomFolder');
  559. } catch (Exception $e) {
  560. return; // ok
  561. }
  562. $this->fail('no error while copying to wrong folder');
  563. }
  564. public function testSetFlags()
  565. {
  566. $mail = new Zend_Mail_Storage_Imap($this->_params);
  567. $mail->setFlags(1, array(Zend_Mail_Storage::FLAG_SEEN));
  568. $message = $mail->getMessage(1);
  569. $this->assertTrue($message->hasFlag(Zend_Mail_Storage::FLAG_SEEN));
  570. $this->assertFalse($message->hasFlag(Zend_Mail_Storage::FLAG_FLAGGED));
  571. $mail->setFlags(1, array(Zend_Mail_Storage::FLAG_SEEN, Zend_Mail_Storage::FLAG_FLAGGED));
  572. $message = $mail->getMessage(1);
  573. $this->assertTrue($message->hasFlag(Zend_Mail_Storage::FLAG_SEEN));
  574. $this->assertTrue($message->hasFlag(Zend_Mail_Storage::FLAG_FLAGGED));
  575. $mail->setFlags(1, array(Zend_Mail_Storage::FLAG_FLAGGED));
  576. $message = $mail->getMessage(1);
  577. $this->assertFalse($message->hasFlag(Zend_Mail_Storage::FLAG_SEEN));
  578. $this->assertTrue($message->hasFlag(Zend_Mail_Storage::FLAG_FLAGGED));
  579. $mail->setFlags(1, array('myflag'));
  580. $message = $mail->getMessage(1);
  581. $this->assertFalse($message->hasFlag(Zend_Mail_Storage::FLAG_SEEN));
  582. $this->assertFalse($message->hasFlag(Zend_Mail_Storage::FLAG_FLAGGED));
  583. $this->assertTrue($message->hasFlag('myflag'));
  584. try {
  585. $mail->setFlags(1, array(Zend_Mail_Storage::FLAG_RECENT));
  586. } catch (Exception $e) {
  587. return; // ok
  588. }
  589. $this->fail('should not be able to set recent flag');
  590. }
  591. public function testCapability()
  592. {
  593. $protocol = new Zend_Mail_Protocol_Imap($this->_params['host']);
  594. $protocol->login($this->_params['user'], $this->_params['password']);
  595. $capa = $protocol->capability();
  596. $this->assertTrue(is_array($capa));
  597. $this->assertEquals($capa[0], 'CAPABILITY');
  598. }
  599. public function testSelect()
  600. {
  601. $protocol = new Zend_Mail_Protocol_Imap($this->_params['host']);
  602. $protocol->login($this->_params['user'], $this->_params['password']);
  603. $status = $protocol->select('INBOX');
  604. $this->assertTrue(is_array($status['flags']));
  605. $this->assertEquals($status['exists'], 7);
  606. }
  607. public function testExamine()
  608. {
  609. $protocol = new Zend_Mail_Protocol_Imap($this->_params['host']);
  610. $protocol->login($this->_params['user'], $this->_params['password']);
  611. $status = $protocol->examine('INBOX');
  612. $this->assertTrue(is_array($status['flags']));
  613. $this->assertEquals($status['exists'], 7);
  614. }
  615. public function testClosedSocketNewlineToken()
  616. {
  617. $protocol = new Zend_Mail_Protocol_Imap($this->_params['host']);
  618. $protocol->login($this->_params['user'], $this->_params['password']);
  619. $protocol->logout();
  620. try {
  621. $protocol->select("foo\nbar");
  622. } catch (Exception $e) {
  623. return; // ok
  624. }
  625. $this->fail('no exception while using procol with closed socket');
  626. }
  627. public function testEscaping()
  628. {
  629. $protocol = new Zend_Mail_Protocol_Imap();
  630. $this->assertEquals($protocol->escapeString('foo'), '"foo"');
  631. $this->assertEquals($protocol->escapeString('f\\oo'), '"f\\\\oo"');
  632. $this->assertEquals($protocol->escapeString('f"oo'), '"f\\"oo"');
  633. $this->assertEquals($protocol->escapeString('foo', 'bar'), array('"foo"', '"bar"'));
  634. $this->assertEquals($protocol->escapeString("f\noo"), array('{4}', "f\noo"));
  635. $this->assertEquals($protocol->escapeList(array('foo')), '(foo)');
  636. $this->assertEquals($protocol->escapeList(array(array('foo'))), '((foo))');
  637. $this->assertEquals($protocol->escapeList(array('foo', 'bar')), '(foo bar)');
  638. }
  639. public function testFetch()
  640. {
  641. $protocol = new Zend_Mail_Protocol_Imap($this->_params['host']);
  642. $protocol->login($this->_params['user'], $this->_params['password']);
  643. $protocol->select('INBOX');
  644. $range = array_combine(range(1, 7), range(1, 7));
  645. $this->assertEquals($protocol->fetch('UID', 1, INF), $range);
  646. $this->assertEquals($protocol->fetch('UID', 1, 7), $range);
  647. $this->assertEquals($protocol->fetch('UID', range(1, 7)), $range);
  648. $this->assertTrue(is_numeric($protocol->fetch('UID', 1)));
  649. $result = $protocol->fetch(array('UID', 'FLAGS'), 1, INF);
  650. foreach ($result as $k => $v) {
  651. $this->assertEquals($k, $v['UID']);
  652. $this->assertTrue(is_array($v['FLAGS']));
  653. }
  654. try {
  655. $protocol->fetch('UID', 99);
  656. } catch (Exception $e) {
  657. return; // ok
  658. }
  659. $this->fail('no exception while fetching message');
  660. }
  661. public function testStore()
  662. {
  663. $protocol = new Zend_Mail_Protocol_Imap($this->_params['host']);
  664. $protocol->login($this->_params['user'], $this->_params['password']);
  665. $protocol->select('INBOX');
  666. $this->assertTrue($protocol->store(array('\Flagged'), 1));
  667. $this->assertTrue($protocol->store(array('\Flagged'), 1, null, '-'));
  668. $this->assertTrue($protocol->store(array('\Flagged'), 1, null, '+'));
  669. $result = $protocol->store(array('\Flagged'), 1, null, '', false);
  670. $this->assertTrue(in_array('\Flagged', $result[1]));
  671. $result = $protocol->store(array('\Flagged'), 1, null, '-', false);
  672. $this->assertFalse(in_array('\Flagged', $result[1]));
  673. $result = $protocol->store(array('\Flagged'), 1, null, '+', false);
  674. $this->assertTrue(in_array('\Flagged', $result[1]));
  675. }
  676. public function testMove()
  677. {
  678. $mail = new Zend_Mail_Storage_Imap($this->_params);
  679. $mail->selectFolder('subfolder/test');
  680. $toCount = $mail->countMessages();
  681. $mail->selectFolder('INBOX');
  682. $fromCount = $mail->countMessages();
  683. $mail->moveMessage(1, 'subfolder/test');
  684. $this->assertEquals($fromCount - 1, $mail->countMessages());
  685. $mail->selectFolder('subfolder/test');
  686. $this->assertEquals($toCount + 1, $mail->countMessages());
  687. }
  688. public function testCountFlags()
  689. {
  690. $mail = new Zend_Mail_Storage_Imap($this->_params);
  691. foreach ($mail as $id => $message) {
  692. $mail->setFlags($id, array());
  693. }
  694. $this->assertEquals($mail->countMessages(Zend_Mail_Storage::FLAG_SEEN), 0);
  695. $this->assertEquals($mail->countMessages(Zend_Mail_Storage::FLAG_ANSWERED), 0);
  696. $this->assertEquals($mail->countMessages(Zend_Mail_Storage::FLAG_FLAGGED), 0);
  697. $mail->setFlags(1, array(Zend_Mail_Storage::FLAG_SEEN, Zend_Mail_Storage::FLAG_ANSWERED));
  698. $mail->setFlags(2, array(Zend_Mail_Storage::FLAG_SEEN));
  699. $this->assertEquals($mail->countMessages(Zend_Mail_Storage::FLAG_SEEN), 2);
  700. $this->assertEquals($mail->countMessages(Zend_Mail_Storage::FLAG_ANSWERED), 1);
  701. $this->assertEquals($mail->countMessages(array(Zend_Mail_Storage::FLAG_SEEN, Zend_Mail_Storage::FLAG_ANSWERED)), 1);
  702. $this->assertEquals($mail->countMessages(array(Zend_Mail_Storage::FLAG_SEEN, Zend_Mail_Storage::FLAG_FLAGGED)), 0);
  703. $this->assertEquals($mail->countMessages(Zend_Mail_Storage::FLAG_FLAGGED), 0);
  704. }
  705. }