/** * Basics parse * * @return array / boolean */ public function parse() { // parse set to mailobject $set = new ezcMailVariableSet($this->MailboxItem->getRawMailMessageContent()); try { $ezcMailObjectArray = $this->MailParser->parseMail($set); } catch (Exception $e) { CjwNewsletterLog::writeError('CjwNewsletterMailparser::parse', 'parseMail', 'ezcMailParser->parseMail-failed', array('error-code' => $e->getMessage())); return false; } if (count($ezcMailObjectArray) > 0) { $this->EzcMailObject = $ezcMailObjectArray[0]; // return standard email headers $parsedMailInfosArray = $this->getHeaders(); // return x-cwl- email headers $parsedCjwMailHeaderArray = $this->getCjwHeaders(); // merge header arrays $parseArray = array_merge($parsedMailInfosArray, $parsedCjwMailHeaderArray); return $parseArray; } else { return false; } }
// no -> create new one with status """confirmed""" // -> subscribe to nl list with status """approved""" // yes -> subscribe to nl list with status """approved""" $existingNewsletterUserObject = CjwNewsletterUser::fetchByEmail($email); } else { // user wurde bereits importiert? // zuerst nach remote_id suchen $existingNewsletterUserObject = CjwNewsletterUser::fetchByRemoteId($remote_id); if (is_object($existingNewsletterUserObject)) { // sicherstellen, dass wir keine duplicate emails haben if ($email != $existingNewsletterUserObject->attribute('email')) { $tmpUserObject = CjwNewsletterUser::fetchByEmail($email); if (is_object($tmpUserObject)) { // houston, we've got a problem - $tmpUserObject löschen??? // ToDo CjwNewsletterLog::writeError('CSV Import: duplicate E-Mail Adress', 'user', 'email', array('email_cur' => $existingNewsletterUserObject->attribute('email'), 'email_imp' => $email, 'remote_id' => $remoteId)); } } } // user hat sich selbst per subscription angelegt? // sonst nach email suchen if (!is_object($existingNewsletterUserObject)) { $existingNewsletterUserObject = CjwNewsletterUser::fetchByEmail($email); } } // update existing if (is_object($existingNewsletterUserObject)) { $userObject = $existingNewsletterUserObject; $updateUserDataIfExists = true; $existingUserStatus = $userObject->attribute('status'); if ($userObject->isOnBlacklist() || $userObject->isRemovedSelf()) {
/** * Used in subscription_list_csvimport * * @param string $remoteId * @return array / boolean */ static function fetchByRemoteId($remoteId) { $db = eZDB::instance(); $objectList = eZPersistentObject::fetchObjectList(CjwNewsletterUser::definition(), null, array('remote_id' => $db->escapeString($remoteId)), null, null, true); $count = count($objectList); if ($count == 1) { return $objectList[0]; } elseif ($count > 1) { $userIdArray = array(); foreach ($objectList as $nlUser) { $userIdArray[] = $nlUser->attribute('id'); } CjwNewsletterLog::writeError('email existing more than 1 time CjwNewsletterUser::fetchByRemoteId', 'user', 'email', array('email' => $objectList[0]->attribute('email'), 'email_count' => $count, 'nl_user_ids' => implode(',', $userIdArray), 'modifier' => eZUser::currentUserID(), 'remote_id' => $remoteId)); return $objectList; } else { return false; } }
/** * Mainfunction for mail send * * @param unknown_type $emailSender * @param unknown_type $emailSenderName * @param unknown_type $emailReceiver * @param unknown_type $emailReceiverName * @param unknown_type $emailSubject * @param unknown_type $emailBodyArray * @param boolean $isPreview * @param string $emailCharset * @return array */ public function sendEmail($emailSender, $emailSenderName, $emailReceiver, $emailReceiverName, $emailSubject, $emailBodyArray, $isPreview = false, $emailCharset = 'utf-8') { $transportMethod = $this->transportMethod; //$mail = new ezcMailComposer(); $mail = new CjwNewsletterMailComposer(); $mail->charset = $emailCharset; $mail->subjectCharset = $emailCharset; // from and to addresses, and subject $mail->from = new ezcMailAddress(trim($emailSender), $emailSenderName); // returnpath for email bounces $mail->returnPath = new ezcMailAddress(trim($emailSender)); if ($isPreview) { $explodeReceiverArr = explode(';', $emailReceiver); foreach ($explodeReceiverArr as $index => $receiver) { // check if email if ($receiver != '') { $mail->addTo(new ezcMailAddress(trim($receiver), 'NL Test Receiver' . $index)); } } } else { $mail->addTo(new ezcMailAddress(trim($emailReceiver), $emailReceiverName)); } if (array_key_exists('html', $emailBodyArray) == false) { $emailBodyArray['html'] = ''; } if (array_key_exists('text', $emailBodyArray) == false) { $emailBodyArray['text'] = ''; } $mail->subject = $emailSubject; if ($emailBodyArray['html'] == '') { // tue nix - da kein html da ist } else { $mail->htmlText = $emailBodyArray['html']; } // body: plain // $mail->plainText = "Here is the text version of the mail."; if ($emailBodyArray['text'] == '') { // $mail->plainText = "Text version of this mail does not exists."; } else { $mail->plainText = $emailBodyArray['text']; } $emailContentType = ''; if ($emailBodyArray['html'] != '' && $emailBodyArray['text'] != '') { $emailContentType = 'multipart/alternative'; } else { if ($emailBodyArray['html'] != '') { $emailContentType = 'text/html'; } elseif ($emailBodyArray['text'] != '') { $emailContentType = 'text/plain'; } } // http://ezcomponents.org/docs/api/latest/introduction_Mail.html#mta-qmail // HeaderLineEnding=auto // CRLF - windows - \r\n // CR - mac - \r // LF - UNIX-MACOSX - \n // default LF //ezcMailTools::setLineBreak( "\n" ); ezcMailTools::setLineBreak($this->HeaderLineEnding); // set 'x-cjwnl-' mailheader foreach ($this->ExtraEmailHeaderItemArray as $key => $value) { $mail->setHeader($key, $value); } $mail->build(); $transport = new CjwNewsletterTransport($transportMethod); $sendResult = $transport->send($mail); $emailResult = array('send_result' => $sendResult, 'email_sender' => $emailSender, 'email_receiver' => $emailReceiver, 'email_subject' => $emailSubject, 'email_content_type' => $emailContentType, 'email_charset' => $emailCharset, 'transport_method' => $transportMethod); // ok if ($sendResult) { CjwNewsletterLog::writeInfo('email send ok', 'CjwNewsletterMail', 'sendEmail', $emailResult); } else { CjwNewsletterLog::writeError('email send failed', 'CjwNewsletterMail', 'sendEmail', $emailResult); } // $LogFile->write( $message, $logName, $logFolder ); return $emailResult; }
/** * fetch mails to parse and/or store * * @return void */ public function fetchMails() { $statusArray = array('added' => array(), 'exists' => array(), 'failed' => array()); $mailboxId = $this->attribute('id'); $mailboxDeleteMailsFromServer = (bool) $this->attribute('delete_mails_from_server'); if (is_object($this->TransportObject)) { $transport = $this->TransportObject; try { // it is possible that not all pop3 server understand this // array( message_num => unique_id ); // array( 1 => '000001fc4420e93a', 2 => '000001fd4420e93a' ); $uniqueIdentifierArray = $transport->listUniqueIdentifiers(); } catch (Exception $e) { $uniqueIdentifiers = false; CjwNewsletterLog::writeError('CjwNewsletterMailbox::fetchMails', 'mailbox', 'listUniqueIdentifiers-failed', array('error-code' => $e->getMessage())); } try { // array( message_id => message_size ); // array( 2 => 1700, 5 => 1450 ); $messageIdArray = $transport->listMessages(); } catch (Exception $e) { $messageIdNumbers = false; CjwNewsletterLog::writeError('CjwNewsletterMailbox::fetchMails', 'mailbox', 'listMessages-failed', array('error-code' => $e->getMessage())); } // array( message_id => message_identifier ) $messageNumberArray = array(); // only fetch messages from server which are not in the db // use message_identifier for check $existingMessageIdentifierArray = $this->extractAllExistingIdentifiers($uniqueIdentifierArray); foreach ($messageIdArray as $messageId => $messageSize) { if (isset($uniqueIdentifierArray[$messageId])) { $uniqueIdentifier = $uniqueIdentifierArray[$messageId]; } else { $uniqueIdentifier = false; } if (array_key_exists($uniqueIdentifier, $existingMessageIdentifierArray)) { $statusArray['exists'][$messageId] = $uniqueIdentifier; } else { $messageNumberArray[$messageId] = $uniqueIdentifier; } } if (count($messageNumberArray) > 0) { // only fetch x item at once to avoid script timeout ... if call from admin frontend // the cronjob may be has other settings $fetchLimit = 50; $counter = 0; foreach ($messageNumberArray as $messageId => $messageIdentifier) { if ($counter >= $fetchLimit) { break; } else { // create mailobject from message id // $mailboxDeleteMailsFromServer == true, set delete flag for current message $mailObject = $transport->fetchByMessageNr($messageId, $mailboxDeleteMailsFromServer); // convert mailobject to string with own function $messageString = $this->convertMailToString($mailObject); if ($messageIdentifier === false) { $messageIdentifier = 'cjwnl_' . md5($messageString); } // if messageString has content if ($messageString != null) { // add item to DB / Filesystem $addResult = CjwNewsletterMailboxItem::addMailboxItem($mailboxId, $messageIdentifier, $messageId, $messageString); if (is_object($addResult)) { $statusArray['added'][$messageId] = $messageIdentifier; } else { $statusArray['exists'][$messageId] = $messageIdentifier; } unset($addResult); } else { $statusArray['failed'][$messageId] = $messageIdentifier; } unset($messageString); unset($mailObject); } $counter++; } // delete messages with delete flag from mailbox switch ($this->attribute('type')) { case 'imap': $transport->expunge(); break; } } else { return $statusArray; } } return $statusArray; }
/** * Mainfunction for mail send * * @param unknown_type $emailSender * @param unknown_type $emailSenderName * @param unknown_type $emailReceiver * @param unknown_type $emailReceiverName * @param unknown_type $emailSubject * @param unknown_type $emailBodyArray * @param boolean $isPreview * @param string $emailCharset * @return array */ public function sendEmail($emailSender, $emailSenderName, $emailReceiver, $emailReceiverName, $emailSubject, $emailBodyArray, $isPreview = false, $emailCharset = 'utf-8', $emailReplyTo = false, $emailReturnPath = false) { $transportMethod = $this->transportMethod; //$mail = new ezcMailComposer(); $mail = new CjwNewsletterMailComposer(); // Encode the UTF-8 as base64 or QUOTED_PRINTABLE for 7 bit MTAs // $mail->encoding = ezcMail::BASE64; // $mail->encoding = ezcMail::QUOTED_PRINTABLE; $mail->encoding = $this->ContentTransferEncoding; $mail->charset = $emailCharset; $mail->subjectCharset = $emailCharset; // from and to addresses, and subject $mail->from = new ezcMailAddress(trim($emailSender), $emailSenderName, $mail->charset); // returnpath for email bounces if (!($emailReturnPath && $emailReturnPath != '')) { $mail->returnPath = $mail->from; } else { $mail->returnPath = new ezcMailAddress(trim($emailReturnPath), '', $mail->charset); } $mail->setHeader('Errors-To', $mail->returnPath); // reply-to if (!($emailReplyTo && $emailReplyTo != '')) { $mail->setHeader('Reply-To', $mail->from); } else { $mail->setHeader('Reply-To', new ezcMailAddress(trim($emailReplyTo), '', $mail->charset)); } if ($isPreview) { $explodeReceiverArr = explode(';', $emailReceiver); foreach ($explodeReceiverArr as $index => $receiver) { // check if email if ($receiver != '') { $mail->addTo(new ezcMailAddress(trim($receiver), 'NL Test Receiver' . $index, $mail->charset)); } } } else { $mail->addTo(new ezcMailAddress(trim($emailReceiver), $emailReceiverName, $mail->charset)); } if (array_key_exists('html', $emailBodyArray) == false) { $emailBodyArray['html'] = ''; } if (array_key_exists('text', $emailBodyArray) == false) { $emailBodyArray['text'] = ''; } $mail->subject = $emailSubject; if ($emailBodyArray['html'] == '') { // tue nix - da kein html da ist } else { $mail->htmlText = $emailBodyArray['html']; } // body: plain // $mail->plainText = "Here is the text version of the mail."; if ($emailBodyArray['text'] == '') { // $mail->plainText = "Text version of this mail does not exists."; } else { $mail->plainText = $emailBodyArray['text']; } $emailContentType = ''; if ($emailBodyArray['html'] != '' && $emailBodyArray['text'] != '') { $emailContentType = 'multipart/alternative'; } else { if ($emailBodyArray['html'] != '') { $emailContentType = 'text/html'; } elseif ($emailBodyArray['text'] != '') { $emailContentType = 'text/plain'; } } // http://ezcomponents.org/docs/api/latest/introduction_Mail.html#mta-qmail // HeaderLineEnding=auto // CRLF - windows - \r\n // CR - mac - \r // LF - UNIX-MACOSX - \n // default LF //ezcMailTools::setLineBreak( "\n" ); ezcMailTools::setLineBreak($this->HeaderLineEnding); // set 'x-cjwnl-' mailheader foreach ($this->ExtraEmailHeaderItemArray as $key => $value) { $mail->setHeader($key, $value, $mail->charset); } $mail->build(); $transport = new CjwNewsletterTransport($transportMethod); $sendResult = $transport->send($mail); $emailResult = array('send_result' => $sendResult, 'email_sender' => $emailSender, 'email_receiver' => $emailReceiver, 'email_subject' => $emailSubject, 'email_content_type' => $emailContentType, 'email_charset' => $emailCharset, 'transport_method' => $transportMethod); // ok if ($sendResult === true) { CjwNewsletterLog::writeInfo('email send ok', 'CjwNewsletterMail', 'sendEmail', $emailResult); } else { // An error occured while sending or receiving mail. RCPT TO failed with error: 450 4.1.2 // <*****@*****.**>: Recipient address rejected: Domain not found // is string ' 450 ' included in emailResult $searchString = ' 450 '; $addErrorMessage = ''; if (strpos($sendResult, $searchString) !== false) { // check if we found an email nl user for emailReceiver $nlUserToBounce = CjwNewsletterUser::fetchByEmail($emailReceiver); if (is_object($nlUserToBounce)) { // hardbounce user // alle active element will be aborted, too $nlUserToBounce->setBounced(true); $emailResult['nluser_id'] = $nlUserToBounce->attribute('id'); $addErrorMessage = ' - HARD BOUNCE (450)'; } else { $addErrorMessage = ' - NL User for email not found'; } } CjwNewsletterLog::writeError('email send failed to ' . $emailReceiver . $addErrorMessage, 'CjwNewsletterMail', 'sendEmail', $emailResult); } // $LogFile->write( $message, $logName, $logFolder ); return $emailResult; }