Сборщик почты Gmail. Сборщик почты (делаем простые вещи сложно)

Переключаться с одной вкладки с Gmail на другую с «Яндекс.Почтой» довольно утомительно. А уж если у вас имеется десяток учётных записей у разных почтовых провайдеров, утренняя проверка новой корреспонденции и вовсе превращается в пытку. Объединив письма в одном месте, вы избавитесь от этого неудобства.

Веб-интерфейс

Большинство провайдеров электронной почты предоставляют встроенную функцию сбора писем с нескольких почтовых ящиков. Например, попробуем собрать письма со всех ваших ящиков в одном аккаунте Gmail.

Прежде всего убедитесь, что в почтовой службе, откуда вы хотите забирать письма, есть доступ по протоколу POP. Затем зайдите в настройки Gmail и нажмите «Настройки» в правом верхнем углу. Перейдите на вкладку «Аккаунты» и отыщите раздел «Получать почту из других аккаунтов».

Добавьте аккаунт, введите адрес электронной почты и нажмите «Далее», затем ведите пароль. Для того чтобы обмен почтой между провайдерами был безопаснее, убедитесь, что включена опция «Всегда использовать защищённое соединение (SSL) при получении почты». Затем кликните на «Добавить аккаунт».

Теперь письма, приходящие на добавленный адрес, будут автоматически собираться в Inbox вашего Gmail. Вы можете добавить столько почтовых адресов, сколько вам нужно.

Десктопные клиенты

Электронной почте нужен софт. Да, вы можете сделать многое в веб-клиенте почты (иногда гораздо больше, чем Google сейчас позволяет делать в Gmail). Но веб-интерфейс не сравнить с нативным приложением. Даже самый современный Web UI - это узкое место в работе с почтой.

Рэйф Нидлман, Сnet.com

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

Большинство десктопных клиентов электронной почты имеют встроенный общий Inbox. Даже если ваш излюбленный клиент поддерживает работу только с отдельными папками для входящих писем, вы всё равно легко можете собрать их вместе с помощью умных фильтров.

Несмотря на то что Outlook предназначен для одновременного управления несколькими почтовыми ящиками, он всё равно отображает отдельный Inbox для каждой учётной записи. Но это легко можно исправить с помощью фильтров.

Откройте Outlook, зайдите на вкладку «Папки» и кликните «Создать папку поиска» на панели инструментов. Затем выберите «Создание настраиваемой папки поиска». Щёлкните на «Выбрать», но не выбирайте критерии поиска, чтобы в папку отправлялись все новые сообщения. Назовите папку как угодно, например «Вся почта».

Кликните на «Обзор», выберите все папки и ящики, из которых нужно собирать почту, и отметьте опцию «Поиск во вложенных папках».

Теперь в созданной вами умной папке будут появляться письма из всех почтовых аккаунтов, добавленных вами в Outlook. Вы можете включить опцию «Отображать в избранном», чтобы ваша новая почта всегда была на виду.

Почтовый клиент Mac предоставляет единую папку для входящих писем из всех подключённых учётных записей. Просто добавляйте свои аккаунты, и все новые письма окажутся собранными в одном месте.

В Thunderbird собрать все ваши письма в одной папке «Входящие» очень просто. Зайдите в меню «Вид» (если строка меню не отображена, нажмите Alt). Затем выберите «Папки» → «Объединённые». Теперь у вас будет одна папка «Входящие» для новых писем, одна папка «Черновики», одна папка «Отправленные» и один «Архив». Вам не придётся долго искать, что где лежит. При этом сообщения будут, как и раньше, храниться на серверах ваших почтовых провайдеров.

Мобильные клиенты

Объединённый Inbox есть во многих мобильных почтовых клиентах, в том числе в Gmail. Приложение Gmail собирает ваши входящие из всех аккаунтов электронной почты, в том числе из Yahoo, Outlook или других сервисов.

Если вам не нравится приложение от Google, можете попробовать сторонние почтовые клиенты, такие как Outlook или MyMail.

Может быть, у вас есть свои идеи, как сгруппировать почту в одном месте? Делитесь в комментариях.

Инструкция

Войдите в свой аккаунт, для этого перейдите по следующей ссылке http://gmail.com и введите логин и пароль.

Нажмите на значок шестеренки в правом верхнем углу «Аккаунты и импорт». Затем перейдите к блоку «Отправлять письма как» и нажмите на ссылку «Добавить другой свой адрес электронной почты».

В новом всплывшем окне введите имя и фамилию, на которые зарегистрирован добавляемый e-mail, а также адрес электронного ящика . Нажмите на кнопку «Следующий этап».

Далее на экране появится запрос о том, каким образом производить отправку писем при использовании этого адреса - с помощью сервиса Gmail либо интерфейса почты от QIP. Желательно указать Gmail, меньше настроек, следовательно, меньше времени будет потрачено. Нажмите на кнопку «Следующее действие».

В следующем окне вас уведомляют, что после нажатия кнопки «Отправить подтверждение» вам будет необходимо проверить указанный e-mail, чтобы Gmail был уверен в действительности существования электронного адреса. Нажмите кнопку и в новой вкладке откройте свой почтовый ящик.

Просмотрите непрочитанные вами письма и откройте письмо с заголовком «Gmail Подтверждение». Нажмите ссылку, чтобы подтвердить существование этого электронного адреса, или скопируйте код.

Если вы скопировали код, вставьте его в пустом поле окна «Добавить другой...» и нажмите кнопку «Проверка». После некоторого времени это окно автоматически закроется и в списке «Отправлять письма как» появится новый e-mail.

Теперь аналогично описанному необходимо добавить новый адрес в блок «Сбор почты с других аккаунтов». Для этого нажмите ссылку «Добавьте свой почтовый аккаунт POP3».

В новом всплывшем окне введите адрес электронного ящика. Нажмите на кнопку «Следующее действие». В следующем окне необходимо ввести пароль и активировать опции «Всегда использовать защищенное соединение» и «Присвоить ярлык входящим письмам». Затем нажать кнопку «Добавить аккаунт». После некоторого времени это окно автоматически закроется и в списке «Сбор почты с других аккаунтов» появится новый e-mail.

Электронная почта стала неотъемлемой частью жизни пользователей в сети интернет. Существует много ресурсов, которые предоставляют почтовый ящик. Часто требуется проверить существование ящика , его достоверность. Если необходимо узнать о подлинности электронного адреса, то ничего трудного в этом нет.

Инструкция

Зарегистрируйте электронный адрес с таким же именем, если вас заинтересовал e-mail, созданный на каком-нибудь бесплатном ресурсе. Ранее существующий e-mail нельзя зарегистрировать снова. Все известные почтовые серверы обеспечены системой обратного оповещения. В таком случае придет уведомление об ошибке, которое сообщит о невозможности дальнейшей регистрации.

Попробуйте написать письмо с доступного вам электронного ящика на искомый e-mail. Сообщение может быть с текстом и без него. Отправьте его и проверьте через какое-то время ваш e-mail на наличие присланных писем. Если вас уведомили о том, что ваше письмо не дошло до нужного адреса, то, возможно, эта почта не существует.

Зарегистрируйтесь в сети «Мой мир». Это социальная сеть в Рунете, в которой общаются множество пользователей. Воспользуйтесь поиском по аккаунтам других пользователей. Наберите нужный e-mail в поисковой строке, которая расположена в правом углу вверху странички сайта. Можно нажать на кнопку «Люди». Вы попадете в поиск учетных записей по различным критериям. Просто вводите интересуемый e-mail в поле, которое вы найдете под названием «Поиск». Необходимо нажать «Найти». Если почтовый адрес достоверен, то вы увидите сведения о владельце почты.

Если у вас есть почтовые ящики на других почтовых сервисах, настройте сборщик писем, чтобы вся информация находилась в одном месте.

Чтобы сборщик работал корректно, вы должны его настраивать только под аккаунтом Mail.Ru. Убедитесь, что вы вошли в учетную запись Mail.Ru, прежде чем начать сбор писем с других почтовых сервисов.

Чтобы добавить ящик:

  1. Нажмите на логотип сервиса, на котором у вас расположен ящик. Если вашего сервиса нет в списке, нажмите «Другая почта».
  2. Введите имя почтового ящика и пароль к нему, нажмите «Добавить». Если вы увидите сообщение об ошибке - проверьте корректность ввода данных и повторите попытку. Если данные введены правильно, вы получите подтверждение и cможете продолжить настройку сборщика почты.

В зависимости от того, какой протокол поддерживает сервис, на котором находится ящик, настройка может отличаться:

IMAP

  1. Укажите, в какую папку вы хотите перемещать письма, и нажмите «Сохранить».
  2. Если у вас есть личные папки в ящике, с которого вы будете собирать почту, они будут вложены в выбранную папку.

Также синхронизируются и системные папки : «Черновики», «Отправленные», «Спам» и «Корзина». Если вы будете импортировать письма из стороннего ящика в папку «Входящие», укажите, хотите ли вы применять к поступающим письмам фильтры, настроенные в текущем ящике.

Если сбор писем настроен по протоколу IMAP, вы сможете отвечать на письма с того ящика, на который отправлено письмо.

РОР3

  1. Установите галочку «Всю почту», чтобы импортировать из ящика все письма. Если вы хотите отметить все импортируемые письма как прочитанные, установите галочку «Пометить все старые письма как прочитанные».
  2. Выберите, в какую папку вы хотите помещать письма из этого ящика. Если вы хотите создать новую папку, установите галочку напротив поля под выпадающим списком и введите название папки.
  3. Чтобы к письмам с других серверов применялись фильтры, которые настроены в ящике, установите галочку напротив «Применять к полученным письмам фильтры».
  4. Нажмите «Сохранить».

Таким образом вы можете указать до 9 ящиков, с которых будет осуществляться сбор писем. Чтобы отключить сборщик почты, установите переключатель в положение «ВЫКЛ». Если вы хотите отредактировать настройки, нажмите «Изменить». Чтобы удалитьсборщик, нажмите «Удалить».

В этой статье речь пойдет о том, что такое «почта из других ящиков» и «сбор писем из других аккаунтов». Обзоры почтовых сервисов и сравнения.

По мере обновления функционала почтовых сервисов мы будем публиковать новости в конце этой статьи.

Почтовый сервис Mail.ru, поисковые системы Yandex и Google уже несколько лет предлагают очень полезный и нужный функционал, который позволяет объединить в одной почте все остальные e-mail аккаунты. Иными словами, стоит один раз добавить и настроить все свои «почты», и управлять ими станет возможно в одном окне без постоянного ввода логина и пароля.

Почтовые сервисы предлагают нам огромное место для хранения всех входящих писем, удобный интерфейс, хороший функционал по управлению и многое другое. Чтобы протестировать возможности перечисленных почтовых сервисов, выделим три параметра для оценки их работы: 1) необходимо управлять различными e-mail аккаунтами, в том числе с различных сервисов и сайтов, через один почтовый клиент; 2) иметь личную подпись и имя для каждой почты; 3) удалять письма с серверов тех почтовых аккаунтов, которые были добавлены в mail, yandex или google почты.

Наша задача выглядит так:

Итак, приступим. Первым тестируем сервис от Mail.ru, который сообщает нам: «Вы можете собирать почту из всех ваших почтовых ящиков в один ящик на Mail.ru.

Настройте сбор писем с любого сервера, работающего по протоколу IMAP или POP3». Для добавления внешней почты, отличной от @mail, @inbox, @list, @bk, нужно иметь хотя бы одну почту, которая уже имеется на перечисленных серверах от mail. Иными словами, сначала зарегистрируйте mail-почту, а затем уже добавляйте другие почтовые аккаунты. Процесс регистрации на mail прост, описывать его нет смысла, а вот добавление других e-mail в этот почтовый аккаунт опишем.


Далее вам будет предложено ввести логин и пароль от любого ящика, которым вы пользуетесь, и в течение 3-5 минут «Сборщик почты от mail» создаст папку с наименованием добавленной почты рядом с папками «входящие», «отправленные», «спам» и прочее.


На деле, сборщик писем заработает в течение 10-15 минут и во вновь созданную папку от указанного вами ящика добавит все письма. Все входящие письма для нового e-mail будут приходить в эту папку, также станет возможным отправлять письма от прикрепленного ящика. При создании нового письма появится поле «От», в котором можно выбрать, с какого почтового ящика будет отправлено письмо.


К плюсам почтового сервиса Mail.ru можно отнести простоту добавления и легкость настройки других ящиков, отсутствие необходимости указывать различные протоколы (POP3, SMTP). Это очень важно, потому что не каждый пользователь знает, что это такое.

Минусы Mail.ru заключаются в том, что назначить имя и подпись для каждой вновь добавленной почты (любому новому e-mail, кроме основного) нельзя, то есть на каждый адрес будет распространяться имя и подпись главной почты и все. Другим большим недостатком является то, что при загрузке писем в mail нет возможности автоматического удаления оригинальных писем с сервера прикрепленного ящика. Почему так важно удалять письма с сервера добавленного ящика? Это позволит избежать заполнения присоединенной почты, т.к. внешние e-mail аккаунты, как правило, имеют слишком маленький размер для хранения писем. Например, при переполнении почтового пространства во внешнем аккаунте, Mail.ru не отобразит никаких новых писем, пока Вы не войдете в интерфейс внешней почты и непосредственно оттуда не удалите письма для освобождения места. К тому же, мы привязываем почту к Mail в надежде получить много места для хранения нашей почты, которая, возможно, ограничена ресурсами хостинга. Таким образом, несмотря на то, что Mail.ru предлагает практически неограниченный объем почтового ящика, при добавлении почты из другой доменной зоны (например, ), ваши ресурсы добавленного e-mail не увеличатся в Mail.ru, а будут по-прежнему ограничены ресурсами хостинга (в нашем случае, ресурсами primer.ru).

Возможность добавления другой почты на сервис Mail не угодил нашей задаче по двум пунктам из трех, итого набрал один балл.


Правда у Mail.ru есть еще один способ добавления внешней почты, а если говорить точнее, то подключение или вход на внешнюю почту. Выглядит это так:


Данный способ не подходит для нашей задачи, т.к. это не сборщик почты, а режим пользователя, который подключается к почте и каждый раз загружает в интерфейс mail все папки и письма. Но здесь возможно добавить для каждой почты личную подпись и имя, имеется возможность отправки писем от настроенной почты. Удаление писем с загруженных ящиков не работает, т.к. это не сборщик почты.

Важно! Некоторые пользователи ошибочно думают, что если письма отобразились в mail, то почту, с которой произошла загрузка, можно очистить. Обратим внимание еще раз, что Mail.ru работает как просмотрщик почты, и если вы очистите почту, то она удалится и в основном ящике, и в mail.

Второй испытуемый Яндекс со своим сборщиком писем. Задачи поставлены аналогичные: собрать почту, присвоить для каждой почты свою подпись и имя, а также удалить всю почту с добавленного ящика.

Настраивается сборщик писем у Яндекса по аналогичной схеме, но если подключение почты происходит с какого-нибудь сайта, например site.ru, то необходимо будет прописать дополнительные настройки, см. скриншот.


Сервис Mail делал эту работу за нас, Яндекс же предлагает в ручном режиме выставить все настройки от сторонней почты. Тут нет ничего сложного: в поле логин вводим полное название почты (), в поле сервер вводим только домен (site.ru), все остальные настройки лучше оставить по умолчанию, либо изменить, если вы знаете, что делаете. После успешного добавления почты, появится надпись:


В отличие от Mail сборщика, Яндекс предлагает выбрать, сохранять ли оригиналы писем в добавляемом ящике или нет. Во всем другом сборщик писем от Яндекса работает по аналогичной схеме с Mail.ru, есть возможность выбора почтового ящика, от которого отправлять письмо. Но вот с подписью писем у Яндекса такая же проблема: нет возможности задать для каждого добавленного почтового ящика индивидуальное имя и подпись.


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

Итого Яндекс успешно справился со сбором и сортировкой почты, умеет удалять оригиналы писем с добавленного ящика, но с подписями работать не умеет! С нашей задачей сборщик писем от Яндекса не справился и набирает два балла из трех.


Хочется отметить, что, «покопавшись» во всех трех сервисах по сборке писем, создается впечатление, что Mail «сляпали» свой функционал на скорую руку. Он хоть и удовлетворит большинство пользователей, но, честно сказать, Маил сделали сборщик почты для галочки, чтобы отметиться в конкурентной гонке. Работает все хорошо и без сбоев, но с нашей задачей сборщик от Маил не справился. В интерфейсе почты имеются несколько рекламных блоков, но они не мешают работать с письмами.

Что касается Yandex, который создал сборщик писем давным давно, создается ощущение, что поддержкой именно этой отрасли не занимаются, потому что исправить столь простой функционал (возможность добавления нескольких подписей для ящиков) не должен быть сложным для такой мощной поисковой машины. Тем не менее, у Яндекса появился другой уникальный функционал, позволяющий привязывать домены на их dns сервера, а уже в последующем создавать и настраивать почту. Но для таких операций и настроек требуются знания и время. И хотя ничего сложного там нет, в любом случае, это не для большинства пользователей рунета. Большой плюс - нет рекламы в интерфейсе Яндекс почты! Минус - ограничение в сборщике писем на 10 почтовых ящиков.

Финалист и победитель - сборщик писем от Google, который на ура справился с нашей задачей, несмотря даже на ограничение в 5 ящиков

На днях вышла очередная версия Почты Mail.Ru для iPhone и iPad. Основное обновление - одно, зато весомое: это возможность собрать все почтовые ящики пользователя в одном месте, а именно в приложении Почты Mail.Ru.

Вся почта в одном месте. У большинства из нас имеется несколько email’ов - для работы, для регистраций на всяческих форумах, купонных сайтах и интернет-магазинах, и для души (читай - для общения с друзьями, родственниками и т.д.). В прошлой версии приложения Mail.Ru разработчики сделали первый шаг к тому, чтобы упорядочить управление «зоопарком» аккаунтов: добавили поддержку нескольких почтовых ящиков.

Теперь же в клиенте Почты Mail.Ru можно работать не только с ящиками на этом сервисе, но и с аккаунтами Gmail, Rambler, Outlook и других провайдеров, поддерживающих IMAP/POP3. Переключаться между ящиками очень просто – это дело одного нажатия. Пока пользователь просматривает один аккаунт, другие терпеливо ждут своей очереди.

Приложение не перекраивает по-своему порядок в разных ящиках. В каждом из аккаунтов можно продолжать следовать именно той логике работы, к которой успел привыкнуть. Скажем, в интерфейсе приложения Mail.Ru названия и структура папок, флажки и другие настройки ящика на Gmail останутся такими же, как и в большой версии Gmail. Кроме того, в приложении можно индивидуально настроить каждый из аккаунтов: задать подпись, включить или отключить отображение иконок, настроить работу системы push-уведомлений.


Push-уведомления. Продвинутые push-уведомления заслуживают отдельного упоминания. Во-первых (и это один из главных бонусов приложения), их можно включить даже для аккаунтов на тех сервисах, которые не умеют присылать push’и.

Во-вторых, их можно настроить именно так, как вам удобно, указав в подробностях, в какое время им приходить и о чем сообщать. Есть возможность поименно отметить адресатов, сообщения от которых вы готовы читать день и ночь (например, письма от мамы), или строго с 9 до 19:00 (скорее всего, это будут письма клиентов или коллег). Можно включить или выключить оповещения для определенных аккаунтов, папок или адресатов.

Разработчики заботливо предусмотрели кнопку, которая позволяет разом отключить уведомления о рассылках от социальных сетей или купонных сервисов. Также задается содержание push-уведомлений: возможно, из соображений конфиденциальности вы захотите скрыть имя адресата или тему письма.

Быстрые действия. Для удобной работы с письмами в приложении существует меню быстрых действий. Чтобы вызвать эти волшебные кнопки, нужно просто провести справа налево по нужному сообщению в списке писем. С их помощью можно удалить письмо, поставить флажок, переместить в другую папку, отправить в спам и т.д. Все действия выполняются в одно нажатие.

Аватары адресатов и сервисов помогут ориентироваться в почте. Они видны в списке писем, при чтении и написании писем, и, как уже говорилось, в push-уведомлениях. При чтении и написании письма пользователь видит аватарку отправителя или адресата, а также превью вложений. Если приаттачены фотографии или рисунки, то отображаются миниатюры изображений. Просматривать вложения, кстати, можно не отходя от кассы, т.е. прямо в приложении.

Кэширование. Кэширование будет очень кстати в тех местах, где интернет не очень, например, в метро. Владелец смартфона с почтовым клиентом Mail.Ru сможет читать тексты и смотреть фото даже при отсутствии сети.

Подсказки. Приложение подсказывает нужный email, стоит ввести первые буквы в адресной строке (при условии, что вы хотя бы раз писали этому адресату – неважно, в основной версии Почты или в приложении). Кроме того, клиент по вашему желанию прибавит к списку респондентов контакты с телефона.

Будем объективны - почтовое приложение Mail.Ru сделано на совесть. И если раньше пользоваться навороченными push’ами, радоваться аватаркам в списке писем и т.д. можно было только при наличии ящика на Mail.Ru, то теперь пользователи того же Mail.Ru смогут собрать в приложении и остальные ящики (а те, кто предпочитает другие сервисы, как минимум протестировать клиент).

По мере активной деятельности в сети, у меня накопилось много почтовых аккаунтов, часть из которых, я активно использую для разных целей. Почтовых программ я не использую, а заходить и проверять почту в каждом ящике – долго, поэтому решил настроить сбор почты в одном месте. В этом посте расскажу о том, как настроить сбор почты с разных ящиков на одном аккаунте gmail.

Большая часть моих аккаунтов на яндексе и на gmail для домена. Почта с большинства аккаунтов, уже давно собирается на одном аккаунте gmail, но не вся, и периодически приходиться заходить и проверять другие почтовые аккаунты. Плюс отправка писем от имени другого аккаунта, настроена по простой схеме, когда почта отправляется через домен и аккаунт gmail, а не через почтовый сервер, на котором находится другой ящик. В общем, решил всё основательно упорядочить и настроить, собрать почту со всех активных аккаунтов в одном месте, на одном домене прикрученном к gmail, который давно взял специально для этих целей.

Так сложилось, что я никогда не использовал почтовых программ, не нравятся мне они. Gmail, я считаю, намного удобней. Ничего не нужно загружать себе на компьютер, удобный поиск, удобная группировка писем в цепочки и не только. Короче, тут я даже не думал, для работы с почтой, я использовал, и буду использовать gmail. Плюс также в том, что Вы можете получить доступ к архиву почты с любого компьютера. О том, как завести gmail для домена, можно прочитать в посте .

И так, к сути. Ниже приведу инструкцию, как я настроил сбор почты в одном месте, на аккаунте gmail для домена.

Что мне было нужно?

  1. Сбор почты с разных ящиков/аккаунтов на одном аккаунте gmail.
  2. Иметь возможность отправлять письма от имени другого аккаунта и не палить адрес .
  3. Помечать письма, полученные на разные аккаунты.

Всё. Больше ничего мне не нужно.

Начнём по порядку.

1. Сбор почты с разных ящиков/аккаунтов на одном аккаунте gmail

Здесь есть несколько путей.

1) Настроить пересылку почты с другого ящика/аккаунта на ваш основной аккаунт

У большинства развитых почтовых сервисов, есть такая возможность. У меня аккаунты на яндекс и на gmail, поэтому здесь опишу настройку пересылки почты для этих почтовиков.

Пересылка/Сбор почты с другого аккаунта Gmail

Переходим в аккаунте, с которого хотим пересылать почту, в Настройки => Пересылка и POP/IMAP

Отмечаете “Включить POP для всех писем”, выбираете, что нужно сделать пересылаемыми письмами. У меня стоит “Сохранить копию письма во входящих”. Вводите адрес, на который хотите пересылать почту.

После этого, на добавленный для пересылки емайл, приходит код подтверждения. Вводите код.

Затем выбираете пересылать на добавленный адрес и действие с письмами после пересылки:

Всё. Теперь все письма будут пересылаться на указанный вами емайл.

Пересылка/Сбор для почты с яндекс

Переходите в Настройка => Правила обработки почты => Создать правило.

Создаёте правило “Переслать по адресу” и отмечаете “сохранить копию при пересылке”. Жмёте создать правило.

После этого на емайл указанный для пересылке приходит письмо с ссылкой. Переходите по ссылке и нажимаете “Включить правило”.

Всё. Теперь вся почта с аккаунта яндекс будет пересылаться на указанный вами емайл.

2) Собирать почту с помощью сборщика почты gmail

Этот способ, лично я, использую только для сбора почты если:

  • нет возможности настроить пересылку почты с другого ящика/аккаунта
  • если нужно собрать всю уже имеющуюся почту с другого ящика/аккаунта

Почему только в этих случаях?

Потому что:

Во-первых , есть ограничение, и Вы сможете собирать почту только с 5 аккаунтов, не больше. Это ограничение для бесплатного аккаунта, на коммерческом варианте, насколько я знаю, такого ограничения нет, но могу ошибаться.

Во-вторых , задержка по времени. Гугл сам выбирает время, через которое он будет собирать вашу почту с другого аккаунта. Можно, конечно, проверить руками, в настройках почты, выбрать нужный аккаунт и нажать проверить, но это уже не то. Если же Вы настроите пересылку с другого почтового аккаунта, то письма будут приходить моментально.

Как настроить сбор почты с помощью сборщика gmail

Переходите Настройки => Аккаунты => Получать почту из других аккаунтов => Добавить свой почтовый аккаунт

Добавляете емайл, с которого хотите собирать почту. Вводите данные и выбираете нужные действия. Данные для разных почтовых серверов – разные. Нужно уточнять. Для большинства крупных почтовиков типа яндекс, мейл, нужные настройки вводятся по умолчанию правильно.

Подробно настройка отправки писем от имени другого аккаунта описана ниже, при рассмотрении пункта 2 – “Иметь возможность отправлять письма от имени другого аккаунта и не палиться”. После этого, gmail будет собирать почту с добавленного почтового ящика.

2. Иметь возможность отправлять письма от имени другого аккаунта и не палиться

Для того, чтобы настроить возможность отправки почты от имени другого аккаунта, переходим в Настройки => Аккаунты => Добавить другой свой адрес электронной почты.

Вводим адрес и желаемое имя, которое будет указано при отправке письма.

Здесь предлагают 2 варианта, простой и посложнее:

  • отправлять через почту gmail на домене (более простая настройка)
  • отправлять через серверы SMTP почтовика, на котором находится аккаунт (рекомендуется для профессиональных доменов)

Раньше мне не хотелось замарачиваться с настройкой и я выбирал первый вариант. Но при первом варианте, получатель, насколько я понимаю, будет видеть, что письмо отправлено совершенно с другого домена, а возможно, можно будет увидеть реальный адрес отправителя.

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

Выбираем “Защищенное соединение с использованием TLS”, рекомендуемое gmail. Вводим адрес SMTP сервера. Для яндекса это smtp.yandex.ru порт 25. Это всё указано по умолчанию. Порт я ставил и другой, вроде тоже работало. Для gmail — smtp.gmail.com порт 587. Для других почтовых сервисов, нужно уточнять адрес smtp сервера.

После этого, на добавленный емайл придёт код. Вводите код и подтверждаете емайл.

Всё. Теперь Вы можете отправлять письма от имени другого аккаунта.

3. Помечать письма, отправленные на разные емайл адреса

Для того, чтобы проще ориентироваться, где и какие письма, создадим ярлыки для каждого аккаунта или группы аккаунтов и настроим фильтры.

Создаём ярлыки для писем

Переходим в Настройки => Ярлыки и создаём ярлык.

Создаём фильтр для писем

Переходим в Настройки=> Фильтры => Создать новый фильтр и создаём фильтр.

При создании фильтра, есть много настроек. Я создаю фильтр по адресату, кому адресовано письмо.

Мне нужно только пометить письмо ярлыком, поэтому я выбираю только “ Применить ярлык ”, выбираю ярлык и нажимаю “Создать фильтр”. Всё. Теперь все письма, адресованные на конкретный емайл, будут помечены ярлыком.

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

Gmail рулит!)

Есть чем дополнить – пишите!

Разумеется, всё должно быть распараллелено. Тут на сцену выходит моя любимая библиотека TPL DataFlow .

Забирать почту будем по POP3. Все «модные штучки» IMAP в данной задаче излишни - надо как можно быстрее и проще забрать исходник письма и удалить его на сервера. POP3 тут хватит за глаза. Используем OpenPop.NET .

В качестве факультатива прикрутим мониторинг в Zabbix . (Мы же собрались работать 24/7 и выдавать хваленую скорость - нужно следить за этим).

Поехали

Создаем обычное консольное приложение. Открываем NuGet консоль и ставим все нужные пакеты:

Install-Package Nlog Install-Package OpenPop.NET Install-Package TopShelf Install-Package Microsoft.TPL.DataFlow
Переходим в папку проекта, создаем App.Debug.config и App.Release.config. Выгружаем проект из студии, открываем его код (Здесь и далее TopCrawler.csproj). В секцию с конфигом добавляем:

Конфигурации

App.config App.config


А ниже собственный таргет для MSBuild:

Transform target

$(TargetFileName).config


Лично я привык именно таким способом - по старинке - добавлять трансформацию конфигов для разделения сред.
Для удобства предлагаю strongly-type конфиги. Отдельный класс будет читать конфигурацию. (О теоретических аспектах такого решения можно пообщаться в комментах). Конфиги, логи, мониторинг - отличный повод реализовать паттерн Singleton.

Создаем в проекте одноименную папку (должен же быть порядок). Внутри создаем 3 класса - Config, Logger, Zabbix. Наш логгер:

Logger

static class Logger { public static NLog.Logger Log { get; private set; } public static NLog.Logger Archive { get; private set; } static Logger() { Log = LogManager.GetLogger("Global"); Archive = LogManager.GetLogger("Archivator"); } }


Мониторинг с помощью Zabbix заслуживает отдельного поста, поэтому я просто оставлю тут класс, реализующий агента:

Zabbix

namespace TopCrawler.Singleton { ///

/// Singleton: zabbix sender class /// static class Zabbix { public static ZabbixSender Sender { get; private set; } static Zabbix() { Sender = new ZabbixSender(Config.ZabbixServer, Config.ZabbixPort); } } struct ZabbixItem { public string Host; public string Key; public string Value; } class ZabbixSender { internal struct SendItem { // ReSharper disable InconsistentNaming - Zabbix is case sensitive public string host; public string key; public string value; public string clock; // ReSharper restore InconsistentNaming } #pragma warning disable 0649 internal struct ZabbixResponse { public string Response; public string Info; } #pragma warning restore 0649 #region --- Constants --- public const string DefaultHeader = "ZBXD\x01"; public const string SendRequest = "sender data"; public const int DefaultTimeout = 10000; #endregion #region --- Fields --- private readonly DateTime _dtUnixMinTime = DateTime.SpecifyKind(new DateTime(1970, 1, 1), DateTimeKind.Utc); private readonly int _timeout; private readonly string _zabbixserver; private readonly int _zabbixport; #endregion #region --- Constructors --- public ZabbixSender(string zabbixserver, int zabbixport) : this(zabbixserver, zabbixport, DefaultTimeout) { } public ZabbixSender(string zabbixserver, int zabbixport, int timeout) { _zabbixserver = zabbixserver; _zabbixport = zabbixport; _timeout = timeout; } #endregion #region --- Methods --- public string SendData(ZabbixItem itm) { return SendData(new List(1) { itm }); } public string SendData(List lstData) { try { var serializer = new JavaScriptSerializer(); var values = new List(lstData.Count); values.AddRange(lstData.Select(itm => new SendItem { host = itm.Host, key = itm.Key, value = itm.Value, clock = Math.Floor((DateTime.Now.ToUniversalTime() - _dtUnixMinTime).TotalSeconds).ToString(CultureInfo.InvariantCulture) })); var json = serializer.Serialize(new { request = SendRequest, data = values.ToArray() }); var header = Encoding.ASCII.GetBytes(DefaultHeader); var length = BitConverter.GetBytes((long)json.Length); var data = Encoding.ASCII.GetBytes(json); var packet = new byte; Buffer.BlockCopy(header, 0, packet, 0, header.Length); Buffer.BlockCopy(length, 0, packet, header.Length, length.Length); Buffer.BlockCopy(data, 0, packet, header.Length + length.Length, data.Length); using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { socket.Connect(_zabbixserver, _zabbixport); socket.Send(packet); //Header var buffer = new byte; ReceivData(socket, buffer, 0, buffer.Length, _timeout); if (DefaultHeader != Encoding.ASCII.GetString(buffer, 0, buffer.Length)) throw new Exception("Invalid header"); //Message length buffer = new byte; ReceivData(socket, buffer, 0, buffer.Length, _timeout); var dataLength = BitConverter.ToInt32(buffer, 0); if (dataLength == 0) throw new Exception("Invalid data length"); //Message buffer = new byte; ReceivData(socket, buffer, 0, buffer.Length, _timeout); var response = serializer.Deserialize(Encoding.ASCII.GetString(buffer, 0, buffer.Length)); return string.Format("Response: {0}, Info: {1}", response.Response, response.Info); } } catch (Exception e) { return string.Format("Exception: {0}", e); } } private static void ReceivData(Socket pObjSocket, byte buffer, int offset, int size, int timeout) { var startTickCount = Environment.TickCount; var received = 0; do { if (Environment.TickCount > startTickCount + timeout) throw new TimeoutException(); try { received += pObjSocket.Receive(buffer, offset + received, size - received, SocketFlags.None); } catch (SocketException ex) { if (ex.SocketErrorCode == SocketError.WouldBlock || ex.SocketErrorCode == SocketError.IOPending || ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable) Thread.Sleep(30); else throw; } } while (received < size); } #endregion } }


Конфиги… Пора уже делать хоть что-то интересное. Во-первых, в конфигах будем хранить ящики, которые мы опрашиваем. Во вторых настройки DataFlow. Предлагаю так:

Конфиги



Итак, хост и порт куда конектится, юзер и пароль - тут всё понятно. Дальше тип ящика. Допустим, служба используется маркетингом (как и другими отделами). У них есть ящики, куда сваливаются автоответы на рассылки, а также отчеты о спаме FBL . Сам ящик уже категоризирует письмо, поэтому для таких ситуаций сразу задаем тип ящика. С настройками DataFlow будет понятно дальше, когда начнем создавать объекты. Тут у нас будут собственные секции в конфиге. Мануалов куча как это сделать, поэтому просто покажу результат:

Определяем типы

#region --- Types --- static class MailboxType { public const string Bo = "bo"; public const string Crm = "crm"; public const string Fbl = "fbl"; public const string Bounce = "bounce"; } class MailboxInfo { public string Type { get; set; } public string Hostname { get; set; } public string User { get; set; } public string Password { get; set; } public int Port { get; set; } } class DataBlockOptions { public int Maxdop { get; set; } public int BoundedCapacity { get; set; } public DataBlockOptions() { Maxdop = 1; BoundedCapacity = 1; } } #endregion


Создаем секции

///

/// Custom config section /// public class CustomSettingsConfigSection: ConfigurationSection { public CredentialsCollection CredentialItems { get { return base["CredentialsList"] as CredentialsCollection; } } public DataBlockOptionsCollection DataFlowOptionsItems { get { return base["DataFlowOptionsList"] as DataBlockOptionsCollection; } } }


///

/// Custom collection - credentials list /// public class CredentialsCollection: ConfigurationElementCollection, IEnumerable { protected override ConfigurationElement CreateNewElement() { return new CredentialsElement(); } protected override object GetElementKey(ConfigurationElement element) { return ((CredentialsElement)element).Username; } public CredentialsElement this { get { return BaseGet(index) as CredentialsElement; } } public new IEnumerator < Count; i++) { yield return BaseGet(i) as CredentialsElement; } } } /// /// Custom credentials item /// public class CredentialsElement: ConfigurationElement { public string Hostname { get { return base["hostname"] as string; } } public string Username { get { return base["username"] as string; } } public string Password { get { return base["password"] as string; } } public string Type { get { return base["type"] as string; } } public string Port { get { return base["port"] as string; } } } /// /// Custom collection - DataBlock options list /// public class DataBlockOptionsCollection: ConfigurationElementCollection, IEnumerable { protected override ConfigurationElement CreateNewElement() { return new DataBlockOptionsElement(); } protected override object GetElementKey(ConfigurationElement element) { return ((DataBlockOptionsElement)element).Name; } public CredentialsElement this { get { return BaseGet(index) as CredentialsElement; } } public new IEnumerator GetEnumerator() { for (var i = 0; i < Count; i++) { yield return BaseGet(i) as DataBlockOptionsElement; } } } /// /// Custom DataBlock options item /// public class DataBlockOptionsElement: ConfigurationElement { public string Name { get { return base["name"] as string; } } public string Maxdop { get { return base["maxdop"] as string; } } public string BoundedCapacity { get { return base["boundedcapacity"] as string; } } }


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

Наши кастомные настройки прочитаем так:

Читаем

public List CredentialsList { get; private set; } public Dictionary DataFlowOptionsList { get; private set; } ... static Config() { try { var customConfig = (CustomSettingsConfigSection)ConfigurationManager.GetSection("CustomSettings"); //Get mailboxes foreach (var item in customConfig.CredentialItems) CredentialsList.Add(new MailboxInfo { Hostname = item.Hostname, Port = Convert.ToInt32(item.Port), User = item.Username, Type = item.Type, Password = item.Password }); //Get DataFlow settings foreach (var item in customConfig.DataFlowOptionsItems) DataFlowOptionsList.Add(item.Name, new DataBlockOptions { Maxdop = Convert.ToInt32(item.Maxdop), BoundedCapacity = Convert.ToInt32(item.BoundedCapacity) }); } catch (Exception ex) { Logger.Log.Fatal("Error at reading config: {0}", ex.Message); throw; } }


Как-то очень затянуто получается, а мы даже не дошли до самого интересного.

Опустим пока обвязку из TopShelf, счетчики производительности, общение с БД и перейдем к делу! Создаем класс Crawler - ядро. Для начала читаем почту:

Private volatile bool _stopPipeline; ... public void Start() { do { var getMailsTasks = _config.CredentialsList.Select(credentials => Task.Run(() => GetMails(credentials))).ToList(); foreach (var task in getMailsTasks) task.Wait(); Thread.Sleep(2000); } while (!_stopPipeline); //Stop pipeline - wait for completion of all endpoints //Тут будет остановка DataFlow конвейера if (_stopPipeline) Logger.Log.Warn("Pipeline has been stopped by user"); }
Вот тут лень взяла свое и я решил не заморачиваться - если ящиков порядка 20-30 можно под каждый запустить таск и не париться о количестве потоков. (Разрешаю закидать помидорами.)

Переходим к самому чтению:

Private void GetMails(MailboxInfo info) { try { using (var client = new Pop3Client()) {
Сразу посчитаем тайминги доступа к ящику - пригодится для диагностики сети и загруженности сервера.

//Get Zabbix metrics var stopwatch = new Stopwatch(); stopwatch.Start(); //Get mail count client.Connect(info.Hostname, info.Port, false); client.Authenticate(info.User, info.Password); stopwatch.Stop();
Отправляем данные в Zabbix. Всё просто - указываем имя хоста (как оно заведено в Zabbix), ключ (опять таки строго, как в Zabbix) и строковое значение.

//Send it to Zabbix Zabbix.Sender.SendData(new ZabbixItem { Host = Config.HostKey, Key = info.Type + Config.TimingKey, Value = stopwatch.ElapsedMilliseconds.ToString() }); Logger.Log.Debug("Send [{0}] timing to Zabbix: connected to "{1}" as "{2}", timing {3}ms", info.Type, info.Hostname, info.User, stopwatch.ElapsedMilliseconds); var count = client.GetMessageCount(); if (count == 0) return; Logger.Log.Debug("We"ve got new {0} messages in "{1}"", count, info.User); //Send messages to sorting block for (var i = 0; i < count; i++) { try { var mailInfo = new MessageInfo { IsSpam = false, Mail = client.GetMessage(i + 1), Type = MessageType.UNKNOWN, Subtype = null, Recipient = null, Mailbox = info }; Logger.Log.Debug("Download message from "{0}". Size: {1}b", info.User, mailInfo.Mail.RawMessage.Length);
DataFlow pipeline будет создана при создании класса Crawler. Считаем, что наш первый этап - отсортировать письмо.

While (!_sortMailDataBlock.Post(mailInfo)) Thread.Sleep(500);
Видите, как просто - сам конвейер один. Все таски, читающие почту, кидают туда сообщения по одному. Если блок занят, Post вернет false и мы просто подождем пока он не освободится. Текущий потом в это время продолжает работать. Вот это я называю параллелизм без забот.

Сообщение ушло на конвейер, теперь его можно со спокойной душой сохранить в RAW архив (да-да! всё, что читаем - сохраняем в файловый архив. Служба поддержки нам потом скажет спасибо).

Настроим, например, ротацию архива:

NLog.config



Потом на него можно натравить logStash , но это уже другая история…

//Save every mail to archive Logger.Log.Debug("Archive message"); Logger.Archive.Info(Functions.MessageToString(mailInfo.Mail)); } catch (Exception ex) { Logger.Log.Error("Parse email error: {0}", ex.Message); Functions.ErrorsCounters.Increment(); //Archive mail anyway Logger.Log.Debug("Archive message"); Logger.Archive.Info(Encoding.Default.GetString(client.GetMessageAsBytes(i + 1))); } if (_config.DeleteMail) client.DeleteMessage(i + 1); if (_stopPipeline) break; } Logger.Log.Debug("Done with "{0}"", info.User); } } catch (Exception ex) { Logger.Log.Error("General error - type: {0}, message: {1}", ex, ex.Message); Functions.ErrorsCounters.Increment(); } }
Здесь мы использовали статические счетчики ошибок (в разрезе типов ящиков), где ErrorsCounters - это:

Public static Dictionary ErrorsCounters = new Dictionary();
А сами счетчики можно сделать так:

Counter.cs

class Counter { private long _counter; public Counter() { _counter = 0; } public void Increment() { Interlocked.Increment(ref _counter); } public long Read() { return _counter; } public long Refresh() { return Interlocked.Exchange(ref _counter, 0); } public void Add(long value) { Interlocked.Add(ref _counter, value); } public void Set(long value) { Interlocked.Exchange(ref _counter, value); } }


Перейдем к созданию конвейера. Допустим, у нас есть ящики, куда сыпятся автоответы. Такие письма надо распарсить (что за автоответ, от кого, по какой рассылке и т.д.) и сложить результат в хранилище (БД). Допустим, есть ящики, куда падают FBL отчеты. Такие письма сразу складываем в базу. Все прочие письма считаем «полезными» - их надо проверить на спам и отправить во внешнюю систему, например, CRM.

Как вы уже поняли, данный пример в основном рассматривает применение сборщика для задач маркетинга - сбор статистики по доставке почты, информация о спаме.

Итак, мы определились с рабочим потоком. Объявляем необходимые блоки в классе Crawler:

Class MessageInfo { public bool IsSpam { get; set; } public Message Mail { get; set; } public string Subtype { get; set; } public string Recipient { get; set; } public MessageType Type { get; set; } public MailboxInfo Mailbox { get; set; } } class Crawler { //Pipeline private TransformBlock _sortMailDataBlock; private TransformBlock _spamFilterDataBlock; private TransformBlock _checkBounceDataBlock; private TransformBlock _identifyDataBlock; private ActionBlock _addToCrmDataBlock; private ActionBlock _addToFblDataBlock; private ActionBlock _addToBounceDataBlock; ...
Создаем метод инициализации и создаем блоки конвейера (для инициализации блоков используем наши замечательные секции из конфигов):

Public void Init() { //*** Create pipeline *** //Create TransformBlock to get message type var blockOptions = _config.GetDataBlockOptions("_sortMailDataBlock"); _sortMailDataBlock = new TransformBlock(mail => SortMail(mail), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity }); //Create TransformBlock to filter spam blockOptions = _config.GetDataBlockOptions("_spamFilterDataBlock"); _spamFilterDataBlock = new TransformBlock(mail => FilterSpam(mail), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity }); //Create TransformBlock to sort bounces blockOptions = _config.GetDataBlockOptions("_checkBounceDataBlock"); _checkBounceDataBlock = new TransformBlock(mail => BounceTypeCheck(mail), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity }); //Create TransformBlock to identify bounce owner blockOptions = _config.GetDataBlockOptions("_identifyDataBlock"); _identifyDataBlock = new TransformBlock(mail => GetRecipient(mail), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity }); //Create ActionBlock to send mail to CRM blockOptions = _config.GetDataBlockOptions("_addToCrmDataBlock"); _addToCrmDataBlock = new ActionBlock(mail => AddToCrm(mail), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity }); //Create ActionBlock to send FBL to MailWH blockOptions = _config.GetDataBlockOptions("_addToFblDataBlock"); _addToFblDataBlock = new ActionBlock(mail => AddToFbl(mail), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity }); //Create ActionBlock to send Bounce to MailWH blockOptions = _config.GetDataBlockOptions("_addToBounceDataBlock"); _addToBounceDataBlock = new ActionBlock(mail => AddToBounce(mail), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity });
Собираем конвейер в соответствии с нашей схемой:

//*** Build pipeline *** _sortMailDataBlock.LinkTo(_spamFilterDataBlock, info => info.Type == MessageType.GENERAL); _sortMailDataBlock.LinkTo(_addToFblDataBlock, info => info.Type == MessageType.FBL); _sortMailDataBlock.LinkTo(_checkBounceDataBlock, info => info.Type == MessageType.BOUNCE); _sortMailDataBlock.LinkTo(DataflowBlock.NullTarget(), info => info.Type == MessageType.UNKNOWN); /*STUB*/ _checkBounceDataBlock.LinkTo(_identifyDataBlock); _identifyDataBlock.LinkTo(_addToBounceDataBlock); _spamFilterDataBlock.LinkTo(_addToCrmDataBlock, info => !info.IsSpam); _spamFilterDataBlock.LinkTo(DataflowBlock.NullTarget(), info => info.IsSpam); /*STUB*/
Как видим, всё предельно просто - связываем блок со следующим (с возможностью задания условия связи). Все блоки исполняются параллельно. Каждый блок имеет степень параллелизма и емкость (с помощью емкости можно регулировать очередь перед блоком, то есть блок сообщение принял, но еще не обрабатывает). Таким образом, можно задавать высокую степень параллелизма для «сложных» и долгих операций, как, например, парсинг содержимого письма.

Не буду описывать матчасть DataFlow, лучше всё прочесть в первоисточнике TPL DataFlow .

SortMailDataBlock.Completion.ContinueWith(t => { if (t.IsFaulted) ((IDataflowBlock)_spamFilterDataBlock).Fault(t.Exception); else _spamFilterDataBlock.Complete(); }); _sortMailDataBlock.Completion.ContinueWith(t => { if (t.IsFaulted) ((IDataflowBlock)_addToFblDataBlock).Fault(t.Exception); else _addToFblDataBlock.Complete(); }); _sortMailDataBlock.Completion.ContinueWith(t => { if (t.IsFaulted) ((IDataflowBlock)_checkBounceDataBlock).Fault(t.Exception); else _checkBounceDataBlock.Complete(); }); _spamFilterDataBlock.Completion.ContinueWith(t => { if (t.IsFaulted) ((IDataflowBlock)_addToCrmDataBlock).Fault(t.Exception); else _addToCrmDataBlock.Complete(); }); _checkBounceDataBlock.Completion.ContinueWith(t => { if (t.IsFaulted) ((IDataflowBlock)_identifyDataBlock).Fault(t.Exception); else _identifyDataBlock.Complete(); }); _identifyDataBlock.Completion.ContinueWith(t => { if (t.IsFaulted) ((IDataflowBlock)_addToBounceDataBlock).Fault(t.Exception); else _addToBounceDataBlock.Complete(); }); }
Всё, на самом деле конвейер уже работает, можно постить в него сообщения. Осталось только остановить его дополнив наш метод Start:

Start

public void Start() { do { var getMailsTasks = _config.CredentialsList.Select(credentials => Task.Run(() => GetMails(credentials))).ToList(); foreach (var task in getMailsTasks) task.Wait(); Thread.Sleep(2000); } while (!_stopPipeline); //Stop pipeline - wait for completion of all endpoints _sortMailDataBlock.Complete(); _addToCrmDataBlock.Completion.Wait(); _addToFblDataBlock.Completion.Wait(); _addToBounceDataBlock.Completion.Wait(); if (_stopPipeline) Logger.Log.Warn("Pipeline has been stopped by user"); }


Переходим к делегатам.
Сортировка… Ну, допустим у нас всё просто (усложнить то всегда успеем):

Private MessageInfo SortMail(MessageInfo mail) { switch (mail.Mailbox.Type) { case MailboxType.Crm: mail.Type = MessageType.GENERAL; break; case MailboxType.Bounce: mail.Type = MessageType.BOUNCE; break; case MailboxType.Fbl: mail.Type = MessageType.FBL; break; } return mail; }
Спам фильтр. Это на домашнюю работу - используйте SpamAssassin .
Вот вам делегат:

Private MessageInfo FilterSpam(MessageInfo mail) { //TODO: Add SpamAssassin logic return mail; }
И классы для работы с API SpamAssassin (ссылка на проект).
А мы переходим к парсингу писем. Парсим мы автоответы. Тут вступает в дело MEF.
Создаем проект (dll) с интерфейсами для наших плагинов (Назовем Interfaces).
Добавляем интерфейс:

Public interface ICondition { string Check(Message mimeMessage); } public interface IConditionMetadata { Type Type { get; } }
И… всё. Наш TopCrawler зависит от этого проекта и проект с плагинами тоже будет использовать его.
Создаем новый проект (тоже dll), назовем Conditions.
Добавим типы автоответов:

#region --- Types --- static class BounceType { public const string Full = "BounceTypeFull"; public const string Timeout = "BounceTypeTimeout"; public const string Refused = "BounceTypeRefused"; public const string NotFound = "BounceTypeNotFound"; public const string Inactive = "BounceTypeInactive"; public const string OutOfOffice = "BounceTypeOutOfOffice"; public const string HostNotFound = "BounceTypeHostNotFound"; public const string NotAuthorized = "BounceTypeNotAuthorized"; public const string ManyConnections = "BounceTypeManyConnections"; } #endregion
И классы, реализующие наш интерфейс:

Public class ConditionNotFound1: ICondition { public string Check(Message mimeMessage) { if (!mimeMessage.MessagePart.IsMultiPart) return null; const string pattern = "Diagnostic-Code:.+smtp.+550"; var regexp = new Regex(pattern, RegexOptions.IgnoreCase); return mimeMessage.MessagePart.MessageParts.Any(part => part.ContentType.MediaType == "message/delivery-status" && regexp.IsMatch(part.GetBodyAsText())) ? BounceType.NotFound: null; } } ... public class ConditionTimeout2: ICondition { return BounceType.Timeout; } ...
Как вы заметилиб всё дело в атрибутах. С помощью них плагины и будут загружены.
Возвращаемся к нашему проекту и загружаем плагины:

Class Crawler { ... //Plugins public IEnumerable> BounceTypeConditions { get; set; } private void LoadPlugins() { try { var container = new CompositionContainer(new DirectoryCatalog(_config.PluginDirectory), true); container.ComposeParts(this); } catch (Exception ex) { Logger.Log.Error("Unable to load plugins: {0}", ex.Message); } } ...
LoadPlugins дергаем в конструкторе нашего класса. Объяснять подробно про механизм загрузки не буду - гугл справится лучше.

Переходим к нашему делегату проверки типа Bounce. Условия будут применяться по очереди, пока не сработает первое - исключающий метод:

Private MessageInfo BounceTypeCheck(MessageInfo mailInfo) { try { foreach (var condition in BounceTypeConditions) { var res = condition.Value.Check(mailInfo.Mail); if (res == null) continue; mailInfo.Subtype = res; Logger.Log.Debug("Bounce type condition [{0}] triggered for message [{1}]", condition.Metadata.Type, mailInfo.Mail.Headers.MessageId); break; } } catch (Exception ex) { Logger.Log.Error("Failed to determine bounce type for message "{0}": {1}", mailInfo.Mail.Headers.MessageId, ex.Message); Logger.ErrorsCounters.Increment(); } return mailInfo; }
Таким образомб если появляется новая логикаб достаточно просто добавить в проект с плагинами новый класс, реализующий наш интерфейс и - вуаля! Пример второго плагина по определению отправителя письма прикладывать не буду - итак уже длинный пост (Автоответ сгенерировал сам сервер, поэтому отправителя тоже надо распарсить из заголовков письма) .

С записью результатов в БД тоже ничего необычного. Например, так:

Private void AddToBounce(MessageInfo mail) { try { MailWH.BounceAdd(mail); Functions.ProcessedCounters.Increment(); Functions.Log.Debug("Send Bounce to MailWH"); } catch (Exception ex) { Functions.Log.Error("Error saving Bounce message "{0}" to MailWH: {1}", mail.Mail.Headers.MessageId, ex.Message); Functions.ErrorsCounters.Increment(); } }

BounceAdd

public static long BounceAdd(MessageInfo message) { using (var conn = new SqlConnection(ConnectionString)) using (var cmd = new SqlDataAdapter("BounceAdd", conn)) { var body = message.Mail.FindFirstPlainTextVersion() == null ? message.Mail.FindFirstHtmlVersion().GetBodyAsText() : message.Mail.FindFirstPlainTextVersion().GetBodyAsText(); var outId = new SqlParameter("@ID", SqlDbType.BigInt) { Direction = ParameterDirection.Output }; cmd.SelectCommand.CommandType = CommandType.StoredProcedure; cmd.SelectCommand.Parameters.Add(new SqlParameter("@RawMessage", message.Mail.RawMessage)); cmd.SelectCommand.Parameters.Add(new SqlParameter("@Message", body)); cmd.SelectCommand.Parameters.Add(new SqlParameter("@Subject", message.Mail.Headers.Subject ?? "")); cmd.SelectCommand.Parameters.Add(new SqlParameter("@MessageID", message.Mail.Headers.MessageId ?? "")); cmd.SelectCommand.Parameters.Add(new SqlParameter("@AddressTo", message.Mail.Headers.To.Address ?? "")); cmd.SelectCommand.Parameters.Add(new SqlParameter("@AddressFrom", message.Mail.Headers.From.Address ?? "")); cmd.SelectCommand.Parameters.Add(new SqlParameter("@DateRecieved", DateTime.Now)); cmd.SelectCommand.Parameters.Add(new SqlParameter("@BounceTypeSysName", (object)message.Subtype ?? DBNull.Value)); cmd.SelectCommand.Parameters.Add(new SqlParameter("@SourceFrom", (object)message.Recipient ?? DBNull.Value)); // TODO: Add ListId support cmd.SelectCommand.Parameters.Add(new SqlParameter("@ListId", DBNull.Value)); cmd.SelectCommand.Parameters.Add(outId); conn.Open(); cmd.SelectCommand.ExecuteNonQuery(); return outId.Value as long? ?? 0; } }


Простите, что не успел показать TopShelf - пост и так уже слишком раздулся.

Выводы

В этом уроке мы узнали, что задача сбора почты может оказаться не такой простой. Разработанное ядро позволяет быстро добавлять новые шаги процесса - DataFlow-блоки, не затрагивая существующую логику. Подсистема плагинов позволяет быстро наращивать скриптоподобную логику парсинга, а сам DataFlow распараллеливает все вычисления (причем мы имеем возможность гибко настраивать многопоточность под конкретную машину). TopShelf дает нам возможность запускать сервис как в режиме службы, так и в консольном режиме для облегчения отладки.

Фух… Если будет интересно, дальше расскажу, как поставить это на рельсы Continious Integration, настроить автобилды и выпуск релиза через VS Release Management .

Теги: Добавить метки

Для правильной и высоко эффективной работы на разных досках, вам нужно иметь целый пакет почтовых ящиков, для этого вам нужно создать себе 10-20 почтовых ящиков. Из-за некоторых проблем, на Mail.ru, Gmail.ru, Gmail.com лучше их не делать . Проблемы эти заключаются в том, что вышеперечисленные почтовые сервисы с некоторых пор стали усиленно бороться со спамом. И они как раз Орифлейм (письма как-нибудь связанные с ним) приравняли к спаму.


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


Работать с ящиками удобнее, через почтовую программу, например, The Bat или Mozilla Thunderbird (приложение к браузеру Мозиле), или через другие аналогичные, чтобы не работать через браузер, так как одновременно открыть в браузере десяток почтовых ящиков – не получится. А любая почтовая программа позволит вам без проблем работать с письмами со всех ящиков.

Обратите внимание, что названия вами созданных для работы на досках ваших почтовых ящиков, НЕ должны быть похожими между собой названиями, тем более, если вы будете регистрироваться в один присест - не сходя со стула. Иначе администраторы досок объявлений вас элементарно вычислят и удалят после вашей регистрации всех ваших аккаунтов. Так как на любой серьёзной доске можно иметь от одного человека только один аккаунт.


А можно поступить ещё проще и работать всего с одной почтой, которая будет сама собирать письма со всех ваших почтовых адресов. Почта на Яндексе с этим прекрасно справится. Настройка простейшая и много времени не займёт.

Настройка Яндекс-почты для сборки писем с разных ящиков

Для начала вы входите через браузер в свою заранее приготовленную Яндекс-почту для сбора писем со всех ящиков. Потом справа вверху находите обозначенный на первой картинке символ и нажимаете на него.

После этого у вас откроется выпадающее поле, обозначенное на втором скрине. Вам нужно нажать на ссылку «СБОР ПОЧТЫ С ДРУГИХ ЯЩИКОВ».


Затем вы попадёте на страницу настройки почтовых ящиков, с которых ваша почта на Яндексе будет собирать письма со всех ваших Е-мейлов. Далее всё интуитивно понятно. Есть, правда, одно ограничение - одна Яндекс-почта может собирать все сообщения максимум с 10 разных почтовых ящиков, но это вообще не проблема, например, можно для сбора почты сделать 2 или 3 почтовых ящика на Яндексе.


Следующим шагом будет активация в настройках ящиков-сборщиков на Яндексе настройки доступа к этим почтовым ящикам по протоколам IMAP и POP3. На двух скринах ниже видно, как добраться до этих настроек.



На всех ящиках с которых ваша Яндекс-почта будет собирать все письма, нужно также поступить аналогичным образом, предоставив доступ к этим ящикам по протоколам IMAP и POP3. Там настройки делаются аналогично. Правда при сборе писем таким методом через Яндекс-сборщик, имеется маленький не всегда удобный момент - сборка писем не происходит моментально, она осуществляется в течении суток всего по нескольку раз. Но, думаю, это не столь критично.


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