Completed
Branch develop (80d269)
by
unknown
22:48
created
htdocs/includes/nusoap/lib/Mail/mime.php 1 patch
Indentation   +1378 added lines, -1378 removed lines patch added patch discarded remove patch
@@ -94,852 +94,852 @@  discard block
 block discarded – undo
94 94
  */
95 95
 class Mail_mime
96 96
 {
97
-    /**
98
-     * Contains the plain text part of the email
99
-     *
100
-     * @var string
101
-     * @access private
102
-     */
103
-    var $_txtbody;
104
-
105
-    /**
106
-     * Contains the html part of the email
107
-     *
108
-     * @var string
109
-     * @access private
110
-     */
111
-    var $_htmlbody;
112
-
113
-    /**
114
-     * list of the attached images
115
-     *
116
-     * @var array
117
-     * @access private
118
-     */
119
-    var $_html_images = array();
120
-
121
-    /**
122
-     * list of the attachements
123
-     *
124
-     * @var array
125
-     * @access private
126
-     */
127
-    var $_parts = array();
128
-
129
-    /**
130
-     * Headers for the mail
131
-     *
132
-     * @var array
133
-     * @access private
134
-     */
135
-    var $_headers = array();
136
-
137
-    /**
138
-     * Build parameters
139
-     *
140
-     * @var array
141
-     * @access private
142
-     */
143
-    var $_build_params = array(
144
-        // What encoding to use for the headers
145
-        // Options: quoted-printable or base64
146
-        'head_encoding' => 'quoted-printable',
147
-        // What encoding to use for plain text
148
-        // Options: 7bit, 8bit, base64, or quoted-printable
149
-        'text_encoding' => 'quoted-printable',
150
-        // What encoding to use for html
151
-        // Options: 7bit, 8bit, base64, or quoted-printable
152
-        'html_encoding' => 'quoted-printable',
153
-        // The character set to use for html
154
-        'html_charset'  => 'ISO-8859-1',
155
-        // The character set to use for text
156
-        'text_charset'  => 'ISO-8859-1',
157
-        // The character set to use for headers
158
-        'head_charset'  => 'ISO-8859-1',
159
-        // End-of-line sequence
160
-        'eol'           => "\r\n",
161
-        // Delay attachment files IO until building the message
162
-        'delay_file_io' => false
163
-    );
164
-
165
-    /**
166
-     * Constructor function
167
-     *
168
-     * @param mixed $params Build parameters that change the way the email
169
-     *                      is built. Should be an associative array.
170
-     *                      See $_build_params.
171
-     *
172
-     * @return void
173
-     * @access public
174
-     */
175
-    function Mail_mime($params = array())
176
-    {
177
-        // Backward-compatible EOL setting
178
-        if (is_string($params)) {
179
-            $this->_build_params['eol'] = $params;
180
-        } else if (defined('MAIL_MIME_CRLF') && !isset($params['eol'])) {
181
-            $this->_build_params['eol'] = MAIL_MIME_CRLF;
182
-        }
183
-
184
-        // Update build parameters
185
-        if (!empty($params) && is_array($params)) {
186
-            while (list($key, $value) = each($params)) {
187
-                $this->_build_params[$key] = $value;
188
-            }
189
-        }
190
-    }
191
-
192
-    /**
193
-     * Set build parameter value
194
-     *
195
-     * @param string $name  Parameter name
196
-     * @param string $value Parameter value
197
-     *
198
-     * @return void
199
-     * @access public
200
-     * @since 1.6.0
201
-     */
202
-    function setParam($name, $value)
203
-    {
204
-        $this->_build_params[$name] = $value;
205
-    }
206
-
207
-    /**
208
-     * Get build parameter value
209
-     *
210
-     * @param string $name Parameter name
211
-     *
212
-     * @return mixed Parameter value
213
-     * @access public
214
-     * @since 1.6.0
215
-     */
216
-    function getParam($name)
217
-    {
218
-        return isset($this->_build_params[$name]) ? $this->_build_params[$name] : null;
219
-    }
220
-
221
-    /**
222
-     * Accessor function to set the body text. Body text is used if
223
-     * it's not an html mail being sent or else is used to fill the
224
-     * text/plain part that emails clients who don't support
225
-     * html should show.
226
-     *
227
-     * @param string $data   Either a string or
228
-     *                       the file name with the contents
229
-     * @param bool   $isfile If true the first param should be treated
230
-     *                       as a file name, else as a string (default)
231
-     * @param bool   $append If true the text or file is appended to
232
-     *                       the existing body, else the old body is
233
-     *                       overwritten
234
-     *
235
-     * @return mixed         True on success or PEAR_Error object
236
-     * @access public
237
-     */
238
-    function setTXTBody($data, $isfile = false, $append = false)
239
-    {
240
-        if (!$isfile) {
241
-            if (!$append) {
242
-                $this->_txtbody = $data;
243
-            } else {
244
-                $this->_txtbody .= $data;
245
-            }
246
-        } else {
247
-            $cont = $this->_file2str($data);
248
-            if ($this->_isError($cont)) {
249
-                return $cont;
250
-            }
251
-            if (!$append) {
252
-                $this->_txtbody = $cont;
253
-            } else {
254
-                $this->_txtbody .= $cont;
255
-            }
256
-        }
257
-
258
-        return true;
259
-    }
260
-
261
-    /**
262
-     * Get message text body
263
-     *
264
-     * @return string Text body
265
-     * @access public
266
-     * @since 1.6.0
267
-     */
268
-    function getTXTBody()
269
-    {
270
-        return $this->_txtbody;
271
-    }
272
-
273
-    /**
274
-     * Adds a html part to the mail.
275
-     *
276
-     * @param string $data   Either a string or the file name with the
277
-     *                       contents
278
-     * @param bool   $isfile A flag that determines whether $data is a
279
-     *                       filename, or a string(false, default)
280
-     *
281
-     * @return bool          True on success
282
-     * @access public
283
-     */
284
-    function setHTMLBody($data, $isfile = false)
285
-    {
286
-        if (!$isfile) {
287
-            $this->_htmlbody = $data;
288
-        } else {
289
-            $cont = $this->_file2str($data);
290
-            if ($this->_isError($cont)) {
291
-                return $cont;
292
-            }
293
-            $this->_htmlbody = $cont;
294
-        }
295
-
296
-        return true;
297
-    }
298
-
299
-    /**
300
-     * Get message HTML body
301
-     *
302
-     * @return string HTML body
303
-     * @access public
304
-     * @since 1.6.0
305
-     */
306
-    function getHTMLBody()
307
-    {
308
-        return $this->_htmlbody;
309
-    }
310
-
311
-    /**
312
-     * Adds an image to the list of embedded images.
313
-     *
314
-     * @param string $file       The image file name OR image data itself
315
-     * @param string $c_type     The content type
316
-     * @param string $name       The filename of the image.
317
-     *                           Only used if $file is the image data.
318
-     * @param bool   $isfile     Whether $file is a filename or not.
319
-     *                           Defaults to true
320
-     * @param string $content_id Desired Content-ID of MIME part
321
-     *                           Defaults to generated unique ID
322
-     *
323
-     * @return bool          True on success
324
-     * @access public
325
-     */
326
-    function addHTMLImage($file,
327
-        $c_type='application/octet-stream',
328
-        $name = '',
329
-        $isfile = true,
330
-        $content_id = null
331
-    ) {
332
-        $bodyfile = null;
333
-
334
-        if ($isfile) {
335
-            // Don't load file into memory
336
-            if ($this->_build_params['delay_file_io']) {
337
-                $filedata = null;
338
-                $bodyfile = $file;
339
-            } else {
340
-                if ($this->_isError($filedata = $this->_file2str($file))) {
341
-                    return $filedata;
342
-                }
343
-            }
344
-            $filename = ($name ? $name : $file);
345
-        } else {
346
-            $filedata = $file;
347
-            $filename = $name;
348
-        }
349
-
350
-        if (!$content_id) {
351
-            $content_id = preg_replace('/[^0-9a-zA-Z]/', '', uniqid(time(), true));
352
-        }
353
-
354
-        $this->_html_images[] = array(
355
-            'body'      => $filedata,
356
-            'body_file' => $bodyfile,
357
-            'name'      => $filename,
358
-            'c_type'    => $c_type,
359
-            'cid'       => $content_id
360
-        );
361
-
362
-        return true;
363
-    }
364
-
365
-    /**
366
-     * Adds a file to the list of attachments.
367
-     *
368
-     * @param string $file        The file name of the file to attach
369
-     *                            or the file contents itself
370
-     * @param string $c_type      The content type
371
-     * @param string $name        The filename of the attachment
372
-     *                            Only use if $file is the contents
373
-     * @param bool   $isfile      Whether $file is a filename or not. Defaults to true
374
-     * @param string $encoding    The type of encoding to use. Defaults to base64.
375
-     *                            Possible values: 7bit, 8bit, base64 or quoted-printable.
376
-     * @param string $disposition The content-disposition of this file
377
-     *                            Defaults to attachment.
378
-     *                            Possible values: attachment, inline.
379
-     * @param string $charset     The character set of attachment's content.
380
-     * @param string $language    The language of the attachment
381
-     * @param string $location    The RFC 2557.4 location of the attachment
382
-     * @param string $n_encoding  Encoding of the attachment's name in Content-Type
383
-     *                            By default filenames are encoded using RFC2231 method
384
-     *                            Here you can set RFC2047 encoding (quoted-printable
385
-     *                            or base64) instead
386
-     * @param string $f_encoding  Encoding of the attachment's filename
387
-     *                            in Content-Disposition header.
388
-     * @param string $description Content-Description header
389
-     * @param string $h_charset   The character set of the headers e.g. filename
390
-     *                            If not specified, $charset will be used
391
-     * @param array  $add_headers Additional part headers. Array keys can be in form
392
-     *                            of <header_name>:<parameter_name>
393
-     *
394
-     * @return mixed              True on success or PEAR_Error object
395
-     * @access public
396
-     */
397
-    function addAttachment($file,
398
-        $c_type      = 'application/octet-stream',
399
-        $name        = '',
400
-        $isfile      = true,
401
-        $encoding    = 'base64',
402
-        $disposition = 'attachment',
403
-        $charset     = '',
404
-        $language    = '',
405
-        $location    = '',
406
-        $n_encoding  = null,
407
-        $f_encoding  = null,
408
-        $description = '',
409
-        $h_charset   = null,
410
-        $add_headers = array()
411
-    ) {
412
-        $bodyfile = null;
413
-
414
-        if ($isfile) {
415
-            // Don't load file into memory
416
-            if ($this->_build_params['delay_file_io']) {
417
-                $filedata = null;
418
-                $bodyfile = $file;
419
-            } else {
420
-                if ($this->_isError($filedata = $this->_file2str($file))) {
421
-                    return $filedata;
422
-                }
423
-            }
424
-            // Force the name the user supplied, otherwise use $file
425
-            $filename = ($name ? $name : $this->_basename($file));
426
-        } else {
427
-            $filedata = $file;
428
-            $filename = $name;
429
-        }
430
-
431
-        if (!strlen($filename)) {
432
-            $msg = "The supplied filename for the attachment can't be empty";
433
-            return $this->_raiseError($msg);
434
-        }
435
-
436
-        $this->_parts[] = array(
437
-            'body'        => $filedata,
438
-            'body_file'   => $bodyfile,
439
-            'name'        => $filename,
440
-            'c_type'      => $c_type,
441
-            'charset'     => $charset,
442
-            'encoding'    => $encoding,
443
-            'language'    => $language,
444
-            'location'    => $location,
445
-            'disposition' => $disposition,
446
-            'description' => $description,
447
-            'add_headers' => $add_headers,
448
-            'name_encoding'     => $n_encoding,
449
-            'filename_encoding' => $f_encoding,
450
-            'headers_charset'   => $h_charset,
451
-        );
452
-
453
-        return true;
454
-    }
455
-
456
-    /**
457
-     * Get the contents of the given file name as string
458
-     *
459
-     * @param string $file_name Path of file to process
460
-     *
461
-     * @return string           Contents of $file_name
462
-     * @access private
463
-     */
464
-    function _file2str($file_name)
465
-    {
466
-        // Check state of file and raise an error properly
467
-        if (!file_exists($file_name)) {
468
-            return $this->_raiseError('File not found: ' . $file_name);
469
-        }
470
-        if (!is_file($file_name)) {
471
-            return $this->_raiseError('Not a regular file: ' . $file_name);
472
-        }
473
-        if (!is_readable($file_name)) {
474
-            return $this->_raiseError('File is not readable: ' . $file_name);
475
-        }
476
-
477
-        // Temporarily reset magic_quotes_runtime and read file contents
478
-        if ($magic_quote_setting = get_magic_quotes_runtime()) {
479
-            @ini_set('magic_quotes_runtime', 0);
480
-        }
481
-        $cont = file_get_contents($file_name);
482
-        if ($magic_quote_setting) {
483
-            @ini_set('magic_quotes_runtime', $magic_quote_setting);
484
-        }
485
-
486
-        return $cont;
487
-    }
488
-
489
-    /**
490
-     * Adds a text subpart to the mimePart object and
491
-     * returns it during the build process.
492
-     *
493
-     * @param mixed  &$obj The object to add the part to, or
494
-     *                     anything else if a new object is to be created.
495
-     * @param string $text The text to add.
496
-     *
497
-     * @return object      The text mimePart object
498
-     * @access private
499
-     */
500
-    function &_addTextPart(&$obj, $text = '')
501
-    {
502
-        $params['content_type'] = 'text/plain';
503
-        $params['encoding']     = $this->_build_params['text_encoding'];
504
-        $params['charset']      = $this->_build_params['text_charset'];
505
-        $params['eol']          = $this->_build_params['eol'];
506
-
507
-        if (is_object($obj)) {
508
-            $ret = $obj->addSubpart($text, $params);
509
-        } else {
510
-            $ret = new Mail_mimePart($text, $params);
511
-        }
512
-
513
-        return $ret;
514
-    }
515
-
516
-    /**
517
-     * Adds a html subpart to the mimePart object and
518
-     * returns it during the build process.
519
-     *
520
-     * @param mixed &$obj The object to add the part to, or
521
-     *                    anything else if a new object is to be created.
522
-     *
523
-     * @return object     The html mimePart object
524
-     * @access private
525
-     */
526
-    function &_addHtmlPart(&$obj)
527
-    {
528
-        $params['content_type'] = 'text/html';
529
-        $params['encoding']     = $this->_build_params['html_encoding'];
530
-        $params['charset']      = $this->_build_params['html_charset'];
531
-        $params['eol']          = $this->_build_params['eol'];
532
-
533
-        if (is_object($obj)) {
534
-            $ret = $obj->addSubpart($this->_htmlbody, $params);
535
-        } else {
536
-            $ret = new Mail_mimePart($this->_htmlbody, $params);
537
-        }
538
-
539
-        return $ret;
540
-    }
541
-
542
-    /**
543
-     * Creates a new mimePart object, using multipart/mixed as
544
-     * the initial content-type and returns it during the
545
-     * build process.
546
-     *
547
-     * @return object The multipart/mixed mimePart object
548
-     * @access private
549
-     */
550
-    function &_addMixedPart()
551
-    {
552
-        $params['content_type'] = 'multipart/mixed';
553
-        $params['eol']          = $this->_build_params['eol'];
554
-
555
-        // Create empty multipart/mixed Mail_mimePart object to return
556
-        $ret = new Mail_mimePart('', $params);
557
-        return $ret;
558
-    }
559
-
560
-    /**
561
-     * Adds a multipart/alternative part to a mimePart
562
-     * object (or creates one), and returns it during
563
-     * the build process.
564
-     *
565
-     * @param mixed &$obj The object to add the part to, or
566
-     *                    anything else if a new object is to be created.
567
-     *
568
-     * @return object     The multipart/mixed mimePart object
569
-     * @access private
570
-     */
571
-    function &_addAlternativePart(&$obj)
572
-    {
573
-        $params['content_type'] = 'multipart/alternative';
574
-        $params['eol']          = $this->_build_params['eol'];
575
-
576
-        if (is_object($obj)) {
577
-            $ret = $obj->addSubpart('', $params);
578
-        } else {
579
-            $ret = new Mail_mimePart('', $params);
580
-        }
581
-
582
-        return $ret;
583
-    }
584
-
585
-    /**
586
-     * Adds a multipart/related part to a mimePart
587
-     * object (or creates one), and returns it during
588
-     * the build process.
589
-     *
590
-     * @param mixed &$obj The object to add the part to, or
591
-     *                    anything else if a new object is to be created
592
-     *
593
-     * @return object     The multipart/mixed mimePart object
594
-     * @access private
595
-     */
596
-    function &_addRelatedPart(&$obj)
597
-    {
598
-        $params['content_type'] = 'multipart/related';
599
-        $params['eol']          = $this->_build_params['eol'];
600
-
601
-        if (is_object($obj)) {
602
-            $ret = $obj->addSubpart('', $params);
603
-        } else {
604
-            $ret = new Mail_mimePart('', $params);
605
-        }
606
-
607
-        return $ret;
608
-    }
609
-
610
-    /**
611
-     * Adds an html image subpart to a mimePart object
612
-     * and returns it during the build process.
613
-     *
614
-     * @param object &$obj  The mimePart to add the image to
615
-     * @param array  $value The image information
616
-     *
617
-     * @return object       The image mimePart object
618
-     * @access private
619
-     */
620
-    function &_addHtmlImagePart(&$obj, $value)
621
-    {
622
-        $params['content_type'] = $value['c_type'];
623
-        $params['encoding']     = 'base64';
624
-        $params['disposition']  = 'inline';
625
-        $params['filename']     = $value['name'];
626
-        $params['cid']          = $value['cid'];
627
-        $params['body_file']    = $value['body_file'];
628
-        $params['eol']          = $this->_build_params['eol'];
629
-
630
-        if (!empty($value['name_encoding'])) {
631
-            $params['name_encoding'] = $value['name_encoding'];
632
-        }
633
-        if (!empty($value['filename_encoding'])) {
634
-            $params['filename_encoding'] = $value['filename_encoding'];
635
-        }
636
-
637
-        $ret = $obj->addSubpart($value['body'], $params);
638
-        return $ret;
639
-    }
640
-
641
-    /**
642
-     * Adds an attachment subpart to a mimePart object
643
-     * and returns it during the build process.
644
-     *
645
-     * @param object &$obj  The mimePart to add the image to
646
-     * @param array  $value The attachment information
647
-     *
648
-     * @return object       The image mimePart object
649
-     * @access private
650
-     */
651
-    function &_addAttachmentPart(&$obj, $value)
652
-    {
653
-        $params['eol']          = $this->_build_params['eol'];
654
-        $params['filename']     = $value['name'];
655
-        $params['encoding']     = $value['encoding'];
656
-        $params['content_type'] = $value['c_type'];
657
-        $params['body_file']    = $value['body_file'];
658
-        $params['disposition']  = isset($value['disposition']) ? 
659
-                                  $value['disposition'] : 'attachment';
660
-
661
-        // content charset
662
-        if (!empty($value['charset'])) {
663
-            $params['charset'] = $value['charset'];
664
-        }
665
-        // headers charset (filename, description)
666
-        if (!empty($value['headers_charset'])) {
667
-            $params['headers_charset'] = $value['headers_charset'];
668
-        }
669
-        if (!empty($value['language'])) {
670
-            $params['language'] = $value['language'];
671
-        }
672
-        if (!empty($value['location'])) {
673
-            $params['location'] = $value['location'];
674
-        }
675
-        if (!empty($value['name_encoding'])) {
676
-            $params['name_encoding'] = $value['name_encoding'];
677
-        }
678
-        if (!empty($value['filename_encoding'])) {
679
-            $params['filename_encoding'] = $value['filename_encoding'];
680
-        }
681
-        if (!empty($value['description'])) {
682
-            $params['description'] = $value['description'];
683
-        }
684
-        if (is_array($value['add_headers'])) {
685
-            $params['headers'] = $value['add_headers'];
686
-        }
687
-
688
-        $ret = $obj->addSubpart($value['body'], $params);
689
-        return $ret;
690
-    }
691
-
692
-    /**
693
-     * Returns the complete e-mail, ready to send using an alternative
694
-     * mail delivery method. Note that only the mailpart that is made
695
-     * with Mail_Mime is created. This means that,
696
-     * YOU WILL HAVE NO TO: HEADERS UNLESS YOU SET IT YOURSELF 
697
-     * using the $headers parameter!
698
-     * 
699
-     * @param string $separation The separation between these two parts.
700
-     * @param array  $params     The Build parameters passed to the
701
-     *                           get() function. See get() for more info.
702
-     * @param array  $headers    The extra headers that should be passed
703
-     *                           to the headers() method.
704
-     *                           See that function for more info.
705
-     * @param bool   $overwrite  Overwrite the existing headers with new.
706
-     *
707
-     * @return mixed The complete e-mail or PEAR error object
708
-     * @access public
709
-     */
710
-    function getMessage($separation = null, $params = null, $headers = null,
711
-        $overwrite = false
712
-    ) {
713
-        if ($separation === null) {
714
-            $separation = $this->_build_params['eol'];
715
-        }
716
-
717
-        $body = $this->get($params);
718
-
719
-        if ($this->_isError($body)) {
720
-            return $body;
721
-        }
722
-
723
-        return $this->txtHeaders($headers, $overwrite) . $separation . $body;
724
-    }
725
-
726
-    /**
727
-     * Returns the complete e-mail body, ready to send using an alternative
728
-     * mail delivery method.
729
-     * 
730
-     * @param array $params The Build parameters passed to the
731
-     *                      get() method. See get() for more info.
732
-     *
733
-     * @return mixed The e-mail body or PEAR error object
734
-     * @access public
735
-     * @since 1.6.0
736
-     */
737
-    function getMessageBody($params = null)
738
-    {
739
-        return $this->get($params, null, true);
740
-    }
741
-
742
-    /**
743
-     * Writes (appends) the complete e-mail into file.
744
-     * 
745
-     * @param string $filename  Output file location
746
-     * @param array  $params    The Build parameters passed to the
747
-     *                          get() method. See get() for more info.
748
-     * @param array  $headers   The extra headers that should be passed
749
-     *                          to the headers() function.
750
-     *                          See that function for more info.
751
-     * @param bool   $overwrite Overwrite the existing headers with new.
752
-     *
753
-     * @return mixed True or PEAR error object
754
-     * @access public
755
-     * @since 1.6.0
756
-     */
757
-    function saveMessage($filename, $params = null, $headers = null, $overwrite = false)
758
-    {
759
-        // Check state of file and raise an error properly
760
-        if (file_exists($filename) && !is_writable($filename)) {
761
-            return $this->_raiseError('File is not writable: ' . $filename);
762
-        }
763
-
764
-        // Temporarily reset magic_quotes_runtime and read file contents
765
-        if ($magic_quote_setting = get_magic_quotes_runtime()) {
766
-            @ini_set('magic_quotes_runtime', 0);
767
-        }
768
-
769
-        if (!($fh = fopen($filename, 'ab'))) {
770
-            return $this->_raiseError('Unable to open file: ' . $filename);
771
-        }
772
-
773
-        // Write message headers into file (skipping Content-* headers)
774
-        $head = $this->txtHeaders($headers, $overwrite, true);
775
-        if (fwrite($fh, $head) === false) {
776
-            return $this->_raiseError('Error writing to file: ' . $filename);
777
-        }
778
-
779
-        fclose($fh);
780
-
781
-        if ($magic_quote_setting) {
782
-            @ini_set('magic_quotes_runtime', $magic_quote_setting);
783
-        }
784
-
785
-        // Write the rest of the message into file
786
-        $res = $this->get($params, $filename);
787
-
788
-        return $res ? $res : true;
789
-    }
790
-
791
-    /**
792
-     * Writes (appends) the complete e-mail body into file.
793
-     *
794
-     * @param string $filename Output file location
795
-     * @param array  $params   The Build parameters passed to the
796
-     *                         get() method. See get() for more info.
797
-     *
798
-     * @return mixed True or PEAR error object
799
-     * @access public
800
-     * @since 1.6.0
801
-     */
802
-    function saveMessageBody($filename, $params = null)
803
-    {
804
-        // Check state of file and raise an error properly
805
-        if (file_exists($filename) && !is_writable($filename)) {
806
-            return $this->_raiseError('File is not writable: ' . $filename);
807
-        }
808
-
809
-        // Temporarily reset magic_quotes_runtime and read file contents
810
-        if ($magic_quote_setting = get_magic_quotes_runtime()) {
811
-            @ini_set('magic_quotes_runtime', 0);
812
-        }
813
-
814
-        if (!($fh = fopen($filename, 'ab'))) {
815
-            return $this->_raiseError('Unable to open file: ' . $filename);
816
-        }
817
-
818
-        // Write the rest of the message into file
819
-        $res = $this->get($params, $filename, true);
820
-
821
-        return $res ? $res : true;
822
-    }
823
-
824
-    /**
825
-     * Builds the multipart message from the list ($this->_parts) and
826
-     * returns the mime content.
827
-     *
828
-     * @param array    $params    Build parameters that change the way the email
829
-     *                            is built. Should be associative. See $_build_params.
830
-     * @param resource $filename  Output file where to save the message instead of
831
-     *                            returning it
832
-     * @param boolean  $skip_head True if you want to return/save only the message
833
-     *                            without headers
834
-     *
835
-     * @return mixed The MIME message content string, null or PEAR error object
836
-     * @access public
837
-     */
838
-    function get($params = null, $filename = null, $skip_head = false)
839
-    {
840
-        if (isset($params)) {
841
-            while (list($key, $value) = each($params)) {
842
-                $this->_build_params[$key] = $value;
843
-            }
844
-        }
845
-
846
-        if (isset($this->_headers['From'])) {
847
-            // Bug #11381: Illegal characters in domain ID
848
-            if (preg_match('#(@[0-9a-zA-Z\-\.]+)#', $this->_headers['From'], $matches)) {
849
-                $domainID = $matches[1];
850
-            } else {
851
-                $domainID = '@localhost';
852
-            }
853
-            foreach ($this->_html_images as $i => $img) {
854
-                $cid = $this->_html_images[$i]['cid']; 
855
-                if (!preg_match('#'.preg_quote($domainID).'$#', $cid)) {
856
-                    $this->_html_images[$i]['cid'] = $cid . $domainID;
857
-                }
858
-            }
859
-        }
860
-
861
-        if (count($this->_html_images) && isset($this->_htmlbody)) {
862
-            foreach ($this->_html_images as $key => $value) {
863
-                $regex   = array();
864
-                $regex[] = '#(\s)((?i)src|background|href(?-i))\s*=\s*(["\']?)' .
865
-                            preg_quote($value['name'], '#') . '\3#';
866
-                $regex[] = '#(?i)url(?-i)\(\s*(["\']?)' .
867
-                            preg_quote($value['name'], '#') . '\1\s*\)#';
868
-
869
-                $rep   = array();
870
-                $rep[] = '\1\2=\3cid:' . $value['cid'] .'\3';
871
-                $rep[] = 'url(\1cid:' . $value['cid'] . '\1)';
872
-
873
-                $this->_htmlbody = preg_replace($regex, $rep, $this->_htmlbody);
874
-                $this->_html_images[$key]['name']
875
-                    = $this->_basename($this->_html_images[$key]['name']);
876
-            }
877
-        }
878
-
879
-        $this->_checkParams();
880
-
881
-        $null        = -1;
882
-        $attachments = count($this->_parts) > 0;
883
-        $html_images = count($this->_html_images) > 0;
884
-        $html        = strlen($this->_htmlbody) > 0;
885
-        $text        = !$html && strlen($this->_txtbody);
886
-
887
-        switch (true) {
888
-        case $text && !$attachments:
889
-            $message =& $this->_addTextPart($null, $this->_txtbody);
890
-            break;
891
-
892
-        case !$text && !$html && $attachments:
893
-            $message =& $this->_addMixedPart();
894
-            for ($i = 0; $i < count($this->_parts); $i++) {
895
-                $this->_addAttachmentPart($message, $this->_parts[$i]);
896
-            }
897
-            break;
898
-
899
-        case $text && $attachments:
900
-            $message =& $this->_addMixedPart();
901
-            $this->_addTextPart($message, $this->_txtbody);
902
-            for ($i = 0; $i < count($this->_parts); $i++) {
903
-                $this->_addAttachmentPart($message, $this->_parts[$i]);
904
-            }
905
-            break;
906
-
907
-        case $html && !$attachments && !$html_images:
908
-            if (isset($this->_txtbody)) {
909
-                $message =& $this->_addAlternativePart($null);
910
-                $this->_addTextPart($message, $this->_txtbody);
911
-                $this->_addHtmlPart($message);
912
-            } else {
913
-                $message =& $this->_addHtmlPart($null);
914
-            }
915
-            break;
916
-
917
-        case $html && !$attachments && $html_images:
918
-            // * Content-Type: multipart/alternative;
919
-            //    * text
920
-            //    * Content-Type: multipart/related;
921
-            //       * html
922
-            //       * image...
923
-            if (isset($this->_txtbody)) {
924
-                $message =& $this->_addAlternativePart($null);
925
-                $this->_addTextPart($message, $this->_txtbody);
926
-
927
-                $ht =& $this->_addRelatedPart($message);
928
-                $this->_addHtmlPart($ht);
929
-                for ($i = 0; $i < count($this->_html_images); $i++) {
930
-                    $this->_addHtmlImagePart($ht, $this->_html_images[$i]);
931
-                }
932
-            } else {
933
-                // * Content-Type: multipart/related;
934
-                //    * html
935
-                //    * image...
936
-                $message =& $this->_addRelatedPart($null);
937
-                $this->_addHtmlPart($message);
938
-                for ($i = 0; $i < count($this->_html_images); $i++) {
939
-                    $this->_addHtmlImagePart($message, $this->_html_images[$i]);
940
-                }
941
-            }
942
-            /*
97
+	/**
98
+	 * Contains the plain text part of the email
99
+	 *
100
+	 * @var string
101
+	 * @access private
102
+	 */
103
+	var $_txtbody;
104
+
105
+	/**
106
+	 * Contains the html part of the email
107
+	 *
108
+	 * @var string
109
+	 * @access private
110
+	 */
111
+	var $_htmlbody;
112
+
113
+	/**
114
+	 * list of the attached images
115
+	 *
116
+	 * @var array
117
+	 * @access private
118
+	 */
119
+	var $_html_images = array();
120
+
121
+	/**
122
+	 * list of the attachements
123
+	 *
124
+	 * @var array
125
+	 * @access private
126
+	 */
127
+	var $_parts = array();
128
+
129
+	/**
130
+	 * Headers for the mail
131
+	 *
132
+	 * @var array
133
+	 * @access private
134
+	 */
135
+	var $_headers = array();
136
+
137
+	/**
138
+	 * Build parameters
139
+	 *
140
+	 * @var array
141
+	 * @access private
142
+	 */
143
+	var $_build_params = array(
144
+		// What encoding to use for the headers
145
+		// Options: quoted-printable or base64
146
+		'head_encoding' => 'quoted-printable',
147
+		// What encoding to use for plain text
148
+		// Options: 7bit, 8bit, base64, or quoted-printable
149
+		'text_encoding' => 'quoted-printable',
150
+		// What encoding to use for html
151
+		// Options: 7bit, 8bit, base64, or quoted-printable
152
+		'html_encoding' => 'quoted-printable',
153
+		// The character set to use for html
154
+		'html_charset'  => 'ISO-8859-1',
155
+		// The character set to use for text
156
+		'text_charset'  => 'ISO-8859-1',
157
+		// The character set to use for headers
158
+		'head_charset'  => 'ISO-8859-1',
159
+		// End-of-line sequence
160
+		'eol'           => "\r\n",
161
+		// Delay attachment files IO until building the message
162
+		'delay_file_io' => false
163
+	);
164
+
165
+	/**
166
+	 * Constructor function
167
+	 *
168
+	 * @param mixed $params Build parameters that change the way the email
169
+	 *                      is built. Should be an associative array.
170
+	 *                      See $_build_params.
171
+	 *
172
+	 * @return void
173
+	 * @access public
174
+	 */
175
+	function Mail_mime($params = array())
176
+	{
177
+		// Backward-compatible EOL setting
178
+		if (is_string($params)) {
179
+			$this->_build_params['eol'] = $params;
180
+		} else if (defined('MAIL_MIME_CRLF') && !isset($params['eol'])) {
181
+			$this->_build_params['eol'] = MAIL_MIME_CRLF;
182
+		}
183
+
184
+		// Update build parameters
185
+		if (!empty($params) && is_array($params)) {
186
+			while (list($key, $value) = each($params)) {
187
+				$this->_build_params[$key] = $value;
188
+			}
189
+		}
190
+	}
191
+
192
+	/**
193
+	 * Set build parameter value
194
+	 *
195
+	 * @param string $name  Parameter name
196
+	 * @param string $value Parameter value
197
+	 *
198
+	 * @return void
199
+	 * @access public
200
+	 * @since 1.6.0
201
+	 */
202
+	function setParam($name, $value)
203
+	{
204
+		$this->_build_params[$name] = $value;
205
+	}
206
+
207
+	/**
208
+	 * Get build parameter value
209
+	 *
210
+	 * @param string $name Parameter name
211
+	 *
212
+	 * @return mixed Parameter value
213
+	 * @access public
214
+	 * @since 1.6.0
215
+	 */
216
+	function getParam($name)
217
+	{
218
+		return isset($this->_build_params[$name]) ? $this->_build_params[$name] : null;
219
+	}
220
+
221
+	/**
222
+	 * Accessor function to set the body text. Body text is used if
223
+	 * it's not an html mail being sent or else is used to fill the
224
+	 * text/plain part that emails clients who don't support
225
+	 * html should show.
226
+	 *
227
+	 * @param string $data   Either a string or
228
+	 *                       the file name with the contents
229
+	 * @param bool   $isfile If true the first param should be treated
230
+	 *                       as a file name, else as a string (default)
231
+	 * @param bool   $append If true the text or file is appended to
232
+	 *                       the existing body, else the old body is
233
+	 *                       overwritten
234
+	 *
235
+	 * @return mixed         True on success or PEAR_Error object
236
+	 * @access public
237
+	 */
238
+	function setTXTBody($data, $isfile = false, $append = false)
239
+	{
240
+		if (!$isfile) {
241
+			if (!$append) {
242
+				$this->_txtbody = $data;
243
+			} else {
244
+				$this->_txtbody .= $data;
245
+			}
246
+		} else {
247
+			$cont = $this->_file2str($data);
248
+			if ($this->_isError($cont)) {
249
+				return $cont;
250
+			}
251
+			if (!$append) {
252
+				$this->_txtbody = $cont;
253
+			} else {
254
+				$this->_txtbody .= $cont;
255
+			}
256
+		}
257
+
258
+		return true;
259
+	}
260
+
261
+	/**
262
+	 * Get message text body
263
+	 *
264
+	 * @return string Text body
265
+	 * @access public
266
+	 * @since 1.6.0
267
+	 */
268
+	function getTXTBody()
269
+	{
270
+		return $this->_txtbody;
271
+	}
272
+
273
+	/**
274
+	 * Adds a html part to the mail.
275
+	 *
276
+	 * @param string $data   Either a string or the file name with the
277
+	 *                       contents
278
+	 * @param bool   $isfile A flag that determines whether $data is a
279
+	 *                       filename, or a string(false, default)
280
+	 *
281
+	 * @return bool          True on success
282
+	 * @access public
283
+	 */
284
+	function setHTMLBody($data, $isfile = false)
285
+	{
286
+		if (!$isfile) {
287
+			$this->_htmlbody = $data;
288
+		} else {
289
+			$cont = $this->_file2str($data);
290
+			if ($this->_isError($cont)) {
291
+				return $cont;
292
+			}
293
+			$this->_htmlbody = $cont;
294
+		}
295
+
296
+		return true;
297
+	}
298
+
299
+	/**
300
+	 * Get message HTML body
301
+	 *
302
+	 * @return string HTML body
303
+	 * @access public
304
+	 * @since 1.6.0
305
+	 */
306
+	function getHTMLBody()
307
+	{
308
+		return $this->_htmlbody;
309
+	}
310
+
311
+	/**
312
+	 * Adds an image to the list of embedded images.
313
+	 *
314
+	 * @param string $file       The image file name OR image data itself
315
+	 * @param string $c_type     The content type
316
+	 * @param string $name       The filename of the image.
317
+	 *                           Only used if $file is the image data.
318
+	 * @param bool   $isfile     Whether $file is a filename or not.
319
+	 *                           Defaults to true
320
+	 * @param string $content_id Desired Content-ID of MIME part
321
+	 *                           Defaults to generated unique ID
322
+	 *
323
+	 * @return bool          True on success
324
+	 * @access public
325
+	 */
326
+	function addHTMLImage($file,
327
+		$c_type='application/octet-stream',
328
+		$name = '',
329
+		$isfile = true,
330
+		$content_id = null
331
+	) {
332
+		$bodyfile = null;
333
+
334
+		if ($isfile) {
335
+			// Don't load file into memory
336
+			if ($this->_build_params['delay_file_io']) {
337
+				$filedata = null;
338
+				$bodyfile = $file;
339
+			} else {
340
+				if ($this->_isError($filedata = $this->_file2str($file))) {
341
+					return $filedata;
342
+				}
343
+			}
344
+			$filename = ($name ? $name : $file);
345
+		} else {
346
+			$filedata = $file;
347
+			$filename = $name;
348
+		}
349
+
350
+		if (!$content_id) {
351
+			$content_id = preg_replace('/[^0-9a-zA-Z]/', '', uniqid(time(), true));
352
+		}
353
+
354
+		$this->_html_images[] = array(
355
+			'body'      => $filedata,
356
+			'body_file' => $bodyfile,
357
+			'name'      => $filename,
358
+			'c_type'    => $c_type,
359
+			'cid'       => $content_id
360
+		);
361
+
362
+		return true;
363
+	}
364
+
365
+	/**
366
+	 * Adds a file to the list of attachments.
367
+	 *
368
+	 * @param string $file        The file name of the file to attach
369
+	 *                            or the file contents itself
370
+	 * @param string $c_type      The content type
371
+	 * @param string $name        The filename of the attachment
372
+	 *                            Only use if $file is the contents
373
+	 * @param bool   $isfile      Whether $file is a filename or not. Defaults to true
374
+	 * @param string $encoding    The type of encoding to use. Defaults to base64.
375
+	 *                            Possible values: 7bit, 8bit, base64 or quoted-printable.
376
+	 * @param string $disposition The content-disposition of this file
377
+	 *                            Defaults to attachment.
378
+	 *                            Possible values: attachment, inline.
379
+	 * @param string $charset     The character set of attachment's content.
380
+	 * @param string $language    The language of the attachment
381
+	 * @param string $location    The RFC 2557.4 location of the attachment
382
+	 * @param string $n_encoding  Encoding of the attachment's name in Content-Type
383
+	 *                            By default filenames are encoded using RFC2231 method
384
+	 *                            Here you can set RFC2047 encoding (quoted-printable
385
+	 *                            or base64) instead
386
+	 * @param string $f_encoding  Encoding of the attachment's filename
387
+	 *                            in Content-Disposition header.
388
+	 * @param string $description Content-Description header
389
+	 * @param string $h_charset   The character set of the headers e.g. filename
390
+	 *                            If not specified, $charset will be used
391
+	 * @param array  $add_headers Additional part headers. Array keys can be in form
392
+	 *                            of <header_name>:<parameter_name>
393
+	 *
394
+	 * @return mixed              True on success or PEAR_Error object
395
+	 * @access public
396
+	 */
397
+	function addAttachment($file,
398
+		$c_type      = 'application/octet-stream',
399
+		$name        = '',
400
+		$isfile      = true,
401
+		$encoding    = 'base64',
402
+		$disposition = 'attachment',
403
+		$charset     = '',
404
+		$language    = '',
405
+		$location    = '',
406
+		$n_encoding  = null,
407
+		$f_encoding  = null,
408
+		$description = '',
409
+		$h_charset   = null,
410
+		$add_headers = array()
411
+	) {
412
+		$bodyfile = null;
413
+
414
+		if ($isfile) {
415
+			// Don't load file into memory
416
+			if ($this->_build_params['delay_file_io']) {
417
+				$filedata = null;
418
+				$bodyfile = $file;
419
+			} else {
420
+				if ($this->_isError($filedata = $this->_file2str($file))) {
421
+					return $filedata;
422
+				}
423
+			}
424
+			// Force the name the user supplied, otherwise use $file
425
+			$filename = ($name ? $name : $this->_basename($file));
426
+		} else {
427
+			$filedata = $file;
428
+			$filename = $name;
429
+		}
430
+
431
+		if (!strlen($filename)) {
432
+			$msg = "The supplied filename for the attachment can't be empty";
433
+			return $this->_raiseError($msg);
434
+		}
435
+
436
+		$this->_parts[] = array(
437
+			'body'        => $filedata,
438
+			'body_file'   => $bodyfile,
439
+			'name'        => $filename,
440
+			'c_type'      => $c_type,
441
+			'charset'     => $charset,
442
+			'encoding'    => $encoding,
443
+			'language'    => $language,
444
+			'location'    => $location,
445
+			'disposition' => $disposition,
446
+			'description' => $description,
447
+			'add_headers' => $add_headers,
448
+			'name_encoding'     => $n_encoding,
449
+			'filename_encoding' => $f_encoding,
450
+			'headers_charset'   => $h_charset,
451
+		);
452
+
453
+		return true;
454
+	}
455
+
456
+	/**
457
+	 * Get the contents of the given file name as string
458
+	 *
459
+	 * @param string $file_name Path of file to process
460
+	 *
461
+	 * @return string           Contents of $file_name
462
+	 * @access private
463
+	 */
464
+	function _file2str($file_name)
465
+	{
466
+		// Check state of file and raise an error properly
467
+		if (!file_exists($file_name)) {
468
+			return $this->_raiseError('File not found: ' . $file_name);
469
+		}
470
+		if (!is_file($file_name)) {
471
+			return $this->_raiseError('Not a regular file: ' . $file_name);
472
+		}
473
+		if (!is_readable($file_name)) {
474
+			return $this->_raiseError('File is not readable: ' . $file_name);
475
+		}
476
+
477
+		// Temporarily reset magic_quotes_runtime and read file contents
478
+		if ($magic_quote_setting = get_magic_quotes_runtime()) {
479
+			@ini_set('magic_quotes_runtime', 0);
480
+		}
481
+		$cont = file_get_contents($file_name);
482
+		if ($magic_quote_setting) {
483
+			@ini_set('magic_quotes_runtime', $magic_quote_setting);
484
+		}
485
+
486
+		return $cont;
487
+	}
488
+
489
+	/**
490
+	 * Adds a text subpart to the mimePart object and
491
+	 * returns it during the build process.
492
+	 *
493
+	 * @param mixed  &$obj The object to add the part to, or
494
+	 *                     anything else if a new object is to be created.
495
+	 * @param string $text The text to add.
496
+	 *
497
+	 * @return object      The text mimePart object
498
+	 * @access private
499
+	 */
500
+	function &_addTextPart(&$obj, $text = '')
501
+	{
502
+		$params['content_type'] = 'text/plain';
503
+		$params['encoding']     = $this->_build_params['text_encoding'];
504
+		$params['charset']      = $this->_build_params['text_charset'];
505
+		$params['eol']          = $this->_build_params['eol'];
506
+
507
+		if (is_object($obj)) {
508
+			$ret = $obj->addSubpart($text, $params);
509
+		} else {
510
+			$ret = new Mail_mimePart($text, $params);
511
+		}
512
+
513
+		return $ret;
514
+	}
515
+
516
+	/**
517
+	 * Adds a html subpart to the mimePart object and
518
+	 * returns it during the build process.
519
+	 *
520
+	 * @param mixed &$obj The object to add the part to, or
521
+	 *                    anything else if a new object is to be created.
522
+	 *
523
+	 * @return object     The html mimePart object
524
+	 * @access private
525
+	 */
526
+	function &_addHtmlPart(&$obj)
527
+	{
528
+		$params['content_type'] = 'text/html';
529
+		$params['encoding']     = $this->_build_params['html_encoding'];
530
+		$params['charset']      = $this->_build_params['html_charset'];
531
+		$params['eol']          = $this->_build_params['eol'];
532
+
533
+		if (is_object($obj)) {
534
+			$ret = $obj->addSubpart($this->_htmlbody, $params);
535
+		} else {
536
+			$ret = new Mail_mimePart($this->_htmlbody, $params);
537
+		}
538
+
539
+		return $ret;
540
+	}
541
+
542
+	/**
543
+	 * Creates a new mimePart object, using multipart/mixed as
544
+	 * the initial content-type and returns it during the
545
+	 * build process.
546
+	 *
547
+	 * @return object The multipart/mixed mimePart object
548
+	 * @access private
549
+	 */
550
+	function &_addMixedPart()
551
+	{
552
+		$params['content_type'] = 'multipart/mixed';
553
+		$params['eol']          = $this->_build_params['eol'];
554
+
555
+		// Create empty multipart/mixed Mail_mimePart object to return
556
+		$ret = new Mail_mimePart('', $params);
557
+		return $ret;
558
+	}
559
+
560
+	/**
561
+	 * Adds a multipart/alternative part to a mimePart
562
+	 * object (or creates one), and returns it during
563
+	 * the build process.
564
+	 *
565
+	 * @param mixed &$obj The object to add the part to, or
566
+	 *                    anything else if a new object is to be created.
567
+	 *
568
+	 * @return object     The multipart/mixed mimePart object
569
+	 * @access private
570
+	 */
571
+	function &_addAlternativePart(&$obj)
572
+	{
573
+		$params['content_type'] = 'multipart/alternative';
574
+		$params['eol']          = $this->_build_params['eol'];
575
+
576
+		if (is_object($obj)) {
577
+			$ret = $obj->addSubpart('', $params);
578
+		} else {
579
+			$ret = new Mail_mimePart('', $params);
580
+		}
581
+
582
+		return $ret;
583
+	}
584
+
585
+	/**
586
+	 * Adds a multipart/related part to a mimePart
587
+	 * object (or creates one), and returns it during
588
+	 * the build process.
589
+	 *
590
+	 * @param mixed &$obj The object to add the part to, or
591
+	 *                    anything else if a new object is to be created
592
+	 *
593
+	 * @return object     The multipart/mixed mimePart object
594
+	 * @access private
595
+	 */
596
+	function &_addRelatedPart(&$obj)
597
+	{
598
+		$params['content_type'] = 'multipart/related';
599
+		$params['eol']          = $this->_build_params['eol'];
600
+
601
+		if (is_object($obj)) {
602
+			$ret = $obj->addSubpart('', $params);
603
+		} else {
604
+			$ret = new Mail_mimePart('', $params);
605
+		}
606
+
607
+		return $ret;
608
+	}
609
+
610
+	/**
611
+	 * Adds an html image subpart to a mimePart object
612
+	 * and returns it during the build process.
613
+	 *
614
+	 * @param object &$obj  The mimePart to add the image to
615
+	 * @param array  $value The image information
616
+	 *
617
+	 * @return object       The image mimePart object
618
+	 * @access private
619
+	 */
620
+	function &_addHtmlImagePart(&$obj, $value)
621
+	{
622
+		$params['content_type'] = $value['c_type'];
623
+		$params['encoding']     = 'base64';
624
+		$params['disposition']  = 'inline';
625
+		$params['filename']     = $value['name'];
626
+		$params['cid']          = $value['cid'];
627
+		$params['body_file']    = $value['body_file'];
628
+		$params['eol']          = $this->_build_params['eol'];
629
+
630
+		if (!empty($value['name_encoding'])) {
631
+			$params['name_encoding'] = $value['name_encoding'];
632
+		}
633
+		if (!empty($value['filename_encoding'])) {
634
+			$params['filename_encoding'] = $value['filename_encoding'];
635
+		}
636
+
637
+		$ret = $obj->addSubpart($value['body'], $params);
638
+		return $ret;
639
+	}
640
+
641
+	/**
642
+	 * Adds an attachment subpart to a mimePart object
643
+	 * and returns it during the build process.
644
+	 *
645
+	 * @param object &$obj  The mimePart to add the image to
646
+	 * @param array  $value The attachment information
647
+	 *
648
+	 * @return object       The image mimePart object
649
+	 * @access private
650
+	 */
651
+	function &_addAttachmentPart(&$obj, $value)
652
+	{
653
+		$params['eol']          = $this->_build_params['eol'];
654
+		$params['filename']     = $value['name'];
655
+		$params['encoding']     = $value['encoding'];
656
+		$params['content_type'] = $value['c_type'];
657
+		$params['body_file']    = $value['body_file'];
658
+		$params['disposition']  = isset($value['disposition']) ? 
659
+								  $value['disposition'] : 'attachment';
660
+
661
+		// content charset
662
+		if (!empty($value['charset'])) {
663
+			$params['charset'] = $value['charset'];
664
+		}
665
+		// headers charset (filename, description)
666
+		if (!empty($value['headers_charset'])) {
667
+			$params['headers_charset'] = $value['headers_charset'];
668
+		}
669
+		if (!empty($value['language'])) {
670
+			$params['language'] = $value['language'];
671
+		}
672
+		if (!empty($value['location'])) {
673
+			$params['location'] = $value['location'];
674
+		}
675
+		if (!empty($value['name_encoding'])) {
676
+			$params['name_encoding'] = $value['name_encoding'];
677
+		}
678
+		if (!empty($value['filename_encoding'])) {
679
+			$params['filename_encoding'] = $value['filename_encoding'];
680
+		}
681
+		if (!empty($value['description'])) {
682
+			$params['description'] = $value['description'];
683
+		}
684
+		if (is_array($value['add_headers'])) {
685
+			$params['headers'] = $value['add_headers'];
686
+		}
687
+
688
+		$ret = $obj->addSubpart($value['body'], $params);
689
+		return $ret;
690
+	}
691
+
692
+	/**
693
+	 * Returns the complete e-mail, ready to send using an alternative
694
+	 * mail delivery method. Note that only the mailpart that is made
695
+	 * with Mail_Mime is created. This means that,
696
+	 * YOU WILL HAVE NO TO: HEADERS UNLESS YOU SET IT YOURSELF 
697
+	 * using the $headers parameter!
698
+	 * 
699
+	 * @param string $separation The separation between these two parts.
700
+	 * @param array  $params     The Build parameters passed to the
701
+	 *                           get() function. See get() for more info.
702
+	 * @param array  $headers    The extra headers that should be passed
703
+	 *                           to the headers() method.
704
+	 *                           See that function for more info.
705
+	 * @param bool   $overwrite  Overwrite the existing headers with new.
706
+	 *
707
+	 * @return mixed The complete e-mail or PEAR error object
708
+	 * @access public
709
+	 */
710
+	function getMessage($separation = null, $params = null, $headers = null,
711
+		$overwrite = false
712
+	) {
713
+		if ($separation === null) {
714
+			$separation = $this->_build_params['eol'];
715
+		}
716
+
717
+		$body = $this->get($params);
718
+
719
+		if ($this->_isError($body)) {
720
+			return $body;
721
+		}
722
+
723
+		return $this->txtHeaders($headers, $overwrite) . $separation . $body;
724
+	}
725
+
726
+	/**
727
+	 * Returns the complete e-mail body, ready to send using an alternative
728
+	 * mail delivery method.
729
+	 * 
730
+	 * @param array $params The Build parameters passed to the
731
+	 *                      get() method. See get() for more info.
732
+	 *
733
+	 * @return mixed The e-mail body or PEAR error object
734
+	 * @access public
735
+	 * @since 1.6.0
736
+	 */
737
+	function getMessageBody($params = null)
738
+	{
739
+		return $this->get($params, null, true);
740
+	}
741
+
742
+	/**
743
+	 * Writes (appends) the complete e-mail into file.
744
+	 * 
745
+	 * @param string $filename  Output file location
746
+	 * @param array  $params    The Build parameters passed to the
747
+	 *                          get() method. See get() for more info.
748
+	 * @param array  $headers   The extra headers that should be passed
749
+	 *                          to the headers() function.
750
+	 *                          See that function for more info.
751
+	 * @param bool   $overwrite Overwrite the existing headers with new.
752
+	 *
753
+	 * @return mixed True or PEAR error object
754
+	 * @access public
755
+	 * @since 1.6.0
756
+	 */
757
+	function saveMessage($filename, $params = null, $headers = null, $overwrite = false)
758
+	{
759
+		// Check state of file and raise an error properly
760
+		if (file_exists($filename) && !is_writable($filename)) {
761
+			return $this->_raiseError('File is not writable: ' . $filename);
762
+		}
763
+
764
+		// Temporarily reset magic_quotes_runtime and read file contents
765
+		if ($magic_quote_setting = get_magic_quotes_runtime()) {
766
+			@ini_set('magic_quotes_runtime', 0);
767
+		}
768
+
769
+		if (!($fh = fopen($filename, 'ab'))) {
770
+			return $this->_raiseError('Unable to open file: ' . $filename);
771
+		}
772
+
773
+		// Write message headers into file (skipping Content-* headers)
774
+		$head = $this->txtHeaders($headers, $overwrite, true);
775
+		if (fwrite($fh, $head) === false) {
776
+			return $this->_raiseError('Error writing to file: ' . $filename);
777
+		}
778
+
779
+		fclose($fh);
780
+
781
+		if ($magic_quote_setting) {
782
+			@ini_set('magic_quotes_runtime', $magic_quote_setting);
783
+		}
784
+
785
+		// Write the rest of the message into file
786
+		$res = $this->get($params, $filename);
787
+
788
+		return $res ? $res : true;
789
+	}
790
+
791
+	/**
792
+	 * Writes (appends) the complete e-mail body into file.
793
+	 *
794
+	 * @param string $filename Output file location
795
+	 * @param array  $params   The Build parameters passed to the
796
+	 *                         get() method. See get() for more info.
797
+	 *
798
+	 * @return mixed True or PEAR error object
799
+	 * @access public
800
+	 * @since 1.6.0
801
+	 */
802
+	function saveMessageBody($filename, $params = null)
803
+	{
804
+		// Check state of file and raise an error properly
805
+		if (file_exists($filename) && !is_writable($filename)) {
806
+			return $this->_raiseError('File is not writable: ' . $filename);
807
+		}
808
+
809
+		// Temporarily reset magic_quotes_runtime and read file contents
810
+		if ($magic_quote_setting = get_magic_quotes_runtime()) {
811
+			@ini_set('magic_quotes_runtime', 0);
812
+		}
813
+
814
+		if (!($fh = fopen($filename, 'ab'))) {
815
+			return $this->_raiseError('Unable to open file: ' . $filename);
816
+		}
817
+
818
+		// Write the rest of the message into file
819
+		$res = $this->get($params, $filename, true);
820
+
821
+		return $res ? $res : true;
822
+	}
823
+
824
+	/**
825
+	 * Builds the multipart message from the list ($this->_parts) and
826
+	 * returns the mime content.
827
+	 *
828
+	 * @param array    $params    Build parameters that change the way the email
829
+	 *                            is built. Should be associative. See $_build_params.
830
+	 * @param resource $filename  Output file where to save the message instead of
831
+	 *                            returning it
832
+	 * @param boolean  $skip_head True if you want to return/save only the message
833
+	 *                            without headers
834
+	 *
835
+	 * @return mixed The MIME message content string, null or PEAR error object
836
+	 * @access public
837
+	 */
838
+	function get($params = null, $filename = null, $skip_head = false)
839
+	{
840
+		if (isset($params)) {
841
+			while (list($key, $value) = each($params)) {
842
+				$this->_build_params[$key] = $value;
843
+			}
844
+		}
845
+
846
+		if (isset($this->_headers['From'])) {
847
+			// Bug #11381: Illegal characters in domain ID
848
+			if (preg_match('#(@[0-9a-zA-Z\-\.]+)#', $this->_headers['From'], $matches)) {
849
+				$domainID = $matches[1];
850
+			} else {
851
+				$domainID = '@localhost';
852
+			}
853
+			foreach ($this->_html_images as $i => $img) {
854
+				$cid = $this->_html_images[$i]['cid']; 
855
+				if (!preg_match('#'.preg_quote($domainID).'$#', $cid)) {
856
+					$this->_html_images[$i]['cid'] = $cid . $domainID;
857
+				}
858
+			}
859
+		}
860
+
861
+		if (count($this->_html_images) && isset($this->_htmlbody)) {
862
+			foreach ($this->_html_images as $key => $value) {
863
+				$regex   = array();
864
+				$regex[] = '#(\s)((?i)src|background|href(?-i))\s*=\s*(["\']?)' .
865
+							preg_quote($value['name'], '#') . '\3#';
866
+				$regex[] = '#(?i)url(?-i)\(\s*(["\']?)' .
867
+							preg_quote($value['name'], '#') . '\1\s*\)#';
868
+
869
+				$rep   = array();
870
+				$rep[] = '\1\2=\3cid:' . $value['cid'] .'\3';
871
+				$rep[] = 'url(\1cid:' . $value['cid'] . '\1)';
872
+
873
+				$this->_htmlbody = preg_replace($regex, $rep, $this->_htmlbody);
874
+				$this->_html_images[$key]['name']
875
+					= $this->_basename($this->_html_images[$key]['name']);
876
+			}
877
+		}
878
+
879
+		$this->_checkParams();
880
+
881
+		$null        = -1;
882
+		$attachments = count($this->_parts) > 0;
883
+		$html_images = count($this->_html_images) > 0;
884
+		$html        = strlen($this->_htmlbody) > 0;
885
+		$text        = !$html && strlen($this->_txtbody);
886
+
887
+		switch (true) {
888
+		case $text && !$attachments:
889
+			$message =& $this->_addTextPart($null, $this->_txtbody);
890
+			break;
891
+
892
+		case !$text && !$html && $attachments:
893
+			$message =& $this->_addMixedPart();
894
+			for ($i = 0; $i < count($this->_parts); $i++) {
895
+				$this->_addAttachmentPart($message, $this->_parts[$i]);
896
+			}
897
+			break;
898
+
899
+		case $text && $attachments:
900
+			$message =& $this->_addMixedPart();
901
+			$this->_addTextPart($message, $this->_txtbody);
902
+			for ($i = 0; $i < count($this->_parts); $i++) {
903
+				$this->_addAttachmentPart($message, $this->_parts[$i]);
904
+			}
905
+			break;
906
+
907
+		case $html && !$attachments && !$html_images:
908
+			if (isset($this->_txtbody)) {
909
+				$message =& $this->_addAlternativePart($null);
910
+				$this->_addTextPart($message, $this->_txtbody);
911
+				$this->_addHtmlPart($message);
912
+			} else {
913
+				$message =& $this->_addHtmlPart($null);
914
+			}
915
+			break;
916
+
917
+		case $html && !$attachments && $html_images:
918
+			// * Content-Type: multipart/alternative;
919
+			//    * text
920
+			//    * Content-Type: multipart/related;
921
+			//       * html
922
+			//       * image...
923
+			if (isset($this->_txtbody)) {
924
+				$message =& $this->_addAlternativePart($null);
925
+				$this->_addTextPart($message, $this->_txtbody);
926
+
927
+				$ht =& $this->_addRelatedPart($message);
928
+				$this->_addHtmlPart($ht);
929
+				for ($i = 0; $i < count($this->_html_images); $i++) {
930
+					$this->_addHtmlImagePart($ht, $this->_html_images[$i]);
931
+				}
932
+			} else {
933
+				// * Content-Type: multipart/related;
934
+				//    * html
935
+				//    * image...
936
+				$message =& $this->_addRelatedPart($null);
937
+				$this->_addHtmlPart($message);
938
+				for ($i = 0; $i < count($this->_html_images); $i++) {
939
+					$this->_addHtmlImagePart($message, $this->_html_images[$i]);
940
+				}
941
+			}
942
+			/*
943 943
             // #13444, #9725: the code below was a non-RFC compliant hack
944 944
             // * Content-Type: multipart/related;
945 945
             //    * Content-Type: multipart/alternative;
@@ -958,537 +958,537 @@  discard block
 block discarded – undo
958 958
                 $this->_addHtmlImagePart($message, $this->_html_images[$i]);
959 959
             }
960 960
             */
961
-            break;
962
-
963
-        case $html && $attachments && !$html_images:
964
-            $message =& $this->_addMixedPart();
965
-            if (isset($this->_txtbody)) {
966
-                $alt =& $this->_addAlternativePart($message);
967
-                $this->_addTextPart($alt, $this->_txtbody);
968
-                $this->_addHtmlPart($alt);
969
-            } else {
970
-                $this->_addHtmlPart($message);
971
-            }
972
-            for ($i = 0; $i < count($this->_parts); $i++) {
973
-                $this->_addAttachmentPart($message, $this->_parts[$i]);
974
-            }
975
-            break;
976
-
977
-        case $html && $attachments && $html_images:
978
-            $message =& $this->_addMixedPart();
979
-            if (isset($this->_txtbody)) {
980
-                $alt =& $this->_addAlternativePart($message);
981
-                $this->_addTextPart($alt, $this->_txtbody);
982
-                $rel =& $this->_addRelatedPart($alt);
983
-            } else {
984
-                $rel =& $this->_addRelatedPart($message);
985
-            }
986
-            $this->_addHtmlPart($rel);
987
-            for ($i = 0; $i < count($this->_html_images); $i++) {
988
-                $this->_addHtmlImagePart($rel, $this->_html_images[$i]);
989
-            }
990
-            for ($i = 0; $i < count($this->_parts); $i++) {
991
-                $this->_addAttachmentPart($message, $this->_parts[$i]);
992
-            }
993
-            break;
994
-        }
995
-
996
-        if (!isset($message)) {
997
-            return null;
998
-        }
999
-
1000
-        // Use saved boundary
1001
-        if (!empty($this->_build_params['boundary'])) {
1002
-            $boundary = $this->_build_params['boundary'];
1003
-        } else {
1004
-            $boundary = null;
1005
-        }
1006
-
1007
-        // Write output to file
1008
-        if ($filename) {
1009
-            // Append mimePart message headers and body into file
1010
-            $headers = $message->encodeToFile($filename, $boundary, $skip_head);
1011
-            if ($this->_isError($headers)) {
1012
-                return $headers;
1013
-            }
1014
-            $this->_headers = array_merge($this->_headers, $headers);
1015
-            return null;
1016
-        } else {
1017
-            $output = $message->encode($boundary, $skip_head);
1018
-            if ($this->_isError($output)) {
1019
-                return $output;
1020
-            }
1021
-            $this->_headers = array_merge($this->_headers, $output['headers']);
1022
-            return $output['body'];
1023
-        }
1024
-    }
1025
-
1026
-    /**
1027
-     * Returns an array with the headers needed to prepend to the email
1028
-     * (MIME-Version and Content-Type). Format of argument is:
1029
-     * $array['header-name'] = 'header-value';
1030
-     *
1031
-     * @param array $xtra_headers Assoc array with any extra headers (optional)
1032
-     *                            (Don't set Content-Type for multipart messages here!)
1033
-     * @param bool  $overwrite    Overwrite already existing headers.
1034
-     * @param bool  $skip_content Don't return content headers: Content-Type,
1035
-     *                            Content-Disposition and Content-Transfer-Encoding
1036
-     * 
1037
-     * @return array              Assoc array with the mime headers
1038
-     * @access public
1039
-     */
1040
-    function headers($xtra_headers = null, $overwrite = false, $skip_content = false)
1041
-    {
1042
-        // Add mime version header
1043
-        $headers['MIME-Version'] = '1.0';
1044
-
1045
-        // Content-Type and Content-Transfer-Encoding headers should already
1046
-        // be present if get() was called, but we'll re-set them to make sure
1047
-        // we got them when called before get() or something in the message
1048
-        // has been changed after get() [#14780]
1049
-        if (!$skip_content) {
1050
-            $headers += $this->_contentHeaders();
1051
-        }
1052
-
1053
-        if (!empty($xtra_headers)) {
1054
-            $headers = array_merge($headers, $xtra_headers);
1055
-        }
1056
-
1057
-        if ($overwrite) {
1058
-            $this->_headers = array_merge($this->_headers, $headers);
1059
-        } else {
1060
-            $this->_headers = array_merge($headers, $this->_headers);
1061
-        }
1062
-
1063
-        $headers = $this->_headers;
1064
-
1065
-        if ($skip_content) {
1066
-            unset($headers['Content-Type']);
1067
-            unset($headers['Content-Transfer-Encoding']);
1068
-            unset($headers['Content-Disposition']);
1069
-        } else if (!empty($this->_build_params['ctype'])) {
1070
-            $headers['Content-Type'] = $this->_build_params['ctype'];
1071
-        }
1072
-
1073
-        $encodedHeaders = $this->_encodeHeaders($headers);
1074
-        return $encodedHeaders;
1075
-    }
1076
-
1077
-    /**
1078
-     * Get the text version of the headers
1079
-     * (usefull if you want to use the PHP mail() function)
1080
-     *
1081
-     * @param array $xtra_headers Assoc array with any extra headers (optional)
1082
-     *                            (Don't set Content-Type for multipart messages here!)
1083
-     * @param bool  $overwrite    Overwrite the existing headers with new.
1084
-     * @param bool  $skip_content Don't return content headers: Content-Type,
1085
-     *                            Content-Disposition and Content-Transfer-Encoding
1086
-     *
1087
-     * @return string             Plain text headers
1088
-     * @access public
1089
-     */
1090
-    function txtHeaders($xtra_headers = null, $overwrite = false, $skip_content = false)
1091
-    {
1092
-        $headers = $this->headers($xtra_headers, $overwrite, $skip_content);
1093
-
1094
-        // Place Received: headers at the beginning of the message
1095
-        // Spam detectors often flag messages with it after the Subject: as spam
1096
-        if (isset($headers['Received'])) {
1097
-            $received = $headers['Received'];
1098
-            unset($headers['Received']);
1099
-            $headers = array('Received' => $received) + $headers;
1100
-        }
1101
-
1102
-        $ret = '';
1103
-        $eol = $this->_build_params['eol'];
1104
-
1105
-        foreach ($headers as $key => $val) {
1106
-            if (is_array($val)) {
1107
-                foreach ($val as $value) {
1108
-                    $ret .= "$key: $value" . $eol;
1109
-                }
1110
-            } else {
1111
-                $ret .= "$key: $val" . $eol;
1112
-            }
1113
-        }
1114
-
1115
-        return $ret;
1116
-    }
1117
-
1118
-    /**
1119
-     * Sets message Content-Type header.
1120
-     * Use it to build messages with various content-types e.g. miltipart/raport
1121
-     * not supported by _contentHeaders() function.
1122
-     *
1123
-     * @param string $type   Type name
1124
-     * @param array  $params Hash array of header parameters
1125
-     *
1126
-     * @return void
1127
-     * @access public
1128
-     * @since 1.7.0
1129
-     */
1130
-    function setContentType($type, $params = array())
1131
-    {
1132
-        $header = $type;
1133
-
1134
-        $eol = !empty($this->_build_params['eol'])
1135
-            ? $this->_build_params['eol'] : "\r\n";
1136
-
1137
-        // add parameters
1138
-        $token_regexp = '#([^\x21\x23-\x27\x2A\x2B\x2D'
1139
-            . '\x2E\x30-\x39\x41-\x5A\x5E-\x7E])#';
1140
-        if (is_array($params)) {
1141
-            foreach ($params as $name => $value) {
1142
-                if ($name == 'boundary') {
1143
-                    $this->_build_params['boundary'] = $value;
1144
-                }
1145
-                if (!preg_match($token_regexp, $value)) {
1146
-                    $header .= ";$eol $name=$value";
1147
-                } else {
1148
-                    $value = addcslashes($value, '\\"');
1149
-                    $header .= ";$eol $name=\"$value\"";
1150
-                }
1151
-            }
1152
-        }
1153
-
1154
-        // add required boundary parameter if not defined
1155
-        if (preg_match('/^multipart\//i', $type)) {
1156
-            if (empty($this->_build_params['boundary'])) {
1157
-                $this->_build_params['boundary'] = '=_' . md5(rand() . microtime());
1158
-            }
1159
-
1160
-            $header .= ";$eol boundary=\"".$this->_build_params['boundary']."\"";
1161
-        }
1162
-
1163
-        $this->_build_params['ctype'] = $header;
1164
-    }
1165
-
1166
-    /**
1167
-     * Sets the Subject header
1168
-     *
1169
-     * @param string $subject String to set the subject to.
1170
-     *
1171
-     * @return void
1172
-     * @access public
1173
-     */
1174
-    function setSubject($subject)
1175
-    {
1176
-        $this->_headers['Subject'] = $subject;
1177
-    }
1178
-
1179
-    /**
1180
-     * Set an email to the From (the sender) header
1181
-     *
1182
-     * @param string $email The email address to use
1183
-     *
1184
-     * @return void
1185
-     * @access public
1186
-     */
1187
-    function setFrom($email)
1188
-    {
1189
-        $this->_headers['From'] = $email;
1190
-    }
1191
-
1192
-    /**
1193
-     * Add an email to the To header
1194
-     * (multiple calls to this method are allowed)
1195
-     *
1196
-     * @param string $email The email direction to add
1197
-     *
1198
-     * @return void
1199
-     * @access public
1200
-     */
1201
-    function addTo($email)
1202
-    {
1203
-        if (isset($this->_headers['To'])) {
1204
-            $this->_headers['To'] .= ", $email";
1205
-        } else {
1206
-            $this->_headers['To'] = $email;
1207
-        }
1208
-    }
1209
-
1210
-    /**
1211
-     * Add an email to the Cc (carbon copy) header
1212
-     * (multiple calls to this method are allowed)
1213
-     *
1214
-     * @param string $email The email direction to add
1215
-     *
1216
-     * @return void
1217
-     * @access public
1218
-     */
1219
-    function addCc($email)
1220
-    {
1221
-        if (isset($this->_headers['Cc'])) {
1222
-            $this->_headers['Cc'] .= ", $email";
1223
-        } else {
1224
-            $this->_headers['Cc'] = $email;
1225
-        }
1226
-    }
1227
-
1228
-    /**
1229
-     * Add an email to the Bcc (blank carbon copy) header
1230
-     * (multiple calls to this method are allowed)
1231
-     *
1232
-     * @param string $email The email direction to add
1233
-     *
1234
-     * @return void
1235
-     * @access public
1236
-     */
1237
-    function addBcc($email)
1238
-    {
1239
-        if (isset($this->_headers['Bcc'])) {
1240
-            $this->_headers['Bcc'] .= ", $email";
1241
-        } else {
1242
-            $this->_headers['Bcc'] = $email;
1243
-        }
1244
-    }
1245
-
1246
-    /**
1247
-     * Since the PHP send function requires you to specify
1248
-     * recipients (To: header) separately from the other
1249
-     * headers, the To: header is not properly encoded.
1250
-     * To fix this, you can use this public method to 
1251
-     * encode your recipients before sending to the send
1252
-     * function
1253
-     *
1254
-     * @param string $recipients A comma-delimited list of recipients
1255
-     *
1256
-     * @return string            Encoded data
1257
-     * @access public
1258
-     */
1259
-    function encodeRecipients($recipients)
1260
-    {
1261
-        $input = array("To" => $recipients);
1262
-        $retval = $this->_encodeHeaders($input);
1263
-        return $retval["To"] ;
1264
-    }
1265
-
1266
-    /**
1267
-     * Encodes headers as per RFC2047
1268
-     *
1269
-     * @param array $input  The header data to encode
1270
-     * @param array $params Extra build parameters
1271
-     *
1272
-     * @return array        Encoded data
1273
-     * @access private
1274
-     */
1275
-    function _encodeHeaders($input, $params = array())
1276
-    {
1277
-        $build_params = $this->_build_params;
1278
-        while (list($key, $value) = each($params)) {
1279
-            $build_params[$key] = $value;
1280
-        }
1281
-
1282
-        foreach ($input as $hdr_name => $hdr_value) {
1283
-            if (is_array($hdr_value)) {
1284
-                foreach ($hdr_value as $idx => $value) {
1285
-                    $input[$hdr_name][$idx] = $this->encodeHeader(
1286
-                        $hdr_name, $value,
1287
-                        $build_params['head_charset'], $build_params['head_encoding']
1288
-                    );
1289
-                }
1290
-            } else {
1291
-                $input[$hdr_name] = $this->encodeHeader(
1292
-                    $hdr_name, $hdr_value,
1293
-                    $build_params['head_charset'], $build_params['head_encoding']
1294
-                );
1295
-            }
1296
-        }
1297
-
1298
-        return $input;
1299
-    }
1300
-
1301
-    /**
1302
-     * Encodes a header as per RFC2047
1303
-     *
1304
-     * @param string $name     The header name
1305
-     * @param string $value    The header data to encode
1306
-     * @param string $charset  Character set name
1307
-     * @param string $encoding Encoding name (base64 or quoted-printable)
1308
-     *
1309
-     * @return string          Encoded header data (without a name)
1310
-     * @access public
1311
-     * @since 1.5.3
1312
-     */
1313
-    function encodeHeader($name, $value, $charset, $encoding)
1314
-    {
1315
-        $mime_part = new Mail_mimePart;
1316
-        return $mime_part->encodeHeader(
1317
-            $name, $value, $charset, $encoding, $this->_build_params['eol']
1318
-        );
1319
-    }
1320
-
1321
-    /**
1322
-     * Get file's basename (locale independent) 
1323
-     *
1324
-     * @param string $filename Filename
1325
-     *
1326
-     * @return string          Basename
1327
-     * @access private
1328
-     */
1329
-    function _basename($filename)
1330
-    {
1331
-        // basename() is not unicode safe and locale dependent
1332
-        if (stristr(PHP_OS, 'win') || stristr(PHP_OS, 'netware')) {
1333
-            return preg_replace('/^.*[\\\\\\/]/', '', $filename);
1334
-        } else {
1335
-            return preg_replace('/^.*[\/]/', '', $filename);
1336
-        }
1337
-    }
1338
-
1339
-    /**
1340
-     * Get Content-Type and Content-Transfer-Encoding headers of the message
1341
-     *
1342
-     * @return array Headers array
1343
-     * @access private
1344
-     */
1345
-    function _contentHeaders()
1346
-    {
1347
-        $attachments = count($this->_parts)                 ? true : false;
1348
-        $html_images = count($this->_html_images)           ? true : false;
1349
-        $html        = strlen($this->_htmlbody)             ? true : false;
1350
-        $text        = (!$html && strlen($this->_txtbody))  ? true : false;
1351
-        $headers     = array();
1352
-
1353
-        // See get()
1354
-        switch (true) {
1355
-        case $text && !$attachments:
1356
-            $headers['Content-Type'] = 'text/plain';
1357
-            break;
1358
-
1359
-        case !$text && !$html && $attachments:
1360
-        case $text && $attachments:
1361
-        case $html && $attachments && !$html_images:
1362
-        case $html && $attachments && $html_images:
1363
-            $headers['Content-Type'] = 'multipart/mixed';
1364
-            break;
1365
-
1366
-        case $html && !$attachments && !$html_images && isset($this->_txtbody):
1367
-        case $html && !$attachments && $html_images && isset($this->_txtbody):
1368
-            $headers['Content-Type'] = 'multipart/alternative';
1369
-            break;
1370
-
1371
-        case $html && !$attachments && !$html_images && !isset($this->_txtbody):
1372
-            $headers['Content-Type'] = 'text/html';
1373
-            break;
1374
-
1375
-        case $html && !$attachments && $html_images && !isset($this->_txtbody):
1376
-            $headers['Content-Type'] = 'multipart/related';
1377
-            break;
1378
-
1379
-        default:
1380
-            return $headers;
1381
-        }
1382
-
1383
-        $this->_checkParams();
1384
-
1385
-        $eol = !empty($this->_build_params['eol'])
1386
-            ? $this->_build_params['eol'] : "\r\n";
1387
-
1388
-        if ($headers['Content-Type'] == 'text/plain') {
1389
-            // single-part message: add charset and encoding
1390
-            $charset = 'charset=' . $this->_build_params['text_charset'];
1391
-            // place charset parameter in the same line, if possible
1392
-            // 26 = strlen("Content-Type: text/plain; ")
1393
-            $headers['Content-Type']
1394
-                .= (strlen($charset) + 26 <= 76) ? "; $charset" : ";$eol $charset";
1395
-            $headers['Content-Transfer-Encoding']
1396
-                = $this->_build_params['text_encoding'];
1397
-        } else if ($headers['Content-Type'] == 'text/html') {
1398
-            // single-part message: add charset and encoding
1399
-            $charset = 'charset=' . $this->_build_params['html_charset'];
1400
-            // place charset parameter in the same line, if possible
1401
-            $headers['Content-Type']
1402
-                .= (strlen($charset) + 25 <= 76) ? "; $charset" : ";$eol $charset";
1403
-            $headers['Content-Transfer-Encoding']
1404
-                = $this->_build_params['html_encoding'];
1405
-        } else {
1406
-            // multipart message: and boundary
1407
-            if (!empty($this->_build_params['boundary'])) {
1408
-                $boundary = $this->_build_params['boundary'];
1409
-            } else if (!empty($this->_headers['Content-Type'])
1410
-                && preg_match('/boundary="([^"]+)"/', $this->_headers['Content-Type'], $m)
1411
-            ) {
1412
-                $boundary = $m[1];
1413
-            } else {
1414
-                $boundary = '=_' . md5(rand() . microtime());
1415
-            }
1416
-
1417
-            $this->_build_params['boundary'] = $boundary;
1418
-            $headers['Content-Type'] .= ";$eol boundary=\"$boundary\"";
1419
-        }
1420
-
1421
-        return $headers;
1422
-    }
1423
-
1424
-    /**
1425
-     * Validate and set build parameters
1426
-     *
1427
-     * @return void
1428
-     * @access private
1429
-     */
1430
-    function _checkParams()
1431
-    {
1432
-        $encodings = array('7bit', '8bit', 'base64', 'quoted-printable');
1433
-
1434
-        $this->_build_params['text_encoding']
1435
-            = strtolower($this->_build_params['text_encoding']);
1436
-        $this->_build_params['html_encoding']
1437
-            = strtolower($this->_build_params['html_encoding']);
1438
-
1439
-        if (!in_array($this->_build_params['text_encoding'], $encodings)) {
1440
-            $this->_build_params['text_encoding'] = '7bit';
1441
-        }
1442
-        if (!in_array($this->_build_params['html_encoding'], $encodings)) {
1443
-            $this->_build_params['html_encoding'] = '7bit';
1444
-        }
1445
-
1446
-        // text body
1447
-        if ($this->_build_params['text_encoding'] == '7bit'
1448
-            && !preg_match('/ascii/i', $this->_build_params['text_charset'])
1449
-            && preg_match('/[^\x00-\x7F]/', $this->_txtbody)
1450
-        ) {
1451
-            $this->_build_params['text_encoding'] = 'quoted-printable';
1452
-        }
1453
-        // html body
1454
-        if ($this->_build_params['html_encoding'] == '7bit'
1455
-            && !preg_match('/ascii/i', $this->_build_params['html_charset'])
1456
-            && preg_match('/[^\x00-\x7F]/', $this->_htmlbody)
1457
-        ) {
1458
-            $this->_build_params['html_encoding'] = 'quoted-printable';
1459
-        }
1460
-    }
1461
-
1462
-    /**
1463
-     * PEAR::isError implementation
1464
-     *
1465
-     * @param mixed $data Object
1466
-     *
1467
-     * @return bool True if object is an instance of PEAR_Error
1468
-     * @access private
1469
-     */
1470
-    function _isError($data)
1471
-    {
1472
-        // PEAR::isError() is not PHP 5.4 compatible (see Bug #19473)
1473
-        if (is_object($data) && is_a($data, 'PEAR_Error')) {
1474
-            return true;
1475
-        }
1476
-
1477
-        return false;
1478
-    }
1479
-
1480
-    /**
1481
-     * PEAR::raiseError implementation
1482
-     *
1483
-     * @param $message A text error message
1484
-     *
1485
-     * @return PEAR_Error Instance of PEAR_Error
1486
-     * @access private
1487
-     */
1488
-    function _raiseError($message)
1489
-    {
1490
-        // PEAR::raiseError() is not PHP 5.4 compatible
1491
-        return new PEAR_Error($message);
1492
-    }
961
+			break;
962
+
963
+		case $html && $attachments && !$html_images:
964
+			$message =& $this->_addMixedPart();
965
+			if (isset($this->_txtbody)) {
966
+				$alt =& $this->_addAlternativePart($message);
967
+				$this->_addTextPart($alt, $this->_txtbody);
968
+				$this->_addHtmlPart($alt);
969
+			} else {
970
+				$this->_addHtmlPart($message);
971
+			}
972
+			for ($i = 0; $i < count($this->_parts); $i++) {
973
+				$this->_addAttachmentPart($message, $this->_parts[$i]);
974
+			}
975
+			break;
976
+
977
+		case $html && $attachments && $html_images:
978
+			$message =& $this->_addMixedPart();
979
+			if (isset($this->_txtbody)) {
980
+				$alt =& $this->_addAlternativePart($message);
981
+				$this->_addTextPart($alt, $this->_txtbody);
982
+				$rel =& $this->_addRelatedPart($alt);
983
+			} else {
984
+				$rel =& $this->_addRelatedPart($message);
985
+			}
986
+			$this->_addHtmlPart($rel);
987
+			for ($i = 0; $i < count($this->_html_images); $i++) {
988
+				$this->_addHtmlImagePart($rel, $this->_html_images[$i]);
989
+			}
990
+			for ($i = 0; $i < count($this->_parts); $i++) {
991
+				$this->_addAttachmentPart($message, $this->_parts[$i]);
992
+			}
993
+			break;
994
+		}
995
+
996
+		if (!isset($message)) {
997
+			return null;
998
+		}
999
+
1000
+		// Use saved boundary
1001
+		if (!empty($this->_build_params['boundary'])) {
1002
+			$boundary = $this->_build_params['boundary'];
1003
+		} else {
1004
+			$boundary = null;
1005
+		}
1006
+
1007
+		// Write output to file
1008
+		if ($filename) {
1009
+			// Append mimePart message headers and body into file
1010
+			$headers = $message->encodeToFile($filename, $boundary, $skip_head);
1011
+			if ($this->_isError($headers)) {
1012
+				return $headers;
1013
+			}
1014
+			$this->_headers = array_merge($this->_headers, $headers);
1015
+			return null;
1016
+		} else {
1017
+			$output = $message->encode($boundary, $skip_head);
1018
+			if ($this->_isError($output)) {
1019
+				return $output;
1020
+			}
1021
+			$this->_headers = array_merge($this->_headers, $output['headers']);
1022
+			return $output['body'];
1023
+		}
1024
+	}
1025
+
1026
+	/**
1027
+	 * Returns an array with the headers needed to prepend to the email
1028
+	 * (MIME-Version and Content-Type). Format of argument is:
1029
+	 * $array['header-name'] = 'header-value';
1030
+	 *
1031
+	 * @param array $xtra_headers Assoc array with any extra headers (optional)
1032
+	 *                            (Don't set Content-Type for multipart messages here!)
1033
+	 * @param bool  $overwrite    Overwrite already existing headers.
1034
+	 * @param bool  $skip_content Don't return content headers: Content-Type,
1035
+	 *                            Content-Disposition and Content-Transfer-Encoding
1036
+	 * 
1037
+	 * @return array              Assoc array with the mime headers
1038
+	 * @access public
1039
+	 */
1040
+	function headers($xtra_headers = null, $overwrite = false, $skip_content = false)
1041
+	{
1042
+		// Add mime version header
1043
+		$headers['MIME-Version'] = '1.0';
1044
+
1045
+		// Content-Type and Content-Transfer-Encoding headers should already
1046
+		// be present if get() was called, but we'll re-set them to make sure
1047
+		// we got them when called before get() or something in the message
1048
+		// has been changed after get() [#14780]
1049
+		if (!$skip_content) {
1050
+			$headers += $this->_contentHeaders();
1051
+		}
1052
+
1053
+		if (!empty($xtra_headers)) {
1054
+			$headers = array_merge($headers, $xtra_headers);
1055
+		}
1056
+
1057
+		if ($overwrite) {
1058
+			$this->_headers = array_merge($this->_headers, $headers);
1059
+		} else {
1060
+			$this->_headers = array_merge($headers, $this->_headers);
1061
+		}
1062
+
1063
+		$headers = $this->_headers;
1064
+
1065
+		if ($skip_content) {
1066
+			unset($headers['Content-Type']);
1067
+			unset($headers['Content-Transfer-Encoding']);
1068
+			unset($headers['Content-Disposition']);
1069
+		} else if (!empty($this->_build_params['ctype'])) {
1070
+			$headers['Content-Type'] = $this->_build_params['ctype'];
1071
+		}
1072
+
1073
+		$encodedHeaders = $this->_encodeHeaders($headers);
1074
+		return $encodedHeaders;
1075
+	}
1076
+
1077
+	/**
1078
+	 * Get the text version of the headers
1079
+	 * (usefull if you want to use the PHP mail() function)
1080
+	 *
1081
+	 * @param array $xtra_headers Assoc array with any extra headers (optional)
1082
+	 *                            (Don't set Content-Type for multipart messages here!)
1083
+	 * @param bool  $overwrite    Overwrite the existing headers with new.
1084
+	 * @param bool  $skip_content Don't return content headers: Content-Type,
1085
+	 *                            Content-Disposition and Content-Transfer-Encoding
1086
+	 *
1087
+	 * @return string             Plain text headers
1088
+	 * @access public
1089
+	 */
1090
+	function txtHeaders($xtra_headers = null, $overwrite = false, $skip_content = false)
1091
+	{
1092
+		$headers = $this->headers($xtra_headers, $overwrite, $skip_content);
1093
+
1094
+		// Place Received: headers at the beginning of the message
1095
+		// Spam detectors often flag messages with it after the Subject: as spam
1096
+		if (isset($headers['Received'])) {
1097
+			$received = $headers['Received'];
1098
+			unset($headers['Received']);
1099
+			$headers = array('Received' => $received) + $headers;
1100
+		}
1101
+
1102
+		$ret = '';
1103
+		$eol = $this->_build_params['eol'];
1104
+
1105
+		foreach ($headers as $key => $val) {
1106
+			if (is_array($val)) {
1107
+				foreach ($val as $value) {
1108
+					$ret .= "$key: $value" . $eol;
1109
+				}
1110
+			} else {
1111
+				$ret .= "$key: $val" . $eol;
1112
+			}
1113
+		}
1114
+
1115
+		return $ret;
1116
+	}
1117
+
1118
+	/**
1119
+	 * Sets message Content-Type header.
1120
+	 * Use it to build messages with various content-types e.g. miltipart/raport
1121
+	 * not supported by _contentHeaders() function.
1122
+	 *
1123
+	 * @param string $type   Type name
1124
+	 * @param array  $params Hash array of header parameters
1125
+	 *
1126
+	 * @return void
1127
+	 * @access public
1128
+	 * @since 1.7.0
1129
+	 */
1130
+	function setContentType($type, $params = array())
1131
+	{
1132
+		$header = $type;
1133
+
1134
+		$eol = !empty($this->_build_params['eol'])
1135
+			? $this->_build_params['eol'] : "\r\n";
1136
+
1137
+		// add parameters
1138
+		$token_regexp = '#([^\x21\x23-\x27\x2A\x2B\x2D'
1139
+			. '\x2E\x30-\x39\x41-\x5A\x5E-\x7E])#';
1140
+		if (is_array($params)) {
1141
+			foreach ($params as $name => $value) {
1142
+				if ($name == 'boundary') {
1143
+					$this->_build_params['boundary'] = $value;
1144
+				}
1145
+				if (!preg_match($token_regexp, $value)) {
1146
+					$header .= ";$eol $name=$value";
1147
+				} else {
1148
+					$value = addcslashes($value, '\\"');
1149
+					$header .= ";$eol $name=\"$value\"";
1150
+				}
1151
+			}
1152
+		}
1153
+
1154
+		// add required boundary parameter if not defined
1155
+		if (preg_match('/^multipart\//i', $type)) {
1156
+			if (empty($this->_build_params['boundary'])) {
1157
+				$this->_build_params['boundary'] = '=_' . md5(rand() . microtime());
1158
+			}
1159
+
1160
+			$header .= ";$eol boundary=\"".$this->_build_params['boundary']."\"";
1161
+		}
1162
+
1163
+		$this->_build_params['ctype'] = $header;
1164
+	}
1165
+
1166
+	/**
1167
+	 * Sets the Subject header
1168
+	 *
1169
+	 * @param string $subject String to set the subject to.
1170
+	 *
1171
+	 * @return void
1172
+	 * @access public
1173
+	 */
1174
+	function setSubject($subject)
1175
+	{
1176
+		$this->_headers['Subject'] = $subject;
1177
+	}
1178
+
1179
+	/**
1180
+	 * Set an email to the From (the sender) header
1181
+	 *
1182
+	 * @param string $email The email address to use
1183
+	 *
1184
+	 * @return void
1185
+	 * @access public
1186
+	 */
1187
+	function setFrom($email)
1188
+	{
1189
+		$this->_headers['From'] = $email;
1190
+	}
1191
+
1192
+	/**
1193
+	 * Add an email to the To header
1194
+	 * (multiple calls to this method are allowed)
1195
+	 *
1196
+	 * @param string $email The email direction to add
1197
+	 *
1198
+	 * @return void
1199
+	 * @access public
1200
+	 */
1201
+	function addTo($email)
1202
+	{
1203
+		if (isset($this->_headers['To'])) {
1204
+			$this->_headers['To'] .= ", $email";
1205
+		} else {
1206
+			$this->_headers['To'] = $email;
1207
+		}
1208
+	}
1209
+
1210
+	/**
1211
+	 * Add an email to the Cc (carbon copy) header
1212
+	 * (multiple calls to this method are allowed)
1213
+	 *
1214
+	 * @param string $email The email direction to add
1215
+	 *
1216
+	 * @return void
1217
+	 * @access public
1218
+	 */
1219
+	function addCc($email)
1220
+	{
1221
+		if (isset($this->_headers['Cc'])) {
1222
+			$this->_headers['Cc'] .= ", $email";
1223
+		} else {
1224
+			$this->_headers['Cc'] = $email;
1225
+		}
1226
+	}
1227
+
1228
+	/**
1229
+	 * Add an email to the Bcc (blank carbon copy) header
1230
+	 * (multiple calls to this method are allowed)
1231
+	 *
1232
+	 * @param string $email The email direction to add
1233
+	 *
1234
+	 * @return void
1235
+	 * @access public
1236
+	 */
1237
+	function addBcc($email)
1238
+	{
1239
+		if (isset($this->_headers['Bcc'])) {
1240
+			$this->_headers['Bcc'] .= ", $email";
1241
+		} else {
1242
+			$this->_headers['Bcc'] = $email;
1243
+		}
1244
+	}
1245
+
1246
+	/**
1247
+	 * Since the PHP send function requires you to specify
1248
+	 * recipients (To: header) separately from the other
1249
+	 * headers, the To: header is not properly encoded.
1250
+	 * To fix this, you can use this public method to 
1251
+	 * encode your recipients before sending to the send
1252
+	 * function
1253
+	 *
1254
+	 * @param string $recipients A comma-delimited list of recipients
1255
+	 *
1256
+	 * @return string            Encoded data
1257
+	 * @access public
1258
+	 */
1259
+	function encodeRecipients($recipients)
1260
+	{
1261
+		$input = array("To" => $recipients);
1262
+		$retval = $this->_encodeHeaders($input);
1263
+		return $retval["To"] ;
1264
+	}
1265
+
1266
+	/**
1267
+	 * Encodes headers as per RFC2047
1268
+	 *
1269
+	 * @param array $input  The header data to encode
1270
+	 * @param array $params Extra build parameters
1271
+	 *
1272
+	 * @return array        Encoded data
1273
+	 * @access private
1274
+	 */
1275
+	function _encodeHeaders($input, $params = array())
1276
+	{
1277
+		$build_params = $this->_build_params;
1278
+		while (list($key, $value) = each($params)) {
1279
+			$build_params[$key] = $value;
1280
+		}
1281
+
1282
+		foreach ($input as $hdr_name => $hdr_value) {
1283
+			if (is_array($hdr_value)) {
1284
+				foreach ($hdr_value as $idx => $value) {
1285
+					$input[$hdr_name][$idx] = $this->encodeHeader(
1286
+						$hdr_name, $value,
1287
+						$build_params['head_charset'], $build_params['head_encoding']
1288
+					);
1289
+				}
1290
+			} else {
1291
+				$input[$hdr_name] = $this->encodeHeader(
1292
+					$hdr_name, $hdr_value,
1293
+					$build_params['head_charset'], $build_params['head_encoding']
1294
+				);
1295
+			}
1296
+		}
1297
+
1298
+		return $input;
1299
+	}
1300
+
1301
+	/**
1302
+	 * Encodes a header as per RFC2047
1303
+	 *
1304
+	 * @param string $name     The header name
1305
+	 * @param string $value    The header data to encode
1306
+	 * @param string $charset  Character set name
1307
+	 * @param string $encoding Encoding name (base64 or quoted-printable)
1308
+	 *
1309
+	 * @return string          Encoded header data (without a name)
1310
+	 * @access public
1311
+	 * @since 1.5.3
1312
+	 */
1313
+	function encodeHeader($name, $value, $charset, $encoding)
1314
+	{
1315
+		$mime_part = new Mail_mimePart;
1316
+		return $mime_part->encodeHeader(
1317
+			$name, $value, $charset, $encoding, $this->_build_params['eol']
1318
+		);
1319
+	}
1320
+
1321
+	/**
1322
+	 * Get file's basename (locale independent) 
1323
+	 *
1324
+	 * @param string $filename Filename
1325
+	 *
1326
+	 * @return string          Basename
1327
+	 * @access private
1328
+	 */
1329
+	function _basename($filename)
1330
+	{
1331
+		// basename() is not unicode safe and locale dependent
1332
+		if (stristr(PHP_OS, 'win') || stristr(PHP_OS, 'netware')) {
1333
+			return preg_replace('/^.*[\\\\\\/]/', '', $filename);
1334
+		} else {
1335
+			return preg_replace('/^.*[\/]/', '', $filename);
1336
+		}
1337
+	}
1338
+
1339
+	/**
1340
+	 * Get Content-Type and Content-Transfer-Encoding headers of the message
1341
+	 *
1342
+	 * @return array Headers array
1343
+	 * @access private
1344
+	 */
1345
+	function _contentHeaders()
1346
+	{
1347
+		$attachments = count($this->_parts)                 ? true : false;
1348
+		$html_images = count($this->_html_images)           ? true : false;
1349
+		$html        = strlen($this->_htmlbody)             ? true : false;
1350
+		$text        = (!$html && strlen($this->_txtbody))  ? true : false;
1351
+		$headers     = array();
1352
+
1353
+		// See get()
1354
+		switch (true) {
1355
+		case $text && !$attachments:
1356
+			$headers['Content-Type'] = 'text/plain';
1357
+			break;
1358
+
1359
+		case !$text && !$html && $attachments:
1360
+		case $text && $attachments:
1361
+		case $html && $attachments && !$html_images:
1362
+		case $html && $attachments && $html_images:
1363
+			$headers['Content-Type'] = 'multipart/mixed';
1364
+			break;
1365
+
1366
+		case $html && !$attachments && !$html_images && isset($this->_txtbody):
1367
+		case $html && !$attachments && $html_images && isset($this->_txtbody):
1368
+			$headers['Content-Type'] = 'multipart/alternative';
1369
+			break;
1370
+
1371
+		case $html && !$attachments && !$html_images && !isset($this->_txtbody):
1372
+			$headers['Content-Type'] = 'text/html';
1373
+			break;
1374
+
1375
+		case $html && !$attachments && $html_images && !isset($this->_txtbody):
1376
+			$headers['Content-Type'] = 'multipart/related';
1377
+			break;
1378
+
1379
+		default:
1380
+			return $headers;
1381
+		}
1382
+
1383
+		$this->_checkParams();
1384
+
1385
+		$eol = !empty($this->_build_params['eol'])
1386
+			? $this->_build_params['eol'] : "\r\n";
1387
+
1388
+		if ($headers['Content-Type'] == 'text/plain') {
1389
+			// single-part message: add charset and encoding
1390
+			$charset = 'charset=' . $this->_build_params['text_charset'];
1391
+			// place charset parameter in the same line, if possible
1392
+			// 26 = strlen("Content-Type: text/plain; ")
1393
+			$headers['Content-Type']
1394
+				.= (strlen($charset) + 26 <= 76) ? "; $charset" : ";$eol $charset";
1395
+			$headers['Content-Transfer-Encoding']
1396
+				= $this->_build_params['text_encoding'];
1397
+		} else if ($headers['Content-Type'] == 'text/html') {
1398
+			// single-part message: add charset and encoding
1399
+			$charset = 'charset=' . $this->_build_params['html_charset'];
1400
+			// place charset parameter in the same line, if possible
1401
+			$headers['Content-Type']
1402
+				.= (strlen($charset) + 25 <= 76) ? "; $charset" : ";$eol $charset";
1403
+			$headers['Content-Transfer-Encoding']
1404
+				= $this->_build_params['html_encoding'];
1405
+		} else {
1406
+			// multipart message: and boundary
1407
+			if (!empty($this->_build_params['boundary'])) {
1408
+				$boundary = $this->_build_params['boundary'];
1409
+			} else if (!empty($this->_headers['Content-Type'])
1410
+				&& preg_match('/boundary="([^"]+)"/', $this->_headers['Content-Type'], $m)
1411
+			) {
1412
+				$boundary = $m[1];
1413
+			} else {
1414
+				$boundary = '=_' . md5(rand() . microtime());
1415
+			}
1416
+
1417
+			$this->_build_params['boundary'] = $boundary;
1418
+			$headers['Content-Type'] .= ";$eol boundary=\"$boundary\"";
1419
+		}
1420
+
1421
+		return $headers;
1422
+	}
1423
+
1424
+	/**
1425
+	 * Validate and set build parameters
1426
+	 *
1427
+	 * @return void
1428
+	 * @access private
1429
+	 */
1430
+	function _checkParams()
1431
+	{
1432
+		$encodings = array('7bit', '8bit', 'base64', 'quoted-printable');
1433
+
1434
+		$this->_build_params['text_encoding']
1435
+			= strtolower($this->_build_params['text_encoding']);
1436
+		$this->_build_params['html_encoding']
1437
+			= strtolower($this->_build_params['html_encoding']);
1438
+
1439
+		if (!in_array($this->_build_params['text_encoding'], $encodings)) {
1440
+			$this->_build_params['text_encoding'] = '7bit';
1441
+		}
1442
+		if (!in_array($this->_build_params['html_encoding'], $encodings)) {
1443
+			$this->_build_params['html_encoding'] = '7bit';
1444
+		}
1445
+
1446
+		// text body
1447
+		if ($this->_build_params['text_encoding'] == '7bit'
1448
+			&& !preg_match('/ascii/i', $this->_build_params['text_charset'])
1449
+			&& preg_match('/[^\x00-\x7F]/', $this->_txtbody)
1450
+		) {
1451
+			$this->_build_params['text_encoding'] = 'quoted-printable';
1452
+		}
1453
+		// html body
1454
+		if ($this->_build_params['html_encoding'] == '7bit'
1455
+			&& !preg_match('/ascii/i', $this->_build_params['html_charset'])
1456
+			&& preg_match('/[^\x00-\x7F]/', $this->_htmlbody)
1457
+		) {
1458
+			$this->_build_params['html_encoding'] = 'quoted-printable';
1459
+		}
1460
+	}
1461
+
1462
+	/**
1463
+	 * PEAR::isError implementation
1464
+	 *
1465
+	 * @param mixed $data Object
1466
+	 *
1467
+	 * @return bool True if object is an instance of PEAR_Error
1468
+	 * @access private
1469
+	 */
1470
+	function _isError($data)
1471
+	{
1472
+		// PEAR::isError() is not PHP 5.4 compatible (see Bug #19473)
1473
+		if (is_object($data) && is_a($data, 'PEAR_Error')) {
1474
+			return true;
1475
+		}
1476
+
1477
+		return false;
1478
+	}
1479
+
1480
+	/**
1481
+	 * PEAR::raiseError implementation
1482
+	 *
1483
+	 * @param $message A text error message
1484
+	 *
1485
+	 * @return PEAR_Error Instance of PEAR_Error
1486
+	 * @access private
1487
+	 */
1488
+	function _raiseError($message)
1489
+	{
1490
+		// PEAR::raiseError() is not PHP 5.4 compatible
1491
+		return new PEAR_Error($message);
1492
+	}
1493 1493
 
1494 1494
 } // End of class
Please login to merge, or discard this patch.
webklex/php-imap/vendor/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php 1 patch
Indentation   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -12,21 +12,21 @@
 block discarded – undo
12 12
 namespace Carbon;
13 13
 
14 14
 if (!class_exists(LazyTranslator::class, false)) {
15
-    class LazyTranslator extends AbstractTranslator
16
-    {
17
-        /**
18
-         * Returns the translation.
19
-         *
20
-         * @param string|null $id
21
-         * @param array       $parameters
22
-         * @param string|null $domain
23
-         * @param string|null $locale
24
-         *
25
-         * @return string
26
-         */
27
-        public function trans($id, array $parameters = [], $domain = null, $locale = null)
28
-        {
29
-            return $this->translate($id, $parameters, $domain, $locale);
30
-        }
31
-    }
15
+	class LazyTranslator extends AbstractTranslator
16
+	{
17
+		/**
18
+		 * Returns the translation.
19
+		 *
20
+		 * @param string|null $id
21
+		 * @param array       $parameters
22
+		 * @param string|null $domain
23
+		 * @param string|null $locale
24
+		 *
25
+		 * @return string
26
+		 */
27
+		public function trans($id, array $parameters = [], $domain = null, $locale = null)
28
+		{
29
+			return $this->translate($id, $parameters, $domain, $locale);
30
+		}
31
+	}
32 32
 }
Please login to merge, or discard this patch.
php-imap/vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroBuiltin.php 1 patch
Indentation   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -16,16 +16,16 @@
 block discarded – undo
16 16
 use ReflectionMethod;
17 17
 
18 18
 if (!class_exists(AbstractReflectionMacro::class, false)) {
19
-    abstract class AbstractReflectionMacro extends AbstractMacro
20
-    {
21
-        /**
22
-         * {@inheritdoc}
23
-         */
24
-        public function getReflection(): ?ReflectionMethod
25
-        {
26
-            return $this->reflectionFunction instanceof ReflectionMethod
27
-                ? $this->reflectionFunction
28
-                : null;
29
-        }
30
-    }
19
+	abstract class AbstractReflectionMacro extends AbstractMacro
20
+	{
21
+		/**
22
+		 * {@inheritdoc}
23
+		 */
24
+		public function getReflection(): ?ReflectionMethod
25
+		{
26
+			return $this->reflectionFunction instanceof ReflectionMethod
27
+				? $this->reflectionFunction
28
+				: null;
29
+		}
30
+	}
31 31
 }
Please login to merge, or discard this patch.
webklex/php-imap/vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroWeakType.php 1 patch
Indentation   +30 added lines, -30 removed lines patch added patch discarded remove patch
@@ -14,36 +14,36 @@
 block discarded – undo
14 14
 namespace Carbon\PHPStan;
15 15
 
16 16
 if (!class_exists(LazyMacro::class, false)) {
17
-    abstract class LazyMacro extends AbstractReflectionMacro
18
-    {
19
-        /**
20
-         * {@inheritdoc}
21
-         *
22
-         * @return string|false
23
-         */
24
-        public function getFileName()
25
-        {
26
-            return $this->reflectionFunction->getFileName();
27
-        }
17
+	abstract class LazyMacro extends AbstractReflectionMacro
18
+	{
19
+		/**
20
+		 * {@inheritdoc}
21
+		 *
22
+		 * @return string|false
23
+		 */
24
+		public function getFileName()
25
+		{
26
+			return $this->reflectionFunction->getFileName();
27
+		}
28 28
 
29
-        /**
30
-         * {@inheritdoc}
31
-         *
32
-         * @return int|false
33
-         */
34
-        public function getStartLine()
35
-        {
36
-            return $this->reflectionFunction->getStartLine();
37
-        }
29
+		/**
30
+		 * {@inheritdoc}
31
+		 *
32
+		 * @return int|false
33
+		 */
34
+		public function getStartLine()
35
+		{
36
+			return $this->reflectionFunction->getStartLine();
37
+		}
38 38
 
39
-        /**
40
-         * {@inheritdoc}
41
-         *
42
-         * @return int|false
43
-         */
44
-        public function getEndLine()
45
-        {
46
-            return $this->reflectionFunction->getEndLine();
47
-        }
48
-    }
39
+		/**
40
+		 * {@inheritdoc}
41
+		 *
42
+		 * @return int|false
43
+		 */
44
+		public function getEndLine()
45
+		{
46
+			return $this->reflectionFunction->getEndLine();
47
+		}
48
+	}
49 49
 }
Please login to merge, or discard this patch.
php-imap/vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroStrongType.php 1 patch
Indentation   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -14,30 +14,30 @@
 block discarded – undo
14 14
 namespace Carbon\PHPStan;
15 15
 
16 16
 if (!class_exists(LazyMacro::class, false)) {
17
-    abstract class LazyMacro extends AbstractReflectionMacro
18
-    {
19
-        /**
20
-         * {@inheritdoc}
21
-         */
22
-        public function getFileName(): ?string
23
-        {
24
-            return $this->reflectionFunction->getFileName();
25
-        }
17
+	abstract class LazyMacro extends AbstractReflectionMacro
18
+	{
19
+		/**
20
+		 * {@inheritdoc}
21
+		 */
22
+		public function getFileName(): ?string
23
+		{
24
+			return $this->reflectionFunction->getFileName();
25
+		}
26 26
 
27
-        /**
28
-         * {@inheritdoc}
29
-         */
30
-        public function getStartLine(): ?int
31
-        {
32
-            return $this->reflectionFunction->getStartLine();
33
-        }
27
+		/**
28
+		 * {@inheritdoc}
29
+		 */
30
+		public function getStartLine(): ?int
31
+		{
32
+			return $this->reflectionFunction->getStartLine();
33
+		}
34 34
 
35
-        /**
36
-         * {@inheritdoc}
37
-         */
38
-        public function getEndLine(): ?int
39
-        {
40
-            return $this->reflectionFunction->getEndLine();
41
-        }
42
-    }
35
+		/**
36
+		 * {@inheritdoc}
37
+		 */
38
+		public function getEndLine(): ?int
39
+		{
40
+			return $this->reflectionFunction->getEndLine();
41
+		}
42
+	}
43 43
 }
Please login to merge, or discard this patch.
php-imap/vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroStatic.php 1 patch
Indentation   +20 added lines, -20 removed lines patch added patch discarded remove patch
@@ -17,25 +17,25 @@
 block discarded – undo
17 17
 use ReflectionMethod;
18 18
 
19 19
 if (!class_exists(AbstractReflectionMacro::class, false)) {
20
-    abstract class AbstractReflectionMacro extends AbstractMacro
21
-    {
22
-        /**
23
-         * {@inheritdoc}
24
-         */
25
-        public function getReflection(): ?Reflection\Adapter\ReflectionMethod
26
-        {
27
-            if ($this->reflectionFunction instanceof Reflection\Adapter\ReflectionMethod) {
28
-                return $this->reflectionFunction;
29
-            }
20
+	abstract class AbstractReflectionMacro extends AbstractMacro
21
+	{
22
+		/**
23
+		 * {@inheritdoc}
24
+		 */
25
+		public function getReflection(): ?Reflection\Adapter\ReflectionMethod
26
+		{
27
+			if ($this->reflectionFunction instanceof Reflection\Adapter\ReflectionMethod) {
28
+				return $this->reflectionFunction;
29
+			}
30 30
 
31
-            return $this->reflectionFunction instanceof ReflectionMethod
32
-                ? new Reflection\Adapter\ReflectionMethod(
33
-                    Reflection\ReflectionMethod::createFromName(
34
-                        $this->reflectionFunction->getDeclaringClass()->getName(),
35
-                        $this->reflectionFunction->getName()
36
-                    )
37
-                )
38
-                : null;
39
-        }
40
-    }
31
+			return $this->reflectionFunction instanceof ReflectionMethod
32
+				? new Reflection\Adapter\ReflectionMethod(
33
+					Reflection\ReflectionMethod::createFromName(
34
+						$this->reflectionFunction->getDeclaringClass()->getName(),
35
+						$this->reflectionFunction->getName()
36
+					)
37
+				)
38
+				: null;
39
+		}
40
+	}
41 41
 }
Please login to merge, or discard this patch.
webklex/php-imap/vendor/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php 1 patch
Indentation   +35 added lines, -35 removed lines patch added patch discarded remove patch
@@ -14,39 +14,39 @@
 block discarded – undo
14 14
 use Symfony\Component\Translation\MessageCatalogueInterface;
15 15
 
16 16
 if (!class_exists(LazyTranslator::class, false)) {
17
-    class LazyTranslator extends AbstractTranslator implements TranslatorStrongTypeInterface
18
-    {
19
-        public function trans(?string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string
20
-        {
21
-            return $this->translate($id, $parameters, $domain, $locale);
22
-        }
23
-
24
-        public function getFromCatalogue(MessageCatalogueInterface $catalogue, string $id, string $domain = 'messages')
25
-        {
26
-            $messages = $this->getPrivateProperty($catalogue, 'messages');
27
-
28
-            if (isset($messages[$domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX][$id])) {
29
-                return $messages[$domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX][$id];
30
-            }
31
-
32
-            if (isset($messages[$domain][$id])) {
33
-                return $messages[$domain][$id];
34
-            }
35
-
36
-            $fallbackCatalogue = $this->getPrivateProperty($catalogue, 'fallbackCatalogue');
37
-
38
-            if ($fallbackCatalogue !== null) {
39
-                return $this->getFromCatalogue($fallbackCatalogue, $id, $domain);
40
-            }
41
-
42
-            return $id;
43
-        }
44
-
45
-        private function getPrivateProperty($instance, string $field)
46
-        {
47
-            return (function (string $field) {
48
-                return $this->$field;
49
-            })->call($instance, $field);
50
-        }
51
-    }
17
+	class LazyTranslator extends AbstractTranslator implements TranslatorStrongTypeInterface
18
+	{
19
+		public function trans(?string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string
20
+		{
21
+			return $this->translate($id, $parameters, $domain, $locale);
22
+		}
23
+
24
+		public function getFromCatalogue(MessageCatalogueInterface $catalogue, string $id, string $domain = 'messages')
25
+		{
26
+			$messages = $this->getPrivateProperty($catalogue, 'messages');
27
+
28
+			if (isset($messages[$domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX][$id])) {
29
+				return $messages[$domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX][$id];
30
+			}
31
+
32
+			if (isset($messages[$domain][$id])) {
33
+				return $messages[$domain][$id];
34
+			}
35
+
36
+			$fallbackCatalogue = $this->getPrivateProperty($catalogue, 'fallbackCatalogue');
37
+
38
+			if ($fallbackCatalogue !== null) {
39
+				return $this->getFromCatalogue($fallbackCatalogue, $id, $domain);
40
+			}
41
+
42
+			return $id;
43
+		}
44
+
45
+		private function getPrivateProperty($instance, string $field)
46
+		{
47
+			return (function (string $field) {
48
+				return $this->$field;
49
+			})->call($instance, $field);
50
+		}
51
+	}
52 52
 }
Please login to merge, or discard this patch.
php-imap/vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php 1 patch
Indentation   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -15,5 +15,5 @@
 block discarded – undo
15 15
 
16 16
 interface CarbonConverterInterface
17 17
 {
18
-    public function convertDate(DateTimeInterface $dateTime, bool $negated = false): CarbonInterface;
18
+	public function convertDate(DateTimeInterface $dateTime, bool $negated = false): CarbonInterface;
19 19
 }
Please login to merge, or discard this patch.
webklex/php-imap/vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php 1 patch
Indentation   +79 added lines, -79 removed lines patch added patch discarded remove patch
@@ -17,83 +17,83 @@
 block discarded – undo
17 17
 
18 18
 class TranslatorImmutable extends Translator
19 19
 {
20
-    /** @var bool */
21
-    private $constructed = false;
22
-
23
-    public function __construct($locale, MessageFormatterInterface $formatter = null, $cacheDir = null, $debug = false)
24
-    {
25
-        parent::__construct($locale, $formatter, $cacheDir, $debug);
26
-        $this->constructed = true;
27
-    }
28
-
29
-    /**
30
-     * @codeCoverageIgnore
31
-     */
32
-    public function setDirectories(array $directories)
33
-    {
34
-        $this->disallowMutation(__METHOD__);
35
-
36
-        return parent::setDirectories($directories);
37
-    }
38
-
39
-    public function setLocale($locale)
40
-    {
41
-        $this->disallowMutation(__METHOD__);
42
-
43
-        return parent::setLocale($locale);
44
-    }
45
-
46
-    /**
47
-     * @codeCoverageIgnore
48
-     */
49
-    public function setMessages($locale, $messages)
50
-    {
51
-        $this->disallowMutation(__METHOD__);
52
-
53
-        return parent::setMessages($locale, $messages);
54
-    }
55
-
56
-    /**
57
-     * @codeCoverageIgnore
58
-     */
59
-    public function setTranslations($messages)
60
-    {
61
-        $this->disallowMutation(__METHOD__);
62
-
63
-        return parent::setTranslations($messages);
64
-    }
65
-
66
-    /**
67
-     * @codeCoverageIgnore
68
-     */
69
-    public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory)
70
-    {
71
-        $this->disallowMutation(__METHOD__);
72
-
73
-        parent::setConfigCacheFactory($configCacheFactory);
74
-    }
75
-
76
-    public function resetMessages($locale = null)
77
-    {
78
-        $this->disallowMutation(__METHOD__);
79
-
80
-        return parent::resetMessages($locale);
81
-    }
82
-
83
-    /**
84
-     * @codeCoverageIgnore
85
-     */
86
-    public function setFallbackLocales(array $locales)
87
-    {
88
-        $this->disallowMutation(__METHOD__);
89
-
90
-        parent::setFallbackLocales($locales);
91
-    }
92
-
93
-    private function disallowMutation($method)
94
-    {
95
-        if ($this->constructed) {
96
-            throw new ImmutableException($method.' not allowed on '.static::class);
97
-        }
98
-    }
20
+	/** @var bool */
21
+	private $constructed = false;
22
+
23
+	public function __construct($locale, MessageFormatterInterface $formatter = null, $cacheDir = null, $debug = false)
24
+	{
25
+		parent::__construct($locale, $formatter, $cacheDir, $debug);
26
+		$this->constructed = true;
27
+	}
28
+
29
+	/**
30
+	 * @codeCoverageIgnore
31
+	 */
32
+	public function setDirectories(array $directories)
33
+	{
34
+		$this->disallowMutation(__METHOD__);
35
+
36
+		return parent::setDirectories($directories);
37
+	}
38
+
39
+	public function setLocale($locale)
40
+	{
41
+		$this->disallowMutation(__METHOD__);
42
+
43
+		return parent::setLocale($locale);
44
+	}
45
+
46
+	/**
47
+	 * @codeCoverageIgnore
48
+	 */
49
+	public function setMessages($locale, $messages)
50
+	{
51
+		$this->disallowMutation(__METHOD__);
52
+
53
+		return parent::setMessages($locale, $messages);
54
+	}
55
+
56
+	/**
57
+	 * @codeCoverageIgnore
58
+	 */
59
+	public function setTranslations($messages)
60
+	{
61
+		$this->disallowMutation(__METHOD__);
62
+
63
+		return parent::setTranslations($messages);
64
+	}
65
+
66
+	/**
67
+	 * @codeCoverageIgnore
68
+	 */
69
+	public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory)
70
+	{
71
+		$this->disallowMutation(__METHOD__);
72
+
73
+		parent::setConfigCacheFactory($configCacheFactory);
74
+	}
75
+
76
+	public function resetMessages($locale = null)
77
+	{
78
+		$this->disallowMutation(__METHOD__);
79
+
80
+		return parent::resetMessages($locale);
81
+	}
82
+
83
+	/**
84
+	 * @codeCoverageIgnore
85
+	 */
86
+	public function setFallbackLocales(array $locales)
87
+	{
88
+		$this->disallowMutation(__METHOD__);
89
+
90
+		parent::setFallbackLocales($locales);
91
+	}
92
+
93
+	private function disallowMutation($method)
94
+	{
95
+		if ($this->constructed) {
96
+			throw new ImmutableException($method.' not allowed on '.static::class);
97
+		}
98
+	}
99 99
 }
Please login to merge, or discard this patch.