getEmailEventId(); $object =& $event->getObject(); $parent_info = $object->getLinkedInfo(); $sql = 'SELECT '.$object->IDField.' FROM '.$object->TableName.' WHERE ('.$parent_info['ForeignKey'].' = '.$parent_info['ParentId'].') AND (EventId = '.$email_event_id.')'; $id = (int)$this->Conn->GetOne($sql); if(!$id) { $object->SetDBField('EventId', $email_event_id); $object->SetDBField('Headers', $this->Application->ConfigValue('Smtp_DefaultHeaders') ); } return $id; } function getEmailEventId() { return parent::getPassedID( new kEvent('emailevents:OnDummy') ); } /** * Apply any custom changes to list's sql query * * @param kEvent $event * @access protected * @see OnListBuild */ function SetCustomQuery(&$event) { if ($event->Special == 'module') { $object =& $event->getObject(); $module = $this->Application->GetVar('module'); $object->addFilter('module_filter', 'Module = '.$this->Conn->qstr($module)); } } /** * If loading empty item, then set parent id * * @param kEvent $event */ function OnBeforeItemLoad(&$event) { if( !$event->getEventParam('id') ) { $this->OnNew($event); $event->status = erFATAL; } } /** * Parse message template (split into header, subject & body) * * @param kEvent $event */ function OnAfterItemLoad(&$event) { $object =& $event->getObject(); $lines = explode("\n", $object->GetDBField('Template') ); $headers = Array(); foreach($lines as $line) { if( strlen(trim($line)) == 0 || ($line == '.') ) break; $parts = explode(':', $line, 2); if(strtolower($parts[0]) == 'subject') { $object->SetDBField('Subject', trim($parts[1]) ); } else { $headers[] = $line; } } $object->SetDBField('Headers', implode("\n", $headers) ); $message_body = ''; while( (list($line_id,$line) = each($lines)) ) { $message_body .= $line; } $object->SetDBField('Body', $message_body); } /** * Merge body+subject+headers into message template * * @param kEvent $event */ function OnBeforeItemUpdate(&$event) { $this->parseVirtualFields($event); } /** * Merge body+subject+headers into message template * * @param kEvent $event */ function OnBeforeItemCreate(&$event) { $this->parseVirtualFields($event); } /** * Merge body+subject+headers into message template * * @param kEvent $event */ function parseVirtualFields(&$event) { $object =& $event->getObject(); if( $object->GetDBField('Headers') || $object->GetDBField('Subject') || $object->GetDBField('Body') ) { $ret = $object->GetDBField('Headers'); if($ret) $ret .= "\n"; $ret = $this->removeTrailingCRLF($ret); $ret .= 'Subject: '.$object->GetDBField('Subject')."\n\n"; $ret .= $object->GetDBField('Body'); $object->SetDBField('Template', $ret); } } /** * Remove trailing CR/LF chars from string * * @param string $string * @return string */ function removeTrailingCRLF($string) { return preg_replace('/(\n|\r)+/',"\\1",$string); } /** * Prepares selected user(-s) or group(-s) for message sending * * @param kEvent $event */ function OnPrepareMassRecipients(&$event) { $object =& $event->getObject( Array('skip_autoload' => true) ); /* @var $object kDBItem */ $object->Clear(0); $event->redirect = false; $this->Application->RemoveVar('recipient_ids'); $this->Application->RemoveVar('recipient_type'); $this->saveMassRecipients('u'); $this->saveMassRecipients('g', 'total'); } function saveMassRecipients($prefix, $special = '') { $recipients = $this->Application->GetVar(rtrim($prefix.'_'.$special, '_')); if ($recipients) { $this->Application->StoreVar('recipient_ids', implode(',', array_keys($recipients))); $this->Application->StoreVar('recipient_type', $prefix); } } /** * Sends mass mail * * @param kEvent $event */ function OnMassMail(&$event) { $object =& $event->getObject( Array('skip_autoload' => true) ); /* @var $object kDBItem */ $object->setRequired('MassSubject', true); $items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) ); if ($items_info) { list($id, $field_values) = each($items_info); $object->SetFieldsFromHash($field_values); } if (!$object->Validate()) { $event->redirect = false; $event->status = erFAIL; $object->setID($id); return ; } $esender =& $this->Application->recallObject('EmailSender'); /* @var $esender kEmailSendingHelper */ $fields_hash = $object->GetFieldValues(); list ($fields_hash['FromEmail'], $fields_hash['FromName']) = $this->getSenderData(); if ($fields_hash['MassAttachment']) { $field_options = $object->GetFieldOptions('MassAttachment'); $fields_hash['MassAttachment'] = $field_options['upload_dir'].$fields_hash['MassAttachment']; } $recipients = $this->getRecipientEmails(); foreach ($recipients as $recipient_email) { $this->sendMessage($fields_hash, $recipient_email, $esender); } // remove any temporary data $this->Application->RemoveVar('recipient_ids'); $this->Application->RemoveVar('recipient_type'); $this->Application->RemoveVar('email_queue_progress'); if ($fields_hash['MassAttachment']) { unlink(FULL_PATH.$fields_hash['MassAttachment']); } $event->redirect = 'emails/send_queue'; } function getRecipientEmails() { $recipient_type = $this->Application->RecallVar('recipient_type'); $recipient_ids = $this->Application->RecallVar('recipient_ids'); if ($recipient_type == 'u') { $sql = 'SELECT Email FROM '.TABLE_PREFIX.'PortalUser WHERE PortalUserId IN ('.$recipient_ids.')'; } else { $sql = 'SELECT u.Email FROM '.TABLE_PREFIX.'UserGroup ug LEFT JOIN '.TABLE_PREFIX.'PortalUser u ON ug.PortalUserId = u.PortalUserId WHERE ug.GroupId IN ('.$recipient_ids.')'; } return $this->Conn->GetCol($sql); } /** * Puts message to email queue for sending * * @param Array $fields_hash * @param string $to_email recipient's email address * @param kEmailSendingHelper $esender */ function sendMessage($fields_hash, $to_email, &$esender) { $esender->SetFrom($fields_hash['FromEmail'], $fields_hash['FromName']); $esender->AddTo($to_email); $esender->SetSubject($fields_hash['MassSubject']); $esender->SetBody($fields_hash['MassHtmlMessage'], $fields_hash['MassTextMessage']); // add attachment if any if ($fields_hash['MassAttachment']) { $esender->AddAttachment(FULL_PATH.$fields_hash['MassAttachment']); } $status = $esender->Deliver(null, false); if ($status) { // write to log $fields_hash = Array ( 'fromuser' => $fields_hash['FromName'], 'addressto' => $to_email, 'subject' => $fields_hash['MassSubject'], 'timestamp' => adodb_mktime(), 'event' => '', ); $this->Conn->doInsert($fields_hash, TABLE_PREFIX.'EmailLog'); } } /** * Returns mass mail sender name & email * * @return Array */ function getSenderData() { $user =& $this->Application->recallObject('u.current'); /* @var $user UsersItem */ if ($user->GetID() > 0) { $email_address = $user->GetDBField('Email'); $name = $user->GetDBField('FirstName').' '.$user->GetDBField('LastName'); } else { $email_address = $this->Application->ConfigValue('Smtp_AdminMailFrom'); $name = strip_tags( $this->Application->ConfigValue('Site_Name') ); } return Array ($email_address, $name); } } ?>