В Террасофт реализован очень удобный механизм привязки и хранения e-mail сообщений - есть в базе такой адрес - подтягивается, отсутствует - не подтягивается. Но не дай Бог вам поставить галочки "игнорировать адрес отправителя\получателя" в настройках пользователя или добавить адрес рабочего мейла в карточку контакта пользователя, а потом проинтегрировать все письма в автоматическом режиме...
В нашей компании объем и количество внутренней почты такие же, а то и больше, чем почты внешней.
И периодически то настройки у кого-нибудь слетят, то новый офис-менеджер добавит всем пользователям их рабочие е-мейлы.... В результате база разом увеличивается на всю внутренную переписку пользователя (с вложениями!).
И хотя подчистить не так и сложно (отправитель like %@your_domain.zone AND получатель like %@your_domain.zone), но, во-первых, за этим надо следить, а во-вторых, бывают сложные случаи, когда письмо отправляется (или получается) не только кому-то внутри, но и одновременно наружу:
send to
Такие письма приходится искать вручную... Или сделать вид, что их и не было, что не очень хорошо ))
Мне все это немного надоело еще на 2й раз и я, получив несколько левелапов , избавил себя от этой проблемы раз и навсегда.
Для этого я долго скакал по скриптам интеграции в попытке найти оптимальную точку для проверки, поближе познакомился с регэкспами, проникся проблемой валидации е-мейлов и разродился вот такой маленькой доработкой.
Логика:
При автоинтеграции (но не вручную ) письма проверяются на наличие хотя бы одного из отправителя\получателей (отправитель один, получателей - сколько влезет) не из одного и того же домена. Основой для проверки служит адрес отправителя - т.к. он один.
Например:
send from
send from
Скрипт:
в функцию function SyncronizeMailItem(MailItem, Options) вставить после
var MessageID = MapiMessage.GetSMTPHeader('X-TS' + MessageIDUserPropertyName);
return;
}
сама функция
var SenderAddress = MapiMessage.SenderAddress;
// избавляемся от " в адресах
var RecipientAddress =
MapiMessage.GetRecipientList().CommaText.substr(0, 249).replace(/"/g, ''); //";
// избавляемся от конструкций типа Имя Фамилия> в получателях - услужливый Outlook ставит это ко всем известным ему контактам
RecipientAddress = RecipientAddress.replace(/[^>]+>,?/g, '');
// находим домен отправителя (от @ до конца строки)
var SenderDomain = /@.+$/.exec(SenderAddress);
// находим домены получателей (регексп может быть странноватый, но работает)
var RecipientDomainAr = RecipientAddress.match(/@\S+(?:(?:\.(?:\S{2,})){1,10})/g);
if (!Assigned(RecipientDomainAr)) {
return false;
}
for (var i = 0; i = RecipientDomainAr.length; i++) {
if (RecipientDomainAr[i] != SenderDomain) { \\ если отличается выходим из функции
return false;
}
}
return true;
}
ПС. И да - ущерб производительности имеет место, но не сильный
косяк :redface:
var SenderDomain = /@.+$/.exec(SenderAddress)[0]
for (var i = 0; i <= RecipientDomainAr.length - 1; i++)
// избавляемся от " в адресах var RecipientAddress = MapiMessage.GetRecipientList().CommaText.substr(0, 249).replace(/"/g, ''); //"; // избавляемся от конструкций типа <Имя Фамилия> в получателях - услужливый Outlook ставит это ко всем известным ему контактам RecipientAddress = RecipientAddress.replace(/<[^>]+>,?/g, '');
заменить на
var RecipientAddress = MapiMessage.GetRecipientList(true).CommaText