File: 1.04.5a/server/test/phpmailer_test.php (View as HTML)

  1: <?php
  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 = "<br/>";
120:             $bullet = "<li>";
121:             $bullet_start = "<ul>";
122:             $bullet_end = "</ul>";
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 <b>test message</b> written in HTML. </br>" .
358:                             "Go to <a href=\"http://phpmailer.sourceforge.net/\">" .
359:                             "http://phpmailer.sourceforge.net/</a> for new versions of " .
360:                             "phpmailer.  <p/> 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 <b>HTML</b> 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: <img alt=\"phpmailer\" src=\"cid:my-attach\">" .
391:                      "Here is an image!</a>";
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: <img alt=\"phpmailer\" src=\"cid:my-attach\">" .
412:                      "Here is an image!</a>";
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 <b>HTML</b> 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 <b>HTML</b> 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:<br>";
538:     $suite = new TestSuite( "phpmailerTest" );
539:     
540:     $testRunner = new TestRunner;
541:     $testRunner->run($suite);
542:     echo "<hr noshade/>";
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: <html>
556: <body>
557: <h3>phpmailer Unit Test</h3>
558: By entering a SMTP hostname it will automatically perform tests with SMTP.
559: 
560: <form name="phpmailer_unit" action="phpmailer_test.php" method="get">
561: <input type="hidden" name="submitted" value="1"/>
562: To Address: <input type="text" size="50" name="mail_to" value="<?php echo get("mail_to"); ?>"/>
563: <br/>
564: Cc Address: <input type="text" size="50" name="mail_cc" value="<?php echo get("mail_cc"); ?>"/>
565: <br/>
566: SMTP Hostname: <input type="text" size="50" name="mail_host" value="<?php echo get("mail_host"); ?>"/>
567: <p/>
568: <input type="submit" value="Run Test"/>
569: 
570: </form>
571: </body>
572: </html>
573: