svn:eol-style set to 'native'
[mailer.git] / inc / phpmailer / test / phpmailer_test.php
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>