File: 0.00.1a/core/Email.php (View as Code)

1: 2: /* ------------------------------------------------------------- 3: This file is part of FreeDESK 4: 5: FreeDESK is (C) Copyright 2012 David Cutting 6: 7: FreeDESK is free software: you can redistribute it and/or modify 8: it under the terms of the GNU General Public License as published by 9: the Free Software Foundation, either version 3 of the License, or 10: (at your option) any later version. 11: 12: FreeDESK is distributed in the hope that it will be useful, 13: but WITHOUT ANY WARRANTY; without even the implied warranty of 14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15: GNU General Public License for more details. 16: 17: You should have received a copy of the GNU General Public License 18: along with FreeDESK. If not, see www.gnu.org/licenses 19: 20: For more information see www.purplepixie.org/freedesk/ 21: -------------------------------------------------------------- */ 22: 23: /** 24: * Email Class - provides email sending functionality for FreeDESK 25: **/ 26: class Email 27: { 28: /** 29: * FreeDESK instance 30: **/ 31: private $DESK = null; 32: 33: /** 34: * Account Data loaded flag 35: **/ 36: private $loaded = false; 37: 38: /** 39: * Email account information 40: **/ 41: private $accounts = array(); 42: 43: /** 44: * Email account count 45: **/ 46: private $accountCount = 0; 47: 48: /** 49: * Constructor 50: * @param mixed &$freeDESK FreeDESK instance 51: **/ 52: function Email(&$freeDESK) 53: { 54: $this->DESK = &$freeDESK; 55: $this->DESK->PluginManager->Register(new Plugin( 56: "Email System", "0.01", "Core" )); 57: $this->DESK->Include->IncludeFile("core/phpmailer/class.phpmailer.php"); 58: $this->DESK->Include->IncludeFile("core/phpmailer/class.smtp.php"); 59: $this->DESK->PluginManager->Register(new Plugin( 60: "phpMailer", "5.2.1", "Email" )); 61: $this->DESK->PermissionManager->Register("email_accounts",false); 62: $this->DESK->PermissionManager->Register("email_templates",false); 63: } 64: 65: /** 66: * Load account information 67: **/ 68: private function LoadAccounts() 69: { 70: if (!$this->loaded) 71: { 72: $q="SELECT * FROM ".$this->DESK->Database->Table("email"); 73: $r=$this->DESK->Database->Query($q); 74: $this->accountCount = 0; 75: $this->accounts = array(); 76: while ($row=$this->DESK->Database->FetchAssoc($r)) 77: { 78: $this->accountCount++; 79: $this->accounts[$row['accountid']] = $row; 80: } 81: $this->DESK->Database->Free($r); 82: $this->loaded = true; 83: } 84: } 85: 86: /** 87: * Check if there are email accounts 88: * @return bool Account indicator flag 89: **/ 90: function hasAccounts() 91: { 92: if (!$this->loaded) 93: $this->LoadAccounts(); 94: if ($this->accountCount > 0) 95: return true; 96: return false; 97: } 98: 99: /** 100: * Get email accounts 101: * @return array Email account data 102: **/ 103: function GetAccounts() 104: { 105: if (!$this->loaded) 106: $this->LoadAccounts(); 107: return $this->accounts; 108: } 109: 110: /** 111: * Save/Create Email account 112: * @param string $name Account name 113: * @param string $host SMTP host 114: * @param string $from From email 115: * @param string $fromName From Name 116: * @param int $wordwrap Word Wrap 117: * @param int $auth Use Authentication 118: * @param string $username Username 119: * @param string $password Password 120: * @param string $smtpsec SMTP Security Mode 121: * @param int $id Account ID (optional, default 0=create new) 122: **/ 123: function SaveAccount($name, $host, $from, $fromName, $wordwrap, $auth, $username, 124: $password, $smtpsec, $id=0) 125: { 126: if ($id == 0) 127: { 128: $q="INSERT INTO ".$this->DESK->Database->Table("email")."("; 129: $q.=$this->DESK->Database->Field("name").","; 130: $q.=$this->DESK->Database->Field("host").","; 131: $q.=$this->DESK->Database->Field("from").","; 132: $q.=$this->DESK->Database->Field("fromname").","; 133: $q.=$this->DESK->Database->Field("wordwrap").","; 134: $q.=$this->DESK->Database->Field("auth").","; 135: $q.=$this->DESK->Database->Field("username").","; 136: $q.=$this->DESK->Database->Field("password").","; 137: $q.=$this->DESK->Database->Field("smtpsec").") "; 138: $q.="VALUES("; 139: $q.=$this->DESK->Database->SafeQuote($name).","; 140: $q.=$this->DESK->Database->SafeQuote($host).","; 141: $q.=$this->DESK->Database->SafeQuote($from).","; 142: $q.=$this->DESK->Database->SafeQuote($fromName).","; 143: $q.=$this->DESK->Database->Safe($wordwrap).","; 144: $q.=$this->DESK->Database->Safe($auth).","; 145: $q.=$this->DESK->Database->SafeQuote($username).","; 146: $q.=$this->DESK->Database->SafeQuote($password).","; 147: $q.=$this->DESK->Database->SafeQuote($smtpsec).")"; 148: 149: $this->DESK->Database->Query($q); 150: } 151: else 152: { 153: $q="UPDATE ".$this->DESK->Database->Table("email")." SET "; 154: $q.=$this->DESK->Database->Field("name")."=".$this->DESK->Database->SafeQuote($name).","; 155: $q.=$this->DESK->Database->Field("host")."=".$this->DESK->Database->SafeQuote($host).","; 156: $q.=$this->DESK->Database->Field("from")."=".$this->DESK->Database->SafeQuote($from).","; 157: $q.=$this->DESK->Database->Field("fromname")."=".$this->DESK->Database->SafeQuote($fromName).","; 158: $q.=$this->DESK->Database->Field("wordwrap")."=".$this->DESK->Database->Safe($wordwrap).","; 159: $q.=$this->DESK->Database->Field("auth")."=".$this->DESK->Database->Safe($auth).","; 160: $q.=$this->DESK->Database->Field("username")."=".$this->DESK->Database->SafeQuote($username).","; 161: $q.=$this->DESK->Database->Field("password")."=".$this->DESK->Database->SafeQuote($password).","; 162: $q.=$this->DESK->Database->Field("smtpsec")."=".$this->DESK->Database->SafeQuote($smtpsec)." "; 163: $q.="WHERE "; 164: $q.=$this->DESK->Database->Field("accountid")."=".$this->DESK->Database->Safe($id); 165: 166: $this->DESK->Database->Query($q); 167: } 168: } 169: 170: /** 171: * Delete Email account 172: * @param int $id Account ID 173: **/ 174: function DeleteAccount($id) 175: { 176: $q="DELETE FROM ".$this->DESK->Database->Table("email")." WHERE ".$this->DESK->Database->Field("accountid")."=".$this->DESK->Database->Safe($id); 177: $this->DESK->Database->Query($q); 178: } 179: 180: /** 181: * Send an email 182: * @param int $id Account ID 183: * @param string $to To Address 184: * @param string $subject Subject 185: * @param string $body Body 186: * @return bool Indicates successfully sent 187: **/ 188: function Send($id, $to, $subject, $body) 189: { 190: if (!$this->loaded) 191: $this->LoadAccounts(); 192: 193: if (!isset($this->accounts[$id])) 194: return false; 195: $acc = $this->accounts[$id]; 196: 197: $mail = new PHPMailer(); 198: 199: //$mail->SMTPDebug=2; 200: 201: $mail->Subject = $subject; 202: $mail->Body = $body; 203: $mail->AddAddress($to); 204: $mail->SetFrom($acc['from'], $acc['fromname']); 205: $mail->WordWrap = $acc['wordwrap']; 206: 207: if ($acc['host'] != "") 208: { 209: $mail->IsSMTP(); 210: if (strpos($acc['host'],":") !== false) 211: { 212: $parts = explode(":", $acc['host']); 213: $mail->Host=$parts[0]; 214: $mail->Port=$parts[1]; 215: } 216: else 217: $mail->Host=$acc['host']; 218: if ($acc['auth'] == 1) 219: { 220: $mail->SMTPAuth = true; 221: $mail->Username = $acc['username']; 222: $mail->Password = $acc['password']; 223: } 224: if ($acc['smtpsec'] != "") 225: { 226: $mail->SMTPSecure = $acc['smtpsec']; 227: } 228: } 229: 230: //print_r($mail); 231: 232: if (!$mail->Send()) // Failed 233: { 234: $this->DESK->LoggingEngine->Log("Email Failed to ".$to, "Email", "Fail", 2); 235: $this->DESK->LoggingEngine->Log("phpMailer: ".$mail->ErrorInfo,"Email","Error", 2); 236: return false; 237: } 238: else 239: { 240: $this->DESK->LoggingEngine->Log("Email Sent to ".$to, "Email", "Send", 8); 241: return true; 242: } 243: } 244: 245: /** 246: * Load Templates 247: * @param bool $force Force reload (optional, default false) 248: **/ 249: private function LoadTemplates($force=false) 250: { 251: if (!$this->loadedTemplates || $force) 252: { 253: $this->templates = array(); 254: $q="SELECT * FROM ".$this->DESK->Database->Table("templates"); 255: $r=$this->DESK->Database->Query($q); 256: while ($row=$this->DESK->Database->FetchAssoc($r)) 257: { 258: $this->templates[$row['templateid']] = $row; 259: } 260: $this->loadedTemplates = true; 261: } 262: } 263: 264: /** 265: * Save (or create) a template 266: * @param string $id Template ID 267: * @param string $subject Subject 268: * @param string $body Body 269: **/ 270: function SaveTemplate($id, $subject, $body) 271: { 272: $this->LoadTemplates(); 273: // Check if it exists 274: if (isset($this->templates[$id])) 275: { 276: $q="UPDATE ".$this->DESK->Database->Table("templates")." SET "; 277: $q.=$this->DESK->Database->Field("subject")."=".$this->DESK->Database->SafeQuote($subject).","; 278: $q.=$this->DESK->Database->Field("body")."=".$this->DESK->Database->SafeQuote($body)." "; 279: $q.="WHERE ".$this->DESK->Database->Field("templateid")."=".$this->DESK->Database->SafeQuote($id); 280: $this->DESK->Database->Query($q); 281: } 282: else 283: { 284: $q="INSERT INTO ".$this->DESK->Database->Table("templates")."("; 285: $q.=$this->DESK->Database->Field("templateid").","; 286: $q.=$this->DESK->Database->Field("subject").","; 287: $q.=$this->DESK->Database->Field("body").")"; 288: $q.=" VALUES("; 289: $q.=$this->DESK->Database->SafeQuote($id).","; 290: $q.=$this->DESK->Database->SafeQuote($subject).","; 291: $q.=$this->DESK->Database->SafeQuote($body).")"; 292: $this->DESK->Database->Query($q); 293: } 294: $this->LoadTemplates(true); 295: } 296: 297: /** 298: * Get a template by ID 299: * @param string $id ID 300: * @return mixed String of template on success or bool false on failure 301: **/ 302: function GetTemplate($id) 303: { 304: $this->LoadTemplates(); 305: 306: if (isset($this->templates[$id])) 307: return $this->templates[$id]; 308: return false; 309: } 310: 311: /** 312: * Get a substituted template by ID 313: * @param string $id ID 314: * @param array $data Data array (macro => value) 315: * @return mixed String of sub'd template on success or bool false on failure 316: **/ 317: function GetSubTemplate($id, $data) 318: { 319: $temp = $this->GetTemplate($id); 320: if ($temp === false) 321: return false; 322: foreach($data as $key => $val) 323: { 324: $macro = "%".$key."%"; 325: $temp['subject'] = str_replace($macro, $val, $temp['subject']); 326: $temp['body'] = str_replace($macro, $val, $temp['body']); 327: } 328: return $temp; 329: } 330: } 331: ?> 332: