Сборщик почты 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). В секцию с конфигом добавляем:
Конфигурации
А ниже собственный таргет для MSBuild:
Transform target
Лично я привык именно таким способом - по старинке - добавлять трансформацию конфигов для разделения сред.
Для удобства предлагаю 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
{
///
Конфиги… Пора уже делать хоть что-то интересное. Во-первых, в конфигах будем хранить ящики, которые мы опрашиваем. Во вторых настройки 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
Создаем секции
///
///
Полную реализацию конфига писать не буду, подразумевается, что в процессе разработки туда будут добавляться нужные нам параметры.
Наши кастомные настройки прочитаем так:
Читаем
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
Потом на него можно натравить 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
А сами счетчики можно сделать так:
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
Создаем метод инициализации и создаем блоки конвейера (для инициализации блоков используем наши замечательные секции из конфигов):
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;
}
}
Простите, что не успел показать 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. Там настройки делаются аналогично. Правда при сборе писем таким методом через Яндекс-сборщик, имеется маленький не всегда удобный момент - сборка писем не происходит моментально, она осуществляется в течении суток всего по нескольку раз. Но, думаю, это не столь критично.
Для моментального же получения почты на одну почту-сборщик на Яндексе, нужно настроить не сбор писем, а переадресацию (пересылку). Это так же делается не сложно. Посмотреть осуществляемые настройки почты для переадесации, можно на этой странице подсказок Яндекса.
Переключаться с одной вкладки с 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.
Может быть, у вас есть свои идеи, как сгруппировать почту в одном месте? Делитесь в комментариях.
В Gmail можно получать письма из нескольких почтовых аккаунтов. Выберите один из вариантов:
- Импортировать все сообщения (старые и новые). Воспользуйтесь этим способом, если собираетесь и далее получать письма на другой адрес (в том числе и адрес Gmail). Возможны незначительные задержки между поступление писем в другой почтовый ящик и их импортом в Gmail.
- Получить только старые сообщения . Подходит для тех, кто недавно перешел на Gmail.
- Пересылать только новые сообщения . Выберите этот вариант, если хотите мгновенно получать новые сообщения из другого ящика.
Как импортировать все письма
Вы можете импортировать все старые и новые письма из другого аккаунта.
Примечание. Из другого аккаунта можно перенести только письма. Папки и ярлыки импортировать невозможно.
Шаг 1. Измените настройки во внешнем аккаунте
Yahoo, Outlook или другой сервис
Убедитесь, что в вашей почтовой службе есть доступ по протоколу POP. Затем измените настройки в Gmail .
Другой аккаунт Gmail
Шаг 2. Измените настройки Gmail
Ошибка "Сервер отказал в доступе по протоколу POP3"
- Если вы используете двухэтапную аутентификацию , введите пароль приложения .
- Если вы используете Gmail в организации или учебном заведении , в поле "POP-сервер" введите mail.domain.com и выберите порт 110.
- Если вы используете записи Google MX в корпоративном или учебном аккаунте, в поле "POP-сервер" введите pop.gmail.com и выберите порт 995.
- Если войти не удается , попробуйте включить доступ для ненадежных приложений . Также, возможно, понадобится отключить защиту по коду или слову .
этими советами .
Другие ошибки
Если вы столкнулись с другими ошибками, нажмите Показать сведения об ошибке и выполните следующее:
- Если POP отключен , включите его в настройках аккаунта, из которого импортируете письма.
- Если POP недоступен , скорее всего, ваш сервис электронной почты не поддерживает доступ по этому протоколу. В этом случае можно импортировать старые письма и включить автоматическую пересылку новых сообщений.
Если у вас возникают проблемы со Сборщиком писем, воспользуйтесь этими советами .
Если нужно получить только старые сообщения
Если вы перешли на Gmail недавно, перенесите старые письма из ящика, которым вы пользовались раньше.
Мы будем пересылать письма из старого аккаунта на ваш новый адрес Gmail в течение 30 дней, чтобы вы могли постепенно уведомить свои контакты о смене адреса.
На сегодняшний день это, пожалуй, самые популярные почтовые сервисы. И мы при рассмотрении того или иного ресурса как бы невзначай оговаривались о том, что к каждому ящику можно подключить другой почтовый адрес с другого сервиса.
Ведь заходить на каждый почтовый ящик и проверять почту не всегда удобно. Поэтому для удобства и была создана возможность добавления почтового ящика к уже имеющемуся адресу. Тогда все почта будет собираться в одном месте, в одном почтовом ящик. Сегодня как раз мы и узнаем, как организовать сбор почты с других ящиков.
Начнем с Mail ru
Как добавить ящик в Mail ru
Почтовый сервис mail ru предоставляет возможность добавления стороннего почтового ящика к вашему основному.
Для того, чтобы добавить еще один почтовый ящик, зайдите в свой основной почтовый аккаунт mail ru и вверху справа кликнете по своему адресу
И кликнете по кнопочке «Добавить почтовый ящик ».
После ввода данных, нажимаем «Войти ».
Результатом наших действий появилась папка с нашим именем и фамилией, туда и будут доставляться письма от Яндекс почты. И вам отпадет надобность заходить в почтовый ящик от Яндекса, чтобы проверить новую почту.
Теперь нечто подобное сделаем в Яндекс почте.
Как добавить почтовый ящик в Яндекс?
Для добавления ящика с другой почтовой службы в системе Яндекс, также заходим в свой аккаунт Яндекс почты
И нажимаем на значок шестеренки и выбираем пункт «Сбор почты с других ящиков ».
Переходим в Настройки «Сбор почты ». Теперь мы будем добавлять ящик от mail ru. Вводим наш электронный ящик, пароль к нему и нажимаем «Включить сборщик »
На следующем этапе вы можете указать для писем с Mail метку. Все письма от сервиса mail будут поступать в папку «Входящие». Старые письма пусть отмечаются как прочитанные. Далее повторно указываем пароль и жмем «Сохранить изменения ».
Все, мы подключили дополнительный почтовый ящик к Яндекс почте. Если в дальнейшем вы не захотите больше получать письма с подключенного ящика, его в любое время можно отключить.
Подобным образом можно добавить и другие ящики.
Для перехода между основным и добавленными ящиками используйте основное меню, далее выбирайте ящик, который вам нужен.
Как добавить ящик в Gmail?
Почта от компании Google тоже дает возможность подключения дополнительных 5 почтовых ящиков.
И выбираем пункт «»
Переходим на вкладку «Аккаунты и импорт » и нажимаем на ссылочку «Добавьте почтовый аккаунт »
В новом окне вводим адрес ящика, который мы будем добавлять. Жмем «Дальше ».
Затем по очереди указываем пароль от добавляемого ящика, затем меняем POP-сервер на pop3. mail . ru . Отметьте галочкой параметр, который отвечает за то, чтобы копии получаемых писем были сохранены на сервере. Это будет ваша подстраховка на тот случай, если что-то случится с аккаунтом Google ваши письма будут сохранены на сервере mail ru. Для удобства распознания на какой ящик пришло письмо, добавьте ярлык ко всем входящим письмам от mail ru
После этого нажимаем «Добавить аккаунт ».
На следующей странице мы ничего такого не меняем, разве что можете задать свое имя пользователя . Вводим пароль от ящика mail и нажимаем «Добавить аккаунт ».
После этого на ваш добавляемый почтовый ящик придет письмо с кодом подтверждения. Подтвердить можно двумя способами: перейти по ссылке в письме или скопировать из письма код и вставить в поле. Нажимаем «Подтвердить ».
Теперь настройки изменились. Как видим внизу на скриншоте появился наш добавляемый почтовый адрес, который можно изменить или удалить.
Можно также установить по умолчанию ящик от mail ru для отправки писем, нажав на соответствующую ссылку.
И вот письма с ящика mail ru успешно поступили в ящик от Google. Как и видим, все письма помечены ярлыком, которым мы задали в процессе добавления ящика.
И при создании нового письма вы сможете выбрать с какого ящика вам нужно отправить письмо.
Также для сбора писем в одном месте можно использовать специальные программы - почтовые клиенты. Наиболее популярным является «The Bat ». Но данная программа платная. Среди бесплатных - Mozilla Thunderbird . О том, что , читайте на нашем сайте.
Напишите в комментариях пользуетесь ли вы почтовыми клиентами или сборщиком писем, как мы сегодня описали.
А на этом позвольте закончить. Удачи и успехов всем вам!
Мы должны стремиться не к тому, чтобы нас всякий понимал, а к тому, чтобы нас нельзя было не понять.