Newer
Older
<?php
/*********************************************************************
class.mailer.php
osTicket mailer
It's mainly PEAR MAIL wrapper for now (more improvements planned).
Peter Rotich <peter@osticket.com>
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
http://www.osticket.com
Released under the GNU General Public License WITHOUT ANY WARRANTY.
See LICENSE.TXT for details.
vim: expandtab sw=4 ts=4 sts=4:
**********************************************************************/
include_once(INCLUDE_DIR.'class.email.php');
class Mailer {
var $email;
var $ht = array();
var $attachments = array();
var $smtp = array();
var $eol="\n";
function Mailer($email=null, $options=null) {
global $cfg;
if(is_object($email) && $email->isSMTPEnabled() && ($info=$email->getSMTPInfo())) { //is SMTP enabled for the current email?
$this->smtp = $info;
} elseif($cfg && ($e=$cfg->getDefaultSMTPEmail()) && $e->isSMTPEnabled()) { //What about global SMTP setting?
$this->smtp = $e->getSMTPInfo();
if(!$e->allowSpoofing() || !$email)
$email = $e;
} elseif(!$email && $cfg && ($e=$cfg->getDefaultEmail())) {
if($e->isSMTPEnabled() && ($info=$email->getSMTPInfo()))
$this->smtp = $info;
$email = $e;
}
$this->email = $email;
$this->attachments = array();
}
function getEOL() {
return $this->eol;
}
function getEmail() {
return $this->email;
}
function getSMTPInfo() {
return $this->smtp;
}
/* FROM Address */
function setFromAddress($from) {
$this->ht['from'] = $from;
}
function getFromAddress() {
if(!$this->ht['from'] && ($email=$this->getEmail()))
$this->ht['from'] =sprintf('"%s" <%s>', ($email->getName()?$email->getName():$email->getEmail()), $email->getEmail());
return $this->ht['from'];
}
/* attachments */
function getAttachments() {
return $this->attachments;
}
function addAttachment($attachment) {
$this->attachments[] = $attachment;
}
function addAttachments($attachments) {
$this->attachments = array_merge($this->attachments, $attachments);
}
function send($to, $subject, $message, $options=null) {
global $ost;
//Get the goodies
require_once (PEAR_DIR.'Mail.php'); // PEAR Mail package
require_once (PEAR_DIR.'Mail/mime.php'); // PEAR Mail_Mime packge
//do some cleanup
$to = preg_replace("/(\r\n|\r|\n)/s",'', trim($to));
$subject = preg_replace("/(\r\n|\r|\n)/s",'', trim($subject));
//We're decoding html entities here becasuse we only support plain text for now - html support comming.
$body = Format::htmldecode(preg_replace("/(\r\n|\r)/s", "\n", trim($message)));
/* Message ID - generated for each outgoing email */
$messageId = sprintf('<%s%d-%s>', Misc::randCode(6), time(),
($this->getEmail()?$this->getEmail()->getEmail():'@osTicketMailer'));
$headers = array (
'From' => $this->getFromAddress(),
'To' => $to,
'Subject' => $subject,
'Date'=> date('D, d M Y H:i:s O'),
'Message-ID' => $messageId,
'X-Mailer' =>'osTicket Mailer'
);
//Set bulk/auto-response headers.
if($options && ($options['autoreply'] or $options['bulk'])) {
$headers+= array(
'X-Autoreply' => 'yes',
'X-Auto-Response-Suppress' => 'ALL, AutoReply',
'Auto-Submitted' => 'auto-replied');
if($options['bulk'])
$headers+= array('Precedence' => 'bulk');
else
$headers+= array('Precedence' => 'auto_reply');
}
$mime = new Mail_mime();
$mime->setTXTBody($body);
//XXX: Attachments
if(($attachments=$this->getAttachments())) {
foreach($attachments as $attachment) {
if($attachment['file_id'] && ($file=AttachmentFile::lookup($attachment['file_id'])))
$mime->addAttachment($file->getData(),$file->getType(), $file->getName(),false);
elseif($attachment['file'] && file_exists($attachment['file']) && is_readable($attachment['file']))
$mime->addAttachment($attachment['file'],$attachment['type'],$attachment['name']);
}
}
//Desired encodings...
$encodings=array(
'head_encoding' => 'quoted-printable',
'text_encoding' => 'quoted-printable',
'html_encoding' => 'base64',
'html_charset' => 'utf-8',
'text_charset' => 'utf-8',
'head_charset' => 'utf-8'
);
//encode the body
$body = $mime->get($encodings);
//encode the headers.
$headers = $mime->headers($headers, true);
if(($smtp=$this->getSMTPInfo())) { //Send via SMTP
$mail = mail::factory('smtp',
array ('host' => $smtp['host'],
'port' => $smtp['port'],
'username' => $smtp['username'],
'password' => $smtp['password'],
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
'debug' => false,
));
$result = $mail->send($to, $headers, $body);
if(!PEAR::isError($result))
return $messageId;
$alert=sprintf("Unable to email via SMTP:%s:%d [%s]\n\n%s\n",
$smtp['host'], $smtp['port'], $smtp['username'], $result->getMessage());
$this->logError($alert);
}
//No SMTP or it failed....use php's native mail function.
$mail = mail::factory('mail');
return PEAR::isError($mail->send($to, $headers, $body))?false:$messageId;
}
function logError($error) {
global $ost;
//NOTE: Admin alert overwrite - don't email when having email trouble!
$ost->logError('Mailer Error', $error, false);
}
/******* Static functions ************/
//Emails using native php mail function - if DB connection doesn't exist.
//Don't use this function if you can help it.
function sendmail($to, $subject, $message, $from) {
$mailer = new Mailer();
$mailer->setFromAddress($from);
return $mailer->send($to, $subject, $message);
}
}
?>