private function _findUnknownRecipients($params) { $unknown = array(); if (GO::modules()->addressbook && !GO::config()->get_setting('email_skip_unknown_recipients', GO::user()->id)) { $recipients = new \GO\Base\Mail\EmailRecipients($params['to']); $recipients->addString($params['cc']); $recipients->addString($params['bcc']); foreach ($recipients->getAddresses() as $email => $personal) { $contacts = \GO\Addressbook\Model\Contact::model()->findByEmail($email, GO\Base\Db\FindParams::newInstance()->ignoreAcl()); foreach ($contacts as $contact) { if ($contact->checkPermissionLevel(Acl::READ_PERMISSION) || $contact->goUser && $contact->goUser->checkPermissionLevel(Acl::READ_PERMISSION)) { continue 2; } } $company = \GO\Addressbook\Model\Company::model()->findSingleByAttribute('email', $email); if ($company) { continue; } $recipient = \GO\Base\Util\String::split_name($personal); if ($recipient['first_name'] == '' && $recipient['last_name'] == '') { $recipient['first_name'] = $email; } $recipient['email'] = $email; $recipient['name'] = (string) \GO\Base\Mail\EmailRecipients::createSingle($email, $personal); $unknown[] = $recipient; } } return $unknown; }
/** * Add contacts to an addresslist. * @param type $params MUST contain addresslistId AND (EITHER senderNames and * senderEmails OR contactIds) * @return $response If there are email addresses that are not found in any * addressbook, the corresponding senders are registered in * $response['unknownSenders'], and $response['success'] becomes false, so * that the user can decide what to do with the unknown senders. */ public function actionAddContactsToAddresslist($params) { $addresslistModel = \GO\Addressbook\Model\Addresslist::model()->findByPk($params['addresslistId']); $response = array('success' => true); $nAddedContacts = 0; if (!empty($params['contactIds'])) { // Only contact ids are sent from the client $contactIds = json_decode($params['contactIds']); foreach ($contactIds as $contactId) { $addresslistModel->addManyMany('contacts', $contactId); } } else { // email addresses and names are sent from the client $senderEmails = json_decode($params['senderEmails']); $senderNames = json_decode($params['senderNames']); $senders = array(); // format: $senders[$senderEmail] = array('first_name'=>'Jack','middle_name'=>'','last_name'=>'Johnson'); $unknownSenders = array(); // format: $unknownSenders[$senderEmail] = array('first_name'=>'Jack','middle_name'=>'','last_name'=>'Johnson'); // Create array of senders foreach ($senderEmails as $key => $senderEmail) { if (empty($senders[$senderEmail])) { $senders[$senderEmail] = $senderNames[$key]; } } foreach ($senders as $senderEmail => $senderNameArr) { $contactNameArr = \GO\Base\Util\String::split_name($senderNameArr); $contactStmt = \GO\Addressbook\Model\Contact::model()->find(\GO\Base\Db\FindParams::newInstance()->criteria(\GO\Base\Db\FindCriteria::newInstance()->addCondition('email', $senderEmail, '=', 't', false)->addCondition('email2', $senderEmail, '=', 't', false)->addCondition('email3', $senderEmail, '=', 't', false))); //->findSingleByAttribute('email', $senderEmail); if (empty($contactStmt) && empty($unknownSenders[$senderEmail])) { // Keep track of contacts not found in database. $unknownSenders[] = array('email' => $senderEmail, 'name' => $senderNameArr, 'first_name' => $contactNameArr['first_name'], 'middle_name' => $contactNameArr['middle_name'], 'last_name' => $contactNameArr['last_name']); } else { // add contact to addresslist, but ensure only one email per addresslist $emailAlreadyInAddresslist = false; $linkableContactModel = false; while ($contactModel = $contactStmt->fetch()) { if ($addresslistModel->hasManyMany('contacts', $contactModel->id)) { $emailAlreadyInAddresslist = true; } else { $linkableContactModel = $contactModel; } } if (!empty($linkableContactModel) && !$emailAlreadyInAddresslist) { $linkableContactModel->first_name = $contactNameArr['first_name']; $linkableContactModel->middle_name = $contactNameArr['middle_name']; $linkableContactModel->last_name = $contactNameArr['last_name']; $linkableContactModel->save(); $addresslistModel->addManyMany('contacts', $linkableContactModel->id); $nAddedContacts++; } } } $response['addedSenders'] = $nAddedContacts; if (count($unknownSenders)) { $response['success'] = false; $response['unknownSenders'] = json_encode($unknownSenders); $response['addresslistId'] = $addresslistModel->id; } } return $response; }