Разумеется, всё должно быть распараллелено. Тут на сцену выходит моя любимая библиотека TPL DataFlow .
Забирать почту будем по POP3. Все «модные штучки» IMAP в данной задаче излишни - надо как можно быстрее и проще забрать исходник письма и удалить его на сервера. POP3 тут хватит за глаза. Используем OpenPop.NET .
В качестве факультатива прикрутим мониторинг в Zabbix . (Мы же собрались работать 24/7 и выдавать хваленую скорость - нужно следить за этим).
Install-Package Nlog
Install-Package OpenPop.NET
Install-Package TopShelf
Install-Package Microsoft.TPL.DataFlow
Переходим в папку проекта, создаем App.Debug.config и App.Release.config. Выгружаем проект из студии, открываем его код (Здесь и далее TopCrawler.csproj). В секцию с конфигом добавляем:
Конфигурации
Transform target
Создаем в проекте одноименную папку (должен же быть порядок). Внутри создаем 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
namespace TopCrawler.Singleton
{
///
Конфиги
Определяем типы
#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
Создаем секции
///
///
Наши кастомные настройки прочитаем так:
Читаем
public List
Опустим пока обвязку из 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
//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
А сами счетчики можно сделать так:
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);
}
}
Как вы уже поняли, данный пример в основном рассматривает применение сборщика для задач маркетинга - сбор статистики по доставке почты, информация о спаме.
Итак, мы определились с рабочим потоком. Объявляем необходимые блоки в классе 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
Создаем метод инициализации и создаем блоки конвейера (для инициализации блоков используем наши замечательные секции из конфигов):
Public void Init()
{
//*** Create pipeline ***
//Create TransformBlock to get message type
var blockOptions = _config.GetDataBlockOptions("_sortMailDataBlock");
_sortMailDataBlock = new TransformBlock
Собираем конвейер в соответствии с нашей схемой:
//*** 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
Как видим, всё предельно просто - связываем блок со следующим (с возможностью задания условия связи). Все блоки исполняются параллельно. Каждый блок имеет степень параллелизма и емкость (с помощью емкости можно регулировать очередь перед блоком, то есть блок сообщение принял, но еще не обрабатывает). Таким образом, можно задавать высокую степень параллелизма для «сложных» и долгих операций, как, например, парсинг содержимого письма.
Не буду описывать матчасть 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
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;
}
}
Фух… Если будет интересно, дальше расскажу, как поставить это на рельсы Continious Integration, настроить автобилды и выпуск релиза через VS Release Management .
Теги: Добавить метки
Множество хитростей помогут сделать работу с электронной почтой более удобной - SMS-уведомления, автоответчик, сборщик почты и другие возможности.
Несмотря на повсеместное распространение программ и сервисов для быстрого обмена небольшими сообщениями (ICQ, Google Talk и прочих), старая добрая электронная почта - тот способ обмена информацией, с которого, вообще говоря, начался Интернет - по-прежнему пользуется популярностью, почетом и уважением.
К сожалению, электронные почтовые ящики многих из нас используются, что называется, не в полную силу. Вы знаете, например, что несколько ящиков, даже расположенных в разных почтовых службах, можно фактически объединить в один? Или что в ожидании важного письма необязательно сидеть возле экрана, потому что можно настроить SMS-уведомление? Эти и многие друге возможности скрыты в настройках ваших почтовых ящиков, добраться к ним - дело нескольких кликов, но надо знать, в какую сторону «копать».
Если вы по тем или иным причинам в течение долгого времени будете отрезаны от Интернета (всякое бывает - простудились, уехали на дачу или в отпуск), то имеет смысл включить на этот срок так называемый автоответчик, который на все поступающие письма будет сообщать, что владелец ящика отбыл «в Париж по делу срочно» и ответит не сразу.
В системе Mail.ru (www.mail.ru) доступ к этой возможности можно получить, зайдя в почтовый ящик, нажав в верхнем меню кнопку «Еще», выбрав пункт «Настройки», а в нем - меню «Мастер писем». В нижней части открывшейся страницы вы увидите раздел «Автоответчик». Поставив галочку напротив пункта «Включить автоответчик», заполните поле «Текст автоответа». В нем вы вольны написать все что угодно, лишь бы ваш абонент понял, что вы не можете сию секунду прочесть его письмо, но как только окажетесь у компьютера, сразу прочтете. Под полем для текста задается время работы автоответчика - можно указать не только дату, но даже часы и минуты. Для того чтобы автоответчик заработал, необходимо ввести пароль, который вы используете для входа в почту.
В «Яндекс.Почте» (mail.yandex.ru) автоответчик доступен в меню «Настройка - Правила обработки почты». Чтобы включить его, необходимо нажать кнопку «Создать правило», а затем в разделе «Выполнить действие» выбрать пункт «Ответить следующим текстом» и ввести в поле нужный текст (вроде «Я сейчас не могу прочитать ваше письмо, но обещаю сделать это, как только у меня появится такая возможность»). Когда закончите, нажмите кнопку «Создать правило».
Есть автоответчик и в популярной почтовой системе Gmail (www.gmail.com). Его можно включить в настройках, кликнув на изображение шестеренки в верхнем углу. В разделе настроек зайдите во вкладку «Общие» и установите переключатель в положение «Включить автоответчик». При этом можно настроить автоответчик так, что письма о вашей недоступности будут отправляться только тем, кто добавлен в список контактов, - посторонние люди об отсутствии владельца ящика знать не будут.
Если вы используете несколько почтовых ящиков, то вам может пригодиться функция «сбора почты». Практически любая почтовая система позволяет подключаться к другим адресам электронной почты и скачивать оттуда письма. Таким образом у вас отпадет необходимость следить сразу за несколькими ящиками - вся корреспонденция будет складироваться в одном месте. В Mail.ru «сборщик почты» находится в разделе «Настройки - Сборщик почты (POP3-сервера)». Настраивается эта функция так: нужно указать название POP3-сервера и ввести пароль от ящика. Например, если вы хотите, чтобы в ваш ящик на Mail.ru поступали письма с «Яндекс.Почты», укажите адрес сервера pop.yandex.ru и пароль, который вы используете в почте «Яндекса». А если вам нужно, чтобы ваша почтовая система «забирала» почту с Gmail, то адрес pop3-сервера должен быть таким: pop.gmail.com. О том, как называются pop3-серверы других почтовых служб, можно узнать на сайтах этих служб. Их в Сети достаточно много, и каждую из них упомянуть будет сложновато.
В «Яндекс.Почте» сбор писем из других ящиков настраивается проще: нужно просто указать e-mail, с которого вы хотите выкачивать письма, и пароль к нему. Все остальные настройки система выполнит самостоятельно. В Gmail «сборщик почты» настраивается в разделе «Настройки почты - Аккаунты и импорт». В этой вкладке есть раздел «Сбор почты с других аккаунтов».
К слову сказать, собрать всю почту в одном ящике можно и иным способом. Так, в каждом из ваших электронных ящиков вы можете указать, что желаете всю входящую корреспонденцию перенаправлять на тот или иной адрес. Так, в «Яндекс.Почте» это делается в «Правилах обработки входящей почты». Зайдя в этот раздел, нажмите на кнопку «Создать правило» и выберите действие под названием «Переслать по адресу», после чего укажите адрес, куда следует перенаправлять почту. В Mail.ru перенаправлением почты заведует меню «Пересылка» в разделе настроек, а в Gmail, для того чтобы настроить пересылку писем, зайдите в раздел «Настройки почты - Пересылка и POP/IMAP», после чего в первом раскрывающемся меню выберите пункт «Добавить новый адрес электронной почты».
Умеют почтовые системы и «отсекать» письма, которые вы по тем или иным причинам не хотите видеть в своем ящике. В «Яндекс.Почте» добавить адрес того или иного человека в так называемый «черный список» можно в разделе «Настройки - Правила обработки входящей почты». В поле черного цвета просто укажите «недружественный» e-mail и нажмите кнопку «добавить». Пункт «Черный список» существует и в настройках ящика Mail.ru. В Gmail проще всего нажать кнопку «Спам!» - письмо от неприятного адресата переместится в «мусорную корзину», и то же самое будет происходить в дальнейшем, но уже без вашего участия.
В ожидании важного письма совершенно необязательно часами сидеть перед компьютером и каждую минуту проверять почту. Так, например, Mail.ru позволяет настроить отправку SMS-уведомлений о приходе новых писем. В разделе «SMS-уведомления» укажите свой номер мобильника и поставьте галочку напротив пункта «Уведомлять о новой почте по SMS». Можно также выбрать время, когда SMS о новых письмах присылаться не будут - например, вряд ли кто-то захочет, чтобы его беспокоили по ночам. В Gmail и «Яндекс.Почте» такой возможности пока не предусмотрено, однако почта «Яндекса» позволяет при отправке письма отослать на тот или иной мобильный номер уведомление. Сделать это можно, нажав на ссылку «Дополнительные параметры» внизу формы написания письма и указав в соответствующем окне номер телефона.
Почтовые системы позволяют вам узнавать, было ли письмо доставлено до адресата. После того как получатель сообщения откроет его, вам в ответ отправится специальное письмо, в котором будет об этом сказано. В «Яндекс.Почте» это делается при помощи ссылки «Дополнительные параметры» под текстом нового письма - в открывшемся окне надо просто поставить галочку напротив пункта «Уведомить о получении письма». А вот разработчики почты Gmail считают такую функцию излишней - во всяком случае, отыскать ее в настройках не удалось.
По мере активной деятельности в сети, у меня накопилось много почтовых аккаунтов, часть из которых, я активно использую для разных целей. Почтовых программ я не использую, а заходить и проверять почту в каждом ящике – долго, поэтому решил настроить сбор почты в одном месте. В этом посте расскажу о том, как настроить сбор почты с разных ящиков на одном аккаунте gmail.
Большая часть моих аккаунтов на яндексе и на gmail для домена. Почта с большинства аккаунтов, уже давно собирается на одном аккаунте gmail, но не вся, и периодически приходиться заходить и проверять другие почтовые аккаунты. Плюс отправка писем от имени другого аккаунта, настроена по простой схеме, когда почта отправляется через домен и аккаунт gmail, а не через почтовый сервер, на котором находится другой ящик. В общем, решил всё основательно упорядочить и настроить, собрать почту со всех активных аккаунтов в одном месте, на одном домене прикрученном к gmail, который давно взял специально для этих целей.
Так сложилось, что я никогда не использовал почтовых программ, не нравятся мне они. Gmail, я считаю, намного удобней. Ничего не нужно загружать себе на компьютер, удобный поиск, удобная группировка писем в цепочки и не только. Короче, тут я даже не думал, для работы с почтой, я использовал, и буду использовать gmail. Плюс также в том, что Вы можете получить доступ к архиву почты с любого компьютера. О том, как завести gmail для домена, можно прочитать в посте .
И так, к сути. Ниже приведу инструкцию, как я настроил сбор почты в одном месте, на аккаунте gmail для домена.
Что мне было нужно?
Всё. Больше ничего мне не нужно.
Начнём по порядку.
1. Сбор почты с разных ящиков/аккаунтов на одном аккаунте gmail
Здесь есть несколько путей.
1) Настроить пересылку почты с другого ящика/аккаунта на ваш основной аккаунт
У большинства развитых почтовых сервисов, есть такая возможность. У меня аккаунты на яндекс и на gmail, поэтому здесь опишу настройку пересылки почты для этих почтовиков.
Пересылка/Сбор почты с другого аккаунта Gmail
Переходим в аккаунте, с которого хотим пересылать почту, в Настройки => Пересылка и POP/IMAP
Отмечаете “Включить POP для всех писем”, выбираете, что нужно сделать пересылаемыми письмами. У меня стоит “Сохранить копию письма во входящих”. Вводите адрес, на который хотите пересылать почту.
После этого, на добавленный для пересылки емайл, приходит код подтверждения. Вводите код.
Затем выбираете пересылать на добавленный адрес и действие с письмами после пересылки:
Всё. Теперь все письма будут пересылаться на указанный вами емайл.
Пересылка/Сбор для почты с яндекс
Переходите в Настройка => Правила обработки почты => Создать правило.
Создаёте правило “Переслать по адресу” и отмечаете “сохранить копию при пересылке”. Жмёте создать правило.
После этого на емайл указанный для пересылке приходит письмо с ссылкой. Переходите по ссылке и нажимаете “Включить правило”.
Всё. Теперь вся почта с аккаунта яндекс будет пересылаться на указанный вами емайл.
2) Собирать почту с помощью сборщика почты gmail
Этот способ, лично я, использую только для сбора почты если:
Почему только в этих случаях?
Потому что:
Во-первых , есть ограничение, и Вы сможете собирать почту только с 5 аккаунтов, не больше. Это ограничение для бесплатного аккаунта, на коммерческом варианте, насколько я знаю, такого ограничения нет, но могу ошибаться.
Во-вторых , задержка по времени. Гугл сам выбирает время, через которое он будет собирать вашу почту с другого аккаунта. Можно, конечно, проверить руками, в настройках почты, выбрать нужный аккаунт и нажать проверить, но это уже не то. Если же Вы настроите пересылку с другого почтового аккаунта, то письма будут приходить моментально.
Как настроить сбор почты с помощью сборщика gmail
Переходите Настройки => Аккаунты => Получать почту из других аккаунтов => Добавить свой почтовый аккаунт
Добавляете емайл, с которого хотите собирать почту. Вводите данные и выбираете нужные действия. Данные для разных почтовых серверов – разные. Нужно уточнять. Для большинства крупных почтовиков типа яндекс, мейл, нужные настройки вводятся по умолчанию правильно.
Подробно настройка отправки писем от имени другого аккаунта описана ниже, при рассмотрении пункта 2 – “Иметь возможность отправлять письма от имени другого аккаунта и не палиться”. После этого, gmail будет собирать почту с добавленного почтового ящика.
2. Иметь возможность отправлять письма от имени другого аккаунта и не палиться
Для того, чтобы настроить возможность отправки почты от имени другого аккаунта, переходим в Настройки => Аккаунты => Добавить другой свой адрес электронной почты.
Вводим адрес и желаемое имя, которое будет указано при отправке письма.
Здесь предлагают 2 варианта, простой и посложнее:
Раньше мне не хотелось замарачиваться с настройкой и я выбирал первый вариант. Но при первом варианте, получатель, насколько я понимаю, будет видеть, что письмо отправлено совершенно с другого домена, а возможно, можно будет увидеть реальный адрес отправителя.
При втором варианте, почта отправляется с сервера, на котором находиться другой аккаунт. При этом, на сколько я знаю, адрес и домен не палятся, а отображаются те адреса и домен, от имени которых отправлено письмо. Поэтому я выбираю второй вариант.
Выбираем “Защищенное соединение с использованием TLS”, рекомендуемое gmail. Вводим адрес SMTP сервера. Для яндекса это smtp.yandex.ru порт 25. Это всё указано по умолчанию. Порт я ставил и другой, вроде тоже работало. Для gmail — smtp.gmail.com порт 587. Для других почтовых сервисов, нужно уточнять адрес smtp сервера.
После этого, на добавленный емайл придёт код. Вводите код и подтверждаете емайл.
Всё. Теперь Вы можете отправлять письма от имени другого аккаунта.
3. Помечать письма, отправленные на разные емайл адреса
Для того, чтобы проще ориентироваться, где и какие письма, создадим ярлыки для каждого аккаунта или группы аккаунтов и настроим фильтры.
Создаём ярлыки для писем
Переходим в Настройки => Ярлыки и создаём ярлык.
Создаём фильтр для писем
Переходим в Настройки=> Фильтры => Создать новый фильтр и создаём фильтр.
При создании фильтра, есть много настроек. Я создаю фильтр по адресату, кому адресовано письмо.
Мне нужно только пометить письмо ярлыком, поэтому я выбираю только “ Применить ярлык ”, выбираю ярлык и нажимаю “Создать фильтр”. Всё. Теперь все письма, адресованные на конкретный емайл, будут помечены ярлыком.
Таким образом, я теперь получаю письма более чем с 20 различных аккаунтов и имею возможность отвечать от имени этих аккаунтов, не паля основной адрес, с одного места. Теперь мне не нужно заходить в разные аккаунты, чтобы проверить почту и ответить, что экономит много времени. Возможно, и вам пригодится такое решение и поможет инструкция.
Gmail рулит!)
Есть чем дополнить – пишите!
В Gmail можно получать письма из нескольких почтовых аккаунтов. Выберите один из вариантов:
Вы можете импортировать все старые и новые письма из другого аккаунта.
Примечание. Из другого аккаунта можно перенести только письма. Папки и ярлыки импортировать невозможно.
Убедитесь, что в вашей почтовой службе есть доступ по протоколу POP. Затем измените настройки в Gmail .
этими советами .
Если вы столкнулись с другими ошибками, нажмите Показать сведения об ошибке и выполните следующее:
Если у вас возникают проблемы со Сборщиком писем, воспользуйтесь этими советами .
Если вы перешли на Gmail недавно, перенесите старые письма из ящика, которым вы пользовались раньше.
Мы будем пересылать письма из старого аккаунта на ваш новый адрес Gmail в течение 30 дней, чтобы вы могли постепенно уведомить свои контакты о смене адреса.
Переключаться с одной вкладки с 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.
Может быть, у вас есть свои идеи, как сгруппировать почту в одном месте? Делитесь в комментариях.