Когда внутренняя почта попадает в базу

В Террасофт реализован очень удобный механизм привязки и хранения e-mail сообщений - есть в базе такой адрес - подтягивается, отсутствует - не подтягивается. Но не дай Бог вам поставить галочки "игнорировать адрес отправителя\получателя" в настройках пользователя или добавить адрес рабочего мейла в карточку контакта пользователя, а потом проинтегрировать все письма в автоматическом режиме...
В нашей компании объем и количество внутренней почты такие же, а то и больше, чем почты внешней.
И периодически то настройки у кого-нибудь слетят, то новый офис-менеджер добавит всем пользователям их рабочие е-мейлы.... В результате база разом увеличивается на всю внутренную переписку пользователя (с вложениями!).
И хотя подчистить не так и сложно (отправитель like %@your_domain.zone AND получатель like %@your_domain.zone), но, во-первых, за этим надо следить, а во-вторых, бывают сложные случаи, когда письмо отправляется (или получается) не только кому-то внутри, но и одновременно наружу:
send to vasya@company.ru, client@somewhere.com
Такие письма приходится искать вручную... Или сделать вид, что их и не было, что не очень хорошо ))

Мне все это немного надоело еще на 2й раз и я, получив несколько левелапов :wink:, избавил себя от этой проблемы раз и навсегда.

Для этого я долго скакал по скриптам интеграции в попытке найти оптимальную точку для проверки, поближе познакомился с регэкспами, проникся проблемой валидации е-мейлов и разродился вот такой маленькой доработкой.

Логика:
При автоинтеграции (но не вручную ) письма проверяются на наличие хотя бы одного из отправителя\получателей (отправитель один, получателей - сколько влезет) не из одного и того же домена. Основой для проверки служит адрес отправителя - т.к. он один.
Например:
send from petya@company.ru to vasya@company.ru, client@somewhere.com пройдет
send from petya@company.ru to vasya@company.ru, masha@company.ru не пройдет

Скрипт:
в функцию function SyncronizeMailItem(MailItem, Options) вставить после
var MessageID = MapiMessage.GetSMTPHeader('X-TS' + MessageIDUserPropertyName);

        if (CheckIsSameDomain(MapiMessage)){    // проверяем не внутренняя ли почта, если да - выход
                return;
        }

сама функция

function CheckIsSameDomain(MapiMessage) {
        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;
}

ПС. И да - ущерб производительности имеет место, но не сильный

Нравится

Поделиться

3 комментария

косяк :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
Показать все комментарии