File:
1.14.0a/server/test/phpmailer_test.php (
View as Code)
1: 2: /*******************
3: Unit Test
4: Type: phpmailer class
5: ********************/
6:
7: $INCLUDE_DIR = "../";
8:
9: require("phpunit.php");
10: require($INCLUDE_DIR . "class.phpmailer.php");
11: error_reporting(E_ALL);
12:
13: /**
14: * Performs authentication tests
15: */
16: class phpmailerTest extends TestCase
17: {
18: /**
19: * Holds the default phpmailer instance.
20: * @private
21: * @type object
22: */
23: var $Mail = false;
24:
25: /**
26: * Holds the SMTP mail host.
27: * @public
28: * @type string
29: */
30: var $Host = "";
31:
32: /**
33: * Holds the change log.
34: * @private
35: * @type string array
36: */
37: var $ChangeLog = array();
38:
39: /**
40: * Holds the note log.
41: * @private
42: * @type string array
43: */
44: var $NoteLog = array();
45:
46: /**
47: * Class constuctor.
48: */
49: function phpmailerTest($name) {
50: /* must define this constructor */
51: $this->TestCase( $name );
52: }
53:
54: /**
55: * Run before each test is started.
56: */
57: function setUp() {
58: global $global_vars;
59: global $INCLUDE_DIR;
60:
61: $this->Mail = new PHPMailer();
62:
63: $this->Mail->Priority = 3;
64: $this->Mail->Encoding = "8bit";
65: $this->Mail->CharSet = "iso-8859-1";
66: $this->Mail->From = "unit_test@phpmailer.sf.net";
67: $this->Mail->FromName = "Unit Tester";
68: $this->Mail->Sender = "";
69: $this->Mail->Subject = "Unit Test";
70: $this->Mail->Body = "";
71: $this->Mail->AltBody = "";
72: $this->Mail->WordWrap = 0;
73: $this->Mail->Host = $global_vars["mail_host"];
74: $this->Mail->Port = 25;
75: $this->Mail->Helo = "localhost.localdomain";
76: $this->Mail->SMTPAuth = false;
77: $this->Mail->Username = "";
78: $this->Mail->Password = "";
79: $this->Mail->PluginDir = $INCLUDE_DIR;
80: $this->Mail->AddReplyTo("no_reply@phpmailer.sf.net", "Reply Guy");
81: $this->Mail->Sender = "unit_test@phpmailer.sf.net";
82:
83: if(strlen($this->Mail->Host) > 0)
84: $this->Mail->Mailer = "smtp";
85: else
86: {
87: $this->Mail->Mailer = "mail";
88: $this->Sender = "unit_test@phpmailer.sf.net";
89: }
90:
91: global $global_vars;
92: $this->SetAddress($global_vars["mail_to"], "Test User");
93: if(strlen($global_vars["mail_cc"]) > 0)
94: $this->SetAddress($global_vars["mail_cc"], "Carbon User", "cc");
95: }
96:
97: /**
98: * Run after each test is completed.
99: */
100: function tearDown() {
101: // Clean global variables
102: $this->Mail = NULL;
103: $this->ChangeLog = array();
104: $this->NoteLog = array();
105: }
106:
107:
108: /**
109: * Build the body of the message in the appropriate format.
110: * @private
111: * @returns void
112: */
113: function BuildBody() {
114: $this->CheckChanges();
115:
116: // Determine line endings for message
117: if($this->Mail->ContentType == "text/html" || strlen($this->Mail->AltBody) > 0)
118: {
119: $eol = "
";
120: $bullet = "";
121: $bullet_start = "122: $bullet_end = "";
123: }
124: else
125: {
126: $eol = "\n";
127: $bullet = " - ";
128: $bullet_start = "";
129: $bullet_end = "";
130: }
131:
132: $ReportBody = "";
133:
134: $ReportBody .= "---------------------" . $eol;
135: $ReportBody .= "Unit Test Information" . $eol;
136: $ReportBody .= "---------------------" . $eol;
137: $ReportBody .= "phpmailer version: " . $this->Mail->Version . $eol;
138: $ReportBody .= "Content Type: " . $this->Mail->ContentType . $eol;
139:
140: if(strlen($this->Mail->Host) > 0)
141: $ReportBody .= "Host: " . $this->Mail->Host . $eol;
142:
143: // If attachments then create an attachment list
144: if(count($this->Mail->attachment) > 0)
145: {
146: $ReportBody .= "Attachments:" . $eol;
147: $ReportBody .= $bullet_start;
148: for($i = 0; $i < count($this->Mail->attachment); $i++)
149: {
150: $ReportBody .= $bullet . "Name: " . $this->Mail->attachment[$i][1] . ", ";
151: $ReportBody .= "Encoding: " . $this->Mail->attachment[$i][3] . ", ";
152: $ReportBody .= "Type: " . $this->Mail->attachment[$i][4] . $eol;
153: }
154: $ReportBody .= $bullet_end . $eol;
155: }
156:
157: // If there are changes then list them
158: if(count($this->ChangeLog) > 0)
159: {
160: $ReportBody .= "Changes" . $eol;
161: $ReportBody .= "-------" . $eol;
162:
163: $ReportBody .= $bullet_start;
164: for($i = 0; $i < count($this->ChangeLog); $i++)
165: {
166: $ReportBody .= $bullet . $this->ChangeLog[$i][0] . " was changed to [" .
167: $this->ChangeLog[$i][1] . "]" . $eol;
168: }
169: $ReportBody .= $bullet_end . $eol . $eol;
170: }
171:
172: // If there are notes then list them
173: if(count($this->NoteLog) > 0)
174: {
175: $ReportBody .= "Notes" . $eol;
176: $ReportBody .= "-----" . $eol;
177:
178: $ReportBody .= $bullet_start;
179: for($i = 0; $i < count($this->NoteLog); $i++)
180: {
181: $ReportBody .= $bullet . $this->NoteLog[$i] . $eol;
182: }
183: $ReportBody .= $bullet_end;
184: }
185:
186: // Re-attach the original body
187: $this->Mail->Body .= $eol . $eol . $ReportBody;
188: }
189:
190: /**
191: * Check which default settings have been changed for the report.
192: * @private
193: * @returns void
194: */
195: function CheckChanges() {
196: if($this->Mail->Priority != 3)
197: $this->AddChange("Priority", $this->Mail->Priority);
198: if($this->Mail->Encoding != "8bit")
199: $this->AddChange("Encoding", $this->Mail->Encoding);
200: if($this->Mail->CharSet != "iso-8859-1")
201: $this->AddChange("CharSet", $this->Mail->CharSet);
202: if($this->Mail->Sender != "")
203: $this->AddChange("Sender", $this->Mail->Sender);
204: if($this->Mail->WordWrap != 0)
205: $this->AddChange("WordWrap", $this->Mail->WordWrap);
206: if($this->Mail->Mailer != "mail")
207: $this->AddChange("Mailer", $this->Mail->Mailer);
208: if($this->Mail->Port != 25)
209: $this->AddChange("Port", $this->Mail->Port);
210: if($this->Mail->Helo != "localhost.localdomain")
211: $this->AddChange("Helo", $this->Mail->Helo);
212: if($this->Mail->SMTPAuth)
213: $this->AddChange("SMTPAuth", "true");
214: }
215:
216: /**
217: * Adds a change entry.
218: * @private
219: * @returns void
220: */
221: function AddChange($sName, $sNewValue) {
222: $cur = count($this->ChangeLog);
223: $this->ChangeLog[$cur][0] = $sName;
224: $this->ChangeLog[$cur][1] = $sNewValue;
225: }
226:
227: /**
228: * Adds a simple note to the message.
229: * @public
230: * @returns void
231: */
232: function AddNote($sValue) {
233: $this->NoteLog[] = $sValue;
234: }
235:
236: /**
237: * Adds all of the addresses
238: * @public
239: * @returns void
240: */
241: function SetAddress($sAddress, $sName = "", $sType = "to") {
242: switch($sType)
243: {
244: case "to":
245: $this->Mail->AddAddress($sAddress, $sName);
246: break;
247: case "cc":
248: $this->Mail->AddCC($sAddress, $sName);
249: break;
250: case "bcc":
251: $this->Mail->AddBCC($sAddress, $sName);
252: break;
253: }
254: }
255:
256: /////////////////////////////////////////////////
257: // UNIT TESTS
258: /////////////////////////////////////////////////
259:
260: /**
261: * Try a plain message.
262: */
263: function test_WordWrap() {
264:
265: $this->Mail->WordWrap = 40;
266: $my_body = "Here is the main body of this message. It should " .
267: "be quite a few lines. It should be wrapped at the " .
268: "40 characters. Make sure that it is.";
269: $nBodyLen = strlen($my_body);
270: $my_body .= "\n\nThis is the above body length: " . $nBodyLen;
271:
272: $this->Mail->Body = $my_body;
273: $this->Mail->Subject .= ": Wordwrap";
274:
275: $this->BuildBody();
276: $this->assert($this->Mail->Send(), $this->Mail->ErrorInfo);
277: }
278:
279: /**
280: * Try a plain message.
281: */
282: function test_Low_Priority() {
283:
284: $this->Mail->Priority = 5;
285: $this->Mail->Body = "Here is the main body. There should be " .
286: "a reply to address in this message.";
287: $this->Mail->Subject .= ": Low Priority";
288: $this->Mail->AddReplyTo("nobody@nobody.com", "Nobody (Unit Test)");
289:
290: $this->BuildBody();
291: $this->assert($this->Mail->Send(), $this->Mail->ErrorInfo);
292: }
293:
294: /**
295: * Simple plain file attachment test.
296: */
297: function test_Multiple_Plain_FileAttachment() {
298:
299: $this->Mail->Body = "Here is the text body";
300: $this->Mail->Subject .= ": Plain + Multiple FileAttachments";
301:
302: if(!$this->Mail->AddAttachment("test.png"))
303: {
304: $this->assert(false, $this->Mail->ErrorInfo);
305: return;
306: }
307:
308: if(!$this->Mail->AddAttachment("phpmailer_test.php", "test.txt"))
309: {
310: $this->assert(false, $this->Mail->ErrorInfo);
311: return;
312: }
313:
314: $this->BuildBody();
315: $this->assert($this->Mail->Send(), $this->Mail->ErrorInfo);
316: }
317:
318: /**
319: * Simple plain string attachment test.
320: */
321: function test_Plain_StringAttachment() {
322:
323: $this->Mail->Body = "Here is the text body";
324: $this->Mail->Subject .= ": Plain + StringAttachment";
325:
326: $sAttachment = "These characters are the content of the " .
327: "string attachment.\nThis might be taken from a ".
328: "database or some other such thing. ";
329:
330: $this->Mail->AddStringAttachment($sAttachment, "string_attach.txt");
331:
332: $this->BuildBody();
333: $this->assert($this->Mail->Send(), $this->Mail->ErrorInfo);
334: }
335:
336: /**
337: * Plain quoted-printable message.
338: */
339: function test_Quoted_Printable() {
340:
341: $this->Mail->Body = "Here is the main body";
342: $this->Mail->Subject .= ": Plain + Quoted-printable";
343: $this->Mail->Encoding = "quoted-printable";
344:
345: $this->BuildBody();
346: $this->assert($this->Mail->Send(), $this->Mail->ErrorInfo);
347: }
348:
349: /**
350: * Try a plain message.
351: */
352: function test_Html() {
353:
354: $this->Mail->IsHTML(true);
355: $this->Mail->Subject .= ": HTML only";
356:
357: $this->Mail->Body = "This is a test message written in HTML. " .
358: "Go to " .
359: "http://phpmailer.sourceforge.net/ for new versions of " .
360: "phpmailer. Thank you!";
361:
362: $this->BuildBody();
363: $this->assert($this->Mail->Send(), $this->Mail->ErrorInfo);
364: }
365:
366: /**
367: * Simple HTML and attachment test
368: */
369: function test_HTML_Attachment() {
370:
371: $this->Mail->Body = "This is the HTML part of the email.";
372: $this->Mail->Subject .= ": HTML + Attachment";
373: $this->Mail->IsHTML(true);
374:
375: if(!$this->Mail->AddAttachment("phpmailer_test.php", "test_attach.txt"))
376: {
377: $this->assert(false, $this->Mail->ErrorInfo);
378: return;
379: }
380:
381: $this->BuildBody();
382: $this->assert($this->Mail->Send(), $this->Mail->ErrorInfo);
383: }
384:
385: /**
386: * An embedded attachment test.
387: */
388: function test_Embedded_Image() {
389:
390: $this->Mail->Body = "Embedded Image: " .
391: "Here is an image!";
392: $this->Mail->Subject .= ": Embedded Image";
393: $this->Mail->IsHTML(true);
394:
395: if(!$this->Mail->AddEmbeddedImage("test.png", "my-attach", "test.png",
396: "base64", "image/png"))
397: {
398: $this->assert(false, $this->Mail->ErrorInfo);
399: return;
400: }
401:
402: $this->BuildBody();
403: $this->assert($this->Mail->Send(), $this->Mail->ErrorInfo);
404: }
405:
406: /**
407: * An embedded attachment test.
408: */
409: function test_Multi_Embedded_Image() {
410:
411: $this->Mail->Body = "Embedded Image: " .
412: "Here is an image!";
413: $this->Mail->Subject .= ": Embedded Image + Attachment";
414: $this->Mail->IsHTML(true);
415:
416: if(!$this->Mail->AddEmbeddedImage("test.png", "my-attach", "test.png",
417: "base64", "image/png"))
418: {
419: $this->assert(false, $this->Mail->ErrorInfo);
420: return;
421: }
422:
423: if(!$this->Mail->AddAttachment("phpmailer_test.php", "test.txt"))
424: {
425: $this->assert(false, $this->Mail->ErrorInfo);
426: return;
427: }
428:
429: $this->BuildBody();
430: $this->assert($this->Mail->Send(), $this->Mail->ErrorInfo);
431: }
432:
433: /**
434: * Simple multipart/alternative test.
435: */
436: function test_AltBody() {
437:
438: $this->Mail->Body = "This is the HTML part of the email.";
439: $this->Mail->AltBody = "Here is the text body of this message. " .
440: "It should be quite a few lines. It should be wrapped at the " .
441: "40 characters. Make sure that it is.";
442: $this->Mail->WordWrap = 40;
443: $this->AddNote("This is a mulipart alternative email");
444: $this->Mail->Subject .= ": AltBody + Word Wrap";
445:
446: $this->BuildBody();
447: $this->assert($this->Mail->Send(), $this->Mail->ErrorInfo);
448: }
449:
450: /**
451: * Simple HTML and attachment test
452: */
453: function test_AltBody_Attachment() {
454:
455: $this->Mail->Body = "This is the HTML part of the email.";
456: $this->Mail->AltBody = "This is the text part of the email.";
457: $this->Mail->Subject .= ": AltBody + Attachment";
458: $this->Mail->IsHTML(true);
459:
460: if(!$this->Mail->AddAttachment("phpmailer_test.php", "test_attach.txt"))
461: {
462: $this->assert(false, $this->Mail->ErrorInfo);
463: return;
464: }
465:
466: $this->BuildBody();
467: $this->assert($this->Mail->Send(), $this->Mail->ErrorInfo);
468:
469: $fp = fopen("message.txt", "w");
470: fwrite($fp, $this->Mail->CreateHeader() . $this->Mail->CreateBody());
471: fclose($fp);
472: }
473:
474: function test_MultipleSend() {
475: $this->Mail->Body = "Sending two messages without keepalive";
476: $this->BuildBody();
477: $subject = $this->Mail->Subject;
478:
479: $this->Mail->Subject = $subject . ": SMTP 1";
480: $this->assert($this->Mail->Send(), $this->Mail->ErrorInfo);
481:
482: $this->Mail->Subject = $subject . ": SMTP 2";
483: $this->assert($this->Mail->Send(), $this->Mail->ErrorInfo);
484: }
485:
486: function test_SmtpKeepAlive() {
487: $this->Mail->Body = "This was done using the SMTP keep-alive.";
488: $this->BuildBody();
489: $subject = $this->Mail->Subject;
490:
491: $this->Mail->SMTPKeepAlive = true;
492: $this->Mail->Subject = $subject . ": SMTP keep-alive 1";
493: $this->assert($this->Mail->Send(), $this->Mail->ErrorInfo);
494:
495: $this->Mail->Subject = $subject . ": SMTP keep-alive 2";
496: $this->assert($this->Mail->Send(), $this->Mail->ErrorInfo);
497: $this->Mail->SmtpClose();
498: }
499:
500: /**
501: * Tests this denial of service attack:
502: * http://www.cybsec.com/vuln/PHPMailer-DOS.pdf
503: */
504: function test_DenialOfServiceAttack() {
505: $this->Mail->Body = "This should no longer cause a denial of service.";
506: $this->BuildBody();
507:
508: $this->Mail->Subject = str_repeat("A", 998);
509: $this->assert($this->Mail->Send(), $this->Mail->ErrorInfo);
510: }
511:
512: function test_Error() {
513: $this->Mail->Subject .= ": This should be sent";
514: $this->BuildBody();
515: $this->Mail->ClearAllRecipients(); // no addresses should cause an error
516: $this->assert($this->Mail->IsError() == false, "Error found");
517: $this->assert($this->Mail->Send() == false, "Send succeeded");
518: $this->assert($this->Mail->IsError(), "No error found");
519: $this->assertEquals('You must provide at least one ' .
520: 'recipient email address.', $this->Mail->ErrorInfo);
521: $this->Mail->AddAddress(get("mail_to"));
522: $this->assert($this->Mail->Send(), "Send failed");
523: }
524: }
525:
526: /**
527: * Create and run test instance.
528: */
529:
530: if(isset($HTTP_GET_VARS))
531: $global_vars = $HTTP_GET_VARS;
532: else
533: $global_vars = $_REQUEST;
534:
535: if(isset($global_vars["submitted"]))
536: {
537: echo "Test results:
";
538: $suite = new TestSuite( "phpmailerTest" );
539:
540: $testRunner = new TestRunner;
541: $testRunner->run($suite);
542: echo "
";
543: }
544:
545: function get($sName) {
546: global $global_vars;
547: if(isset($global_vars[$sName]))
548: return $global_vars[$sName];
549: else
550: return "";
551: }
552:
553: ?>
554:
555:
556:
557: phpmailer Unit Test
558: By entering a SMTP hostname it will automatically perform tests with SMTP.
559:
560: 561:
562: To Address: "/>
563:
564: Cc Address: "/>
565:
566: SMTP Hostname: "/>
567:
568:
569:
570:
571:
572:
573: