* @version $Id$ */ /** * New eGW send-class. It implements the old interface (msg-method) on top of PHPMailer. * * The configuration is read via emailadmin_account::get_default_acc_id(true); // true=SMTP */ class send extends egw_mailer { var $err = array(); var $to_res = array(); // switching on debug with a numeric value other than 0, switches debug in PHPMailer/SMTP Class on var $debug = false; /** * eGW specific initialisation of the PHPMailer: charset, language, smtp-host, ... * * To be able to call PHPMailer's Send function, we check if a subject, body or address is set and call it in that case, * else we do our constructors work. */ function send() { if ($this->debug && is_numeric($this->debug)) $this->SMTPDebug = $this->debug; if ($this->Subject || $this->Body || count($this->to)) { if ($this->debug) error_log(__METHOD__." ".print_r($this->Subject,true)." to be send"); return PHPMailer::Send(); } parent::__construct(); // calling parent constructor $this->CharSet = translation::charset(); $this->IsSmtp(); // smtp settings from default account of current user $account = emailadmin_account::read(emailadmin_account::get_default_acc_id(true)); // true=SMTP $this->Host = $account->acc_smtp_host; $this->Port = $account->acc_smtp_port; switch($account->acc_smtp_ssl) { case emailadmin_account::SSL_TLS: // requires modified PHPMailer, or comment next two lines to use just ssl! $this->Host = 'tlsv1://'.$this->Host; break; case emailadmin_account::SSL_SSL: $this->Host = 'ssl://'.$this->Host; break; case emailadmin_account::SSL_STARTTLS: // PHPMailer uses 'tls' for STARTTLS, not ssl connection with tls version >= 1 and no sslv2/3 $this->Host = 'tls://'.$this->Host; } $this->SMTPAuth = !empty($account->acc_smtp_username); $this->Username = $account->acc_smtp_username; $this->Password = $account->acc_smtp_password; $this->defaultDomain = $account->acc_domain; // we do not want to use the phpmailer defaults, as it is bound to fail anyway // !from should be connected to the account used! $this->From = ''; $this->FromName = ''; // use smpt-username as sender, if available, but only if it is a full email address // we use setFrom as of from now on as it sets From, FromName and Sender // error_log(__METHOD__.__LINE__.array2string($account)); $Sender = $account->acc_smtp_username && strpos($account->acc_smtp_username, '@') !== false ? $account->acc_smtp_username : $account->ident_email; /*emailadmin_account Object has some possible info on the accounts realname [acc_name] => example given (mail@domain.suffix) [ident_realname] => example given [ident_email] => mail@domain.suffix (maybe this is the content of $Sender !) [ident_org] => not considered [ident_name] => example */ $Name = ($account['ident_realname']?$account['ident_realname']:($account['ident_name']?$account['ident_name']: ($account['acc_name']?$account['acc_name']:$Sender))); //error_log(__METHOD__.__LINE__.$Sender.','.$Name); $this->setFrom($Sender,$Name); $this->Hostname = $GLOBALS['egw_info']['server']['hostname']; if ($this->debug) error_log(__METHOD__."() initialised egw_mailer with ".array2string($this)." from mail default account ".array2string($account->params)); } /** * Reset all Settings to send multiple Messages */ function ClearAll() { $this->err = array(); $this->Subject = $this->Body = $this->AltBody = ''; $this->IsHTML(False); $this->ClearAllRecipients(); $this->ClearAttachments(); $this->ClearCustomHeaders(); $this->FromName = $GLOBALS['egw_info']['user']['account_fullname']; $this->From = $GLOBALS['egw_info']['user']['account_email']; $this->AddCustomHeader('X-Mailer:eGroupWare (http://www.eGroupWare.org)'); } /** * Emulating the old send::msg interface for compatibility with existing code * * You can either use that code or the PHPMailer variables and methods direct. */ function msg($service, $to, $subject, $body, $msgtype='', $cc='', $bcc='', $from='', $sender='', $content_type='', $boundary='Message-Boundary') { if ($this->debug) error_log(__METHOD__." to='$to',subject='$subject',,'$msgtype',cc='$cc',bcc='$bcc',from='$from',sender='$sender'"); unset($boundary); // not used, but required by function signature //echo "

send::msg(,to='$to',subject='$subject',,'$msgtype',cc='$cc',bcc='$bcc',from='$from',sender='$sender','$content_type','$boundary')

$body
\n"; $this->ClearAll(); // reset everything to its default, we might be called more then once !!! if ($service != 'email') { return False; } if ($from) { $matches = null; if (preg_match('/"?(.+)"?<(.+)>/',$from,$matches)) { list(,$this->FromName,$this->From) = $matches; } else { $this->From = $from; $this->FromName = ''; } } if ($sender) { $this->Sender = $sender; } foreach(array('to','cc','bcc') as $adr) { if ($$adr) { if (is_string($$adr) && preg_match_all('/"?(.+)"?<(.+)>,?/',$$adr,$matches)) { $names = $matches[1]; $addresses = $matches[2]; } else { $addresses = is_string($$adr) ? explode(',',trim($$adr)) : explode(',',trim(array_shift($$adr))); $names = array(); } $method = 'Add'.($adr == 'to' ? 'Address' : $adr); foreach($addresses as $n => $address) { $this->$method($address,$names[$n]); } } } if (!empty($msgtype)) { $this->AddCustomHeader('X-eGW-Type: '.$msgtype); } if ($content_type) { $this->ContentType = $content_type; } $this->Subject = $subject; $this->Body = $body; //echo "PHPMailer =
".print_r($this,True)."
\n"; if (!$this->Send()) { $this->err = array( 'code' => 1, // we dont get a numerical code from PHPMailer 'msg' => $this->ErrorInfo, 'desc' => $this->ErrorInfo, ); return False; } return True; } /** * encode 8-bit chars in subject-line * * @deprecated This is not needed any more, as it is done be PHPMailer, but older code depend on it. */ function encode_subject($subject) { return $subject; } }