Menú
Está libre
registrarse
hogar  /  Multimedia / Configuración de la recopilación de correo de Yandex. Recopilamos todas las cartas de diferentes buzones en una

Configuración de la recopilación de correo de Yandex. Recopilamos todas las cartas de diferentes buzones en una

Probablemente, solo unos pocos no enfrentaron el problema de que ya no les gustaba su dirección de correo electrónico o simplemente no la necesitaban. Pero, ¿y si una caja tiene una gran cantidad de contactos que no quisiera perder?

La primera solución que puede venir a la mente es crear una nueva y hermosa dirección mientras verifica constantemente la segunda. Es complicado. En este caso, comenzamos a crear aún más buzones y nos confundimos con muchas direcciones.

Hay muchos inconvenientes: existe el riesgo de olvidar la contraseña, la dirección continúa molestando [correo electrónico protegido]cuando eres el director de una empresa seria, ¡y mucho más!

Hay una solución y es muy simple. Y conveniente.

Cuando haya creado un buzón con una dirección ideal, habilite la recopilación de cartas del correo antiguo. Todas las cartas de los buzones conectados se encuentran dentro del correo principal en las carpetas del mismo nombre. Todo está ordenado, claro y ordenado.

El recopilador ahorra tiempo al cambiar de una casilla a otra y le permite cambiar completamente a una nueva dirección sin temor a que alguien quede sin respuesta.

¿Como instalar?

Una vez más. Todo es muy simple. Nosotros decimos:

  1. Vaya a la configuración de su buzón;
  2. Seleccione la sección "Correo de otros buzones";
  3. Ingrese la dirección de correo electrónico y la contraseña de la casilla desde la que desea recopilar cartas.

Después de conectar una nueva dirección, la verá en la lista general en la misma página.

En esta sección, puede administrar fácilmente el recopilador: pausar, eliminar o agregar cuadros adicionales. Las cartas recopiladas se almacenarán en una carpeta separada con subcarpetas internas que creó en el buzón antiguo.

Por cierto, si está decidido a usar la nueva dirección hermosa, pero es demasiado vago para notificar a todos los que todavía están escribiendo en el correo antiguo, configure las reglas de filtrado con respuesta automática de la nueva dirección.

Para hacer esto, configure el filtro y en la columna "Si cartas a quién" indique su dirección anterior. Seleccione la acción "Responder por mensaje". Si indica la dirección del nuevo buzón en el mensaje, todos los que escriban en el correo antiguo recibirán una respuesta y no perderán sus contactos.

Cambiar de una pestaña de Gmail a otra con Yandex.Mail es bastante tedioso. Y si tiene docenas de cuentas con diferentes proveedores de correo, la verificación matutina de la nueva correspondencia se convierte en una tortura. Al combinar letras en un solo lugar, se librará de este inconveniente.

interfaz web

La mayoría de los proveedores de correo electrónico proporcionan una función integrada para recopilar correos electrónicos de varios buzones. Por ejemplo, intentemos recopilar cartas de todos sus buzones en una cuenta de Gmail.

En primer lugar, asegúrese de que el servicio postal desde el que desea recoger cartas tenga acceso a través del protocolo POP. Luego, vaya a la configuración de Gmail y haga clic en "Configuración" en la esquina superior derecha. Vaya a la pestaña "Cuentas" y busque la sección "Recibir correo de otras cuentas".

Agregue una cuenta, ingrese su dirección de correo electrónico y haga clic en "Siguiente", luego ingrese la contraseña. Para que el intercambio de correo entre proveedores sea más seguro, asegúrese de que la opción "Usar siempre una conexión segura (SSL) al recibir correo" esté habilitada. Luego haga clic en "Agregar cuenta".

Ahora, los correos electrónicos que lleguen a la dirección agregada se recopilarán automáticamente en la Bandeja de entrada de su Gmail. Puede agregar tantas direcciones postales como necesite.

Clientes de escritorio

El correo electrónico necesita software. Sí, puede hacer mucho en el cliente web de correo (a veces mucho más de lo que Google ahora le permite hacer en Gmail). Pero la interfaz web no se compara con la aplicación nativa. Incluso la IU web más moderna es un cuello de botella en el trabajo con el correo.

Rafe Needleman, Сnet.com

Los clientes de correo electrónico de escritorio son buenos porque pueden agregar correos electrónicos de varias cuentas. Al mismo tiempo, puede trabajar con docenas de direcciones y ni siquiera pensar en qué proveedor tiene este o aquel mensaje.

La mayoría de los clientes de correo electrónico de escritorio tienen una bandeja de entrada compartida integrada. Incluso si su cliente favorito solo admite trabajar con carpetas separadas para los correos electrónicos entrantes, puede ensamblarlos fácilmente usando filtros inteligentes.

A pesar de que Outlook está diseñado para administrar varios buzones al mismo tiempo, aún muestra una Bandeja de entrada separada para cada cuenta. Pero esto se puede solucionar fácilmente con filtros.

Abra Outlook, vaya a la pestaña "Carpetas" y haga clic en "Crear carpeta de búsqueda" en la barra de herramientas. Luego seleccione "Crear una carpeta de búsqueda personalizada". Haga clic en "Seleccionar", pero no seleccione los criterios de búsqueda para que todos los mensajes nuevos se envíen a la carpeta. Asigne un nombre a la carpeta como desee, por ejemplo, "Todos los correos".

Haga clic en "Examinar", seleccione todas las carpetas y buzones de los que desea recopilar correo, y marque la opción "Buscar en subcarpetas".

Ahora en la carpeta inteligente que creó, aparecerán cartas de todas las cuentas de correo electrónico que agregó en Outlook. Puede habilitar la opción "Mostrar en favoritos" para que su nuevo correo esté siempre a la vista.

El cliente de correo electrónico de Mac proporciona una carpeta única para los correos electrónicos entrantes de todas las cuentas conectadas. Simplemente agregue sus cuentas y todas las cartas nuevas se recopilarán en un solo lugar.

En Thunderbird, recopilar todos sus correos electrónicos en una bandeja de entrada es fácil. Vaya al menú "Ver" (si no se muestra la barra de menús, presione Alt). Luego elija Carpetas → Fusionadas. Ahora tendrá una Bandeja de entrada para nuevos correos electrónicos, una carpeta Borradores, una carpeta Elementos enviados y un Archivo. No tiene que buscar mucho para saber dónde está. En este caso, los mensajes, como antes, se almacenarán en los servidores de sus proveedores de correo.

Clientes móviles

La Bandeja de entrada unificada está disponible en muchos clientes de correo electrónico móvil, incluido Gmail. La aplicación Gmail recopila su bandeja de entrada de todas las cuentas de correo electrónico, incluidos Yahoo, Outlook u otros servicios.

Si no le gusta la aplicación de Google, puede probar clientes de correo electrónico de terceros como Outlook o MyMail.

¿Quizás tenga sus propias ideas sobre cómo agrupar el correo en un solo lugar? Comparte en los comentarios.

Este artículo se centrará en lo que es "correo de otros buzones" y "recolección de cartas de otras cuentas". Revisiones de servicios de correo y comparaciones.

A medida que se actualice la funcionalidad de los servicios de correo, publicaremos noticias al final de este artículo.

El servicio de correo Mail.ru, Yandex y los motores de búsqueda de Google han estado ofreciendo funcionalidades muy útiles y necesarias durante varios años, lo que le permite combinar todas las demás cuentas de correo electrónico en un solo correo. En otras palabras, una vez que agregue y configure todos sus "correos", será posible administrarlos en una ventana sin ingresar constantemente su nombre de usuario y contraseña.

Los servicios de correo nos ofrecen un gran lugar para almacenar todas las cartas entrantes, una interfaz conveniente, buena funcionalidad de administración y mucho más. Para probar las capacidades de los servicios de correo electrónico enumerados, seleccionaremos tres parámetros para evaluar su desempeño: 1) es necesario administrar varias cuentas de correo electrónico, incluso desde varios servicios y sitios, a través de un cliente de correo electrónico; 2) tener una firma personal y un nombre para cada correo; 3) elimine las cartas de los servidores de esas cuentas de correo que se han agregado a mail, yandex o google mail.

Nuestra tarea se ve así:

Entonces empecemos. Somos los primeros en probar un servicio de Mail.ru que nos dice: "Puede recoger el correo de todos sus buzones en un buzón en Mail.ru.

Configure la colección de cartas de cualquier servidor que ejecute IMAP o POP3 ". Para agregar correo externo que no sea @mail, @inbox, @list, @bk, debe tener al menos un correo que ya exista en los servidores enumerados desde el correo. En otras palabras, primero registre un correo electrónico y luego agregue otras cuentas de correo. El proceso de registro para el correo es simple, no tiene sentido describirlo, pero describiremos la adición de otros correos electrónicos a esta cuenta de correo.

A continuación, se le pedirá que ingrese el nombre de usuario y la contraseña de cualquier buzón que utilice, y dentro de 3-5 minutos "Mail Collector from mail" creará una carpeta con el nombre del correo agregado al lado de las carpetas "bandeja de entrada", "enviado", "spam" y otras cosas.

De hecho, el recopilador de cartas funcionará dentro de 10-15 minutos y agregará todas las letras a la carpeta recién creada desde el cuadro que especificó. Todas las cartas entrantes para un nuevo correo electrónico llegarán a esta carpeta, también será posible enviar cartas desde un buzón adjunto. Al crear una nueva carta, aparecerá el campo De, en el que puede elegir desde qué buzón se enviará la carta.

Las ventajas del servicio de correo Mail.ru incluyen la facilidad de agregar y la facilidad de configurar otros buzones, la ausencia de la necesidad de especificar varios protocolos (POP3, SMTP). Esto es muy importante porque no todos los usuarios saben lo que es.

Las desventajas de Mail.ru son que es imposible asignar un nombre y una firma para cada correo recién agregado (a cualquier correo electrónico nuevo, excepto el principal), es decir, el nombre y la firma del correo principal se distribuirán a cada dirección. Otro gran inconveniente es que al descargar cartas al correo, no es posible eliminar automáticamente las cartas originales del servidor de buzón adjunto. ¿Por qué es tan importante eliminar mensajes del servidor del buzón agregado? Esto evitará completar el correo adjunto, ya que Las cuentas de correo electrónico externas, por regla general, son demasiado pequeñas para almacenar cartas. Por ejemplo, cuando se desborda el espacio de correo en una cuenta externa, Mail.ru no mostrará ninguna letra nueva hasta que ingrese a la interfaz de correo externo y elimine las letras directamente desde allí para liberar espacio. Además, vinculamos el correo a Mail con la esperanza de obtener mucho espacio de almacenamiento para nuestro correo, que puede estar limitado por los recursos de alojamiento. Por lo tanto, a pesar de que Mail.ru ofrece una cantidad casi ilimitada de buzones al agregar correo desde otra zona de dominio (por ejemplo, [correo electrónico protegido]), sus recursos de correo electrónico agregados no aumentarán en Mail.ru, pero continuarán estando limitados por los recursos de alojamiento (en nuestro caso, recursos de primer.ru).

La capacidad de agregar otro correo al servicio de correo no satisfizo nuestra tarea en dos puntos de tres, totalizando un punto.

Es cierto que Mail.ru tiene otra forma de agregar correo externo, o más precisamente, conectarse o ingresar correo externo. Se parece a esto:

Este método no es adecuado para nuestra tarea, porque Este no es un recopilador de correo, sino un modo de usuario que se conecta al correo y descarga todas las carpetas y cartas a la interfaz de correo cada vez. Pero aquí es posible agregar una firma personal y un nombre para cada correo, es posible enviar cartas desde el correo configurado. Eliminar correos electrónicos de buzones cargados no funciona porque Este no es un recolector de correo.

¡Importante! Algunos usuarios piensan erróneamente que si las cartas se muestran en el correo, se puede borrar el correo con el que se realizó la descarga. Prestemos atención una vez más que Mail.ru funciona como un visor de correo, y si borra el correo, se eliminará tanto en el buzón principal como en el correo.

El segundo tema, Yandex, con su selector de cartas. Las tareas son similares: recopilar correo, asignar una firma y un nombre para cada correo y eliminar todo el correo del buzón agregado.

El recopilador de correo de Yandex está configurado de acuerdo con un esquema similar, pero si el correo está conectado desde algún sitio, por ejemplo site.ru, entonces será necesario registrar configuraciones adicionales, ver captura de pantalla.

El servicio de correo funcionó para nosotros, Yandex también ofrece configurar manualmente todas las configuraciones del correo de terceros. No hay nada complicado: en el campo de inicio de sesión, ingrese el nombre completo del correo ( [correo electrónico protegido]), en el campo del servidor ingresamos solo el dominio (site.ru), es mejor dejar todas las demás configuraciones por defecto, o cambiar si sabe lo que está haciendo. Después de agregar correctamente el correo, aparecerá el siguiente mensaje:

A diferencia de Mail Collector, Yandex ofrece elegir si guardar las letras originales en el buzón agregado o no. En todo lo demás, el colector de cartas Yandex funciona de manera similar con Mail.ru, es posible seleccionar el buzón desde el que enviar la carta. Pero Yandex tiene el mismo problema con la firma de letras: no hay forma de establecer un nombre y firma individual para cada buzón agregado.

A juzgar por la navegación, existe la posibilidad de agregar una firma individual para cada buzón, pero en realidad no funciona. Seleccionamos el correo, prescribimos el nombre y la firma, hacemos clic en guardar. Todo, la firma se guarda y funciona, pero también se guarda para todos los demás buzones, es decir, al asignar un nombre y firma a un buzón, cambia automáticamente esta configuración en todos los correos combinados en Yandex. Incluso si selecciona cualquier otro cuadro, la firma ahora será la misma en todas partes.

Total Yandex logró con éxito recolectar y ordenar el correo, puede eliminar las letras originales del buzón agregado, ¡pero no puede funcionar con firmas! El recaudador de cartas de Yandex no pudo hacer frente a nuestra tarea y está ganando dos puntos de cada tres.

Me gustaría señalar que, "hurgando" en los tres servicios para la recolección de cartas, parece que el Correo "golpea" su funcionalidad a toda prisa. Aunque satisfará a la mayoría de los usuarios, pero honestamente, Mail hizo un recopilador de correo para mostrar, para ser notado en la carrera competitiva. Todo funciona bien y sin fallas, pero el recolector de Mail no hizo frente a nuestra tarea. Hay varios bloques de anuncios en la interfaz de correo, pero no interfieren con el trabajo con letras.

En cuanto a Yandex, que creó un selector de cartas hace mucho tiempo, parece que no están apoyando a esta industria, porque arreglar una funcionalidad tan simple (la capacidad de agregar varias firmas para buzones) no debería ser difícil para un motor de búsqueda tan poderoso. Sin embargo, Yandex tiene otra característica única que le permite vincular dominios a sus servidores dns y, en el futuro, crear y configurar el correo. Pero tales operaciones y configuraciones requieren conocimiento y tiempo. Y aunque no hay nada complicado allí, en cualquier caso, esto no es para la mayoría de los usuarios de Runet. Gran ventaja - No hay anuncios en la interfaz de correo Yandex! Menos - restricción en el colector de cartas para 10 buzones.

El finalista y ganador es un seleccionador de cartas de Google, que ha hecho frente a nuestra tarea con una explosión, a pesar de que incluso límite de 5 cajas

Probablemente, muchos de ustedes en su práctica se han enfrentado a la tarea de recolectar correo de varios buzones. ¿Por qué podría ser esto necesario? Probablemente porque es un mecanismo universal para el intercambio de datos entre sistemas. Una gran cantidad de bibliotecas para cualquier idioma que implemente SMTP, POP3, IMAP, soluciones listas para la implementación de la pila de mensajes (como llamé al buzón ...), etc.

No es sorprendente que muchas tareas de integración se implementen a través del correo. Aquí entra en juego cierto servicio que sabe cómo recoger, clasificar y llevar a cabo rápidamente las acciones necesarias.

Para quién es suficiente el siguiente código, es posible que no lean más:

Foreach (var buzón en buzones) usando (var client \u003d new Pop3Client ()) (client.Connect (Hostname, Port, false); client.Authenticate (User, Password); var count \u003d client.GetMessageCount (); for (var i \u003d 0; i< count; i++) { Mail = client.GetMessage(i + 1); var cat = SortMail(Mail); DoSomething(Mail, cat); } }

Qué hacemos

Inmediatamente haga una serie de suposiciones:
1) Necesita recolectar correo para varios sistemas. Quizás en el futuro por unos pocos más. Y más ... En general, la solución debe ser universal;
2) Probablemente habrá una gran cantidad de correo: se deduce del párrafo 1 (de lo contrario, no escribiría esta publicación);
3) El correo tendrá que analizar;
4) Todas las cajas de servicio: los usuarios no van allí.

Lo que usaremos

El sistema debería funcionar las 24 horas del día, los 7 días de la semana, por lo que lo implementamos en forma de servicio de Windows. Para estos fines, sugiero usar inmediatamente TopShelf.

Por supuesto, todo debe ser paralelo. Aquí es donde entra en escena mi biblioteca TPL DataFlow favorita.

Recogeremos el correo a través de POP3. Todas las "cosas de moda" de IMAP en esta tarea son superfluas: debe recoger la fuente del mensaje de la manera más rápida y fácil posible y eliminarlo en el servidor. POP3 es suficiente para los ojos. Usamos OpenPop.NET.

Como opción, fije el monitoreo en Zabbix. (Vamos a trabajar las 24 horas del día, los 7 días de la semana y daremos a conocer la velocidad esperada; debe seguir esto)

Vamos

Creamos la aplicación de consola habitual. Abra la consola NuGet e instale todos los paquetes necesarios:

Install-Package Nlog Install-Package OpenPop.NET Install-Package TopShelf Install-Package Microsoft.TPL.DataFlow
Vaya a la carpeta del proyecto, cree App.Debug.config y App.Release.config. Descargue el proyecto del estudio, abra su código (en adelante TopCrawler.csproj). Agregue a la sección con la configuración:

Configuraciones

App.config App.config


Y a continuación se muestra un objetivo personalizado para MSBuild:

Transformar objetivo

$ (TargetFileName) .config


Personalmente, me acostumbré de esta manera, a la antigua, para agregar la transformación de configuraciones para separar los entornos.
Para mayor comodidad, ofrezco configuraciones de tipo fuerte. Una clase separada leerá la configuración. (Puede hablar sobre los aspectos teóricos de tal solución en los comentarios). Las configuraciones, los registros, el monitoreo son una excelente razón para implementar el patrón Singleton.

Cree una carpeta con el mismo nombre en el proyecto (debe haber un pedido). En el interior creamos 3 clases: Config, Logger, Zabbix. Nuestro registrador:

Registrador

estática clase Logger (public static NLog.Logger Log (get; private set;) public static NLog.Logger Archive (get; private set;) static Logger () (Log \u003d LogManager.GetLogger ("Global"); Archive \u003d LogManager. GetLogger ("Archivador");))


Monitorear con Zabbix merece una publicación separada, así que simplemente dejaré la clase implementando el agente aquí:

Zabbix

espacio de nombres TopCrawler.Singleton (///

/// Singleton: clase de remitente zabbix /// static class Zabbix (Public static ZabbixSender Sender (get; private set;) static Zabbix () (Sender \u003d new ZabbixSender (Config.ZabbixServer, Config.ZabbixPort);)) struct ZabbixItem (public string Host; public string Key; public string Value ;) clase ZabbixSender (estructura interna SendItem (// ReSharper deshabilita InconsistentNaming - Zabbix es un host de cadena pública sensible a mayúsculas y minúsculas; clave de cadena pública; valor de cadena pública; reloj de cadena pública; // ReSharper restore InconsistentNaming) #pragma advertencia deshabilita 0649 estructura interna ZabbixResponse ( public string Response; public string Info;) #pragma warning restore 0649 #region --- Constants --- public const string DefaultHeader \u003d "ZBXD \\ x01"; public const string SendRequest \u003d "data sender"; public const int DefaultTimeout \u003d 10000 ; #endregion #region --- Campos --- private readonly DateTime _dtUnixMinTime \u003d DateTime.SpecifyKind (new DateTime (1970, 1, 1), DateTimeKind.Utc); private readonly int _timeout; cadena privada de solo lectura _zabbixserver; readonly privado int _zabbixport; #endregion #region --- Constructores --- public ZabbixSender (string zabbixserver, int zabbixport): this (zabbixserver, zabbixport, DefaultTimeout) () public ZabbixSender (string zabbixserver, int zabbixport, int timeout) (_zabbixserver \u003d zabbixport; _timeout \u003d timeout;) #endregion #region --- Métodos --- cadena pública SendData (ZabbixItem itm) (return SendData (nueva Lista (1) (itm)); ) cadena pública SendData (Lista lstData) (try (var serializer \u003d new JavaScriptSerializer (); var values \u200b\u200b\u003d new List (lstData.Count); values.AddRange (lstData.Select (itm \u003d\u003e new SendItem (host \u003d itm.Host, key \u003d itm.Key, value \u003d itm.Value, clock \u003d Math.Floor ((DateTime.Now.ToUniversalTime () - _dtUnixMinTime). TotalSeconds) .ToString (CultureInfo.InvariantCulture)))); var json \u003d serializer.Serialize (new (request \u003d SendRequest, data \u003d values.ToArray ())); encabezado var \u003d Encoding.ASCII.GetBytes (DefaultHeader); var length \u003d BitConverter.GetBytes ((long) json.Length); datos var \u003d codificación.ASCII.GetBytes (json); paquete var \u003d nuevo byte; Buffer.BlockCopy (encabezado, 0, paquete, 0, encabezado.Longitud); Buffer.BlockCopy (longitud, 0, paquete, encabezado, longitud, longitud, longitud); Buffer.BlockCopy (datos, 0, paquete, encabezado. Longitud + longitud. Longitud, datos. Longitud); utilizando (var socket \u003d new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) (socket.Connect (_zabbixserver, _zabbixport); socket.Send (paquete); // Header var buffer buffer \u003d nuevo byte; ReceivData (socket , buffer, 0, buffer.Length, _timeout); if (DefaultHeader! \u003d Encoding.ASCII.GetString (buffer, 0, buffer.Length)) arroja una nueva excepción ("encabezado no válido"); // longitud del mensaje buffer \u003d nuevo byte ; ReceivData (socket, buffer, 0, buffer.Length, _timeout); var dataLength \u003d BitConverter.ToInt32 (buffer, 0); if (dataLength \u003d\u003d 0) arroja una nueva excepción ("Longitud de datos no válida"); // Mensaje buffer \u003d nuevo byte; ReceivData (socket, buffer, 0, buffer.Length, _timeout); var response \u003d serializer.Deserialize (Codificación.ASCII.GetString (buffer, 0, buffer.Length)); return string.Format ("Respuesta: (0), Información: (1)", respuesta.Respuesta, respuesta.Información); )) 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 \u003d Environment.TickCount; var recibido \u003d 0; do (if (Environment.TickCount\u003e startTickCount + timeout) lanzar un nuevo TimeoutException (); try (recibido + \u003d pObjSocket.Receive (buffer, offset + recibido, tamaño - recibido, SocketFlags.None) ;) catch (SocketException ex) (if (ex.SocketErrorCode \u003d\u003d SocketError.WouldBlock || ex.SocketErrorCode \u003d\u003d SocketError.IOPending || ex.SocketErrorCode \u003d\u003d SocketError.NoBufferSpaceAvailable) Thread.Sleep (30); else throw;) ) while (recibido< size); } #endregion } }


Configs ... Es hora de hacer al menos algo interesante. En primer lugar, en las configuraciones almacenaremos los cuadros que estamos sondeando. En segundo lugar, la configuración de DataFlow. Sugiero esto:

Configuraciones



Entonces, el host y el puerto donde se conecta, el usuario y la contraseña, todo está claro aquí. El siguiente es el tipo de caja. Digamos que el servicio es utilizado por marketing (así como otros departamentos). Tienen buzones de correo donde se eliminan las respuestas automáticas a los correos, así como los informes de spam de FBL. El cuadro en sí ya clasifica la letra, por lo que para tales situaciones establecemos inmediatamente el tipo de cuadro. Con la configuración de DataFlow, quedará más claro cuando comencemos a crear objetos. Aquí tendremos nuestras propias secciones en la configuración. Muchos manuales de cómo hacer esto, así que solo muestra el resultado:

Definir tipos

#region --- Tipos --- clase estática MailboxType (cadena const pública Bo \u003d "bo"; cadena const pública Crm \u003d "crm"; cadena const pública Fbl \u003d "fbl"; cadena const pública Bounce \u003d "bounce";) clase MailboxInfo (cadena pública Tipo (get; set;) cadena pública Nombre de host (get; set;) cadena pública Usuario (get; set;) cadena pública Contraseña (get; set;) public int Puerto (get; set;)) clase DataBlockOptions (public int Maxdop (get; set;) public int BoundedCapacity (get; set;) public DataBlockOptions () (Maxdop \u003d 1; BoundedCapacity \u003d 1;)) #endregion


Crear secciones

///

/// Sección de configuración personalizada /// public class CustomSettingsConfigSection: ConfigurationSection (public CredentialsCollection CredentialItems (get (return base ["CredentialsList"] como CredentialsCollection;)) public DataBlockOptionsCollection DataFlowOptionsItems (get (return base ["DataFlowOptionsList"]) como DataBlockOptions


///

/// Colección personalizada - lista de credenciales /// clase pública CredentialsCollection: ConfigurationElementCollection, IEnumerable (anulación protegida ConfigurationElement CreateNewElement () (return new CredentialsElement ();) objeto anulado protegido GetElementKey (elemento ConfigurationElement) (return ((CredentialsElement) elemento) .Username;) public CredentialsElement this (get (return BaseGet (index) as CredentialsElement;) ) público nuevo IEnumerator < Count; i++) { yield return BaseGet(i) as CredentialsElement; } } } /// /// Elemento de credenciales personalizadas /// public class CredentialsElement: ConfigurationElement (cadena pública Hostname (get (return base ["hostname"] como string;)) public string Username (get (return base ["username"] como string;)) public string Password (get (return base ["contraseña"] como cadena;)) cadena pública Tipo (get (return base ["type"] como cadena;)) cadena pública Puerto (get (return base ["puerto"] como cadena;))) /// /// Colección personalizada - Lista de opciones de DataBlock /// clase pública DataBlockOptionsCollection: ConfigurationElementCollection, IEnumerable (anulación protegida ConfigurationElement CreateNewElement () (return new DataBlockOptionsElement ();) objeto anulado protegido GetElementKey (elemento ConfigurationElement) (return ((DataBlockOptionsElement) elemento) .Name;) public CredentialsElement this (get (return BaseGet (index) as CredentialsElement;) ) público nuevo IEnumerator GetEnumerator () (para (var i \u003d 0; i< Count; i++) { yield return BaseGet(i) as DataBlockOptionsElement; } } } /// /// Elemento de opciones de DataBlock personalizado /// clase pública DataBlockOptionsElement: ConfigurationElement (cadena pública Nombre (get (base de retorno ["nombre"] como cadena;)) cadena pública Maxdop (get (base de retorno ["maxdop"] como cadena;)) cadena pública BoundedCapacity (get (base de retorno ["capacidad limitada"] como cadena;)))


No escribiré la implementación completa de la configuración, se entiende que durante el proceso de desarrollo se agregarán allí los parámetros que necesitamos.

Leemos nuestra configuración personalizada de esta manera:

Leer

lista publica CredentialsList (get; private set;) public Dictionary DataFlowOptionsList (get; private set;) ... static Config () (try (var customConfig \u003d (CustomSettingsConfigSection) ConfigurationManager.GetSection ("CustomSettings"); // Obtener buzones foreach (elemento var en customConfig.CredentialItems) CredentialsList.Add ( nuevo MailboxInfo (Hostname \u003d item.Hostname, Port \u003d Convert.ToInt32 (item.Port), User \u003d item.Username, Type \u003d item.Type, Password \u003d item.Password)); // Obtenga la configuración de DataFlow foreach (var item en customConfig.DataFlowOptionsItems) DataFlowOptionsList.Add (item.Name, new DataBlockOptions (Maxdop \u003d Convert.ToInt32 (item.Maxdop), BoundedCapacity \u003d Convert.ToInt32 (item.BoundedCapacity))));) catch (Exception ex) (LoggerLog. Fatal ("Error al leer la configuración: (0)", por ejemplo, mensaje); throw;))


Resulta de alguna manera muy apretado, pero ni siquiera hemos llegado a la parte más interesante.

¡Omitiremos el enlace TopShelf, los contadores de rendimiento, la comunicación con la base de datos y nos pondremos manos a la obra! Crea la clase Crawler: el núcleo. Primero, lee el correo:

Bool volátil privado _stopPipeline; ... public void Start () (do (var getMailsTasks \u003d _config.CredentialsList.Select (credentials \u003d\u003e Task.Run (() \u003d\u003e GetMails (credentials))). ToList (); foreach (tarea var en getMailsTasks) tarea .Wait (); Thread.Sleep (2000);) while (! _StopPipeline); // Detener canalización - esperar la finalización de todos los puntos finales // Esto detendrá la canalización DataFlow si (_stopPipeline) Logger.Log.Warn ("Pipeline has sido detenido por el usuario ");)
Aquí la holgazanería pasó factura y decidí no molestarme: si tiene alrededor de 20-30 cajas, puede ejecutar una tarea debajo de cada una y no preocuparse por la cantidad de hilos. (Permiso para espolvorear con tomates).

Procedemos a la lectura misma:

GetMails privado vacío (información de MailboxInfo) (intente (usando (var client \u003d new Pop3Client ()) (
Calcule inmediatamente los tiempos de acceso para la caja, útil para diagnosticar la carga de la red y el servidor.

// Obtener métricas de Zabbix var stopwatch \u003d new Stopwatch (); cronómetro.Start (); // Obtener cuenta de correo client.Connect (info.Hostname, info.Port, false); cliente.Authenticate (info.User, info.Password); cronómetro.Stop ();
Enviamos datos a Zabbix. Es simple: especificamos el nombre de host (como está en Zabbix), la clave (de nuevo estrictamente, como en Zabbix) y un valor de cadena.

// Enviarlo a Zabbix Zabbix.Sender.SendData (nuevo ZabbixItem (Host \u003d Config.HostKey, Key \u003d info.Type + Config.TimingKey, Value \u003d stopwatch.ElapsedMilliseconds.ToString ())); Logger.Log.Debug ("Enviar tiempo [(0)] a Zabbix: conectado a" (1) "como" (2) ", tiempo (3) ms", info.Type, info.Hostname, info.User, cronómetro. Milisegundos transcurridos); recuento var \u003d client.GetMessageCount (); if (cuenta \u003d\u003d 0) retorno; Logger.Log.Debug ("Tenemos" mensajes nuevos (0) en "(1)" ", count, info.User); // Enviar mensajes al bloque de clasificación para (var i \u003d 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);
La canalización de DataFlow se creará cuando se cree la clase Crawler. Creemos que nuestro primer paso es ordenar la carta.

Mientras que (! _SortMailDataBlock.Post (mailInfo)) Thread.Sleep (500);
Ya ves lo simple que es: el transportador en sí es uno. Todas las tareas que leen el correo envían mensajes allí uno a la vez. Si el bloque está ocupado, Post devolverá falso y solo esperamos hasta que se libere. La corriente continúa funcionando en este momento. Esto es lo que yo llamo concurrencia sin preocupaciones.

El mensaje fue al transportador, ahora se puede almacenar de forma segura en el archivo RAW (sí, sí, todo lo que leemos se guarda en un archivo. El equipo de soporte nos lo agradecerá más adelante).

Configure, por ejemplo, la rotación del archivo:

Nlog.config



Entonces puedes configurar logStash en él, pero esa es otra historia ...

// Guardar cada correo en el archivo Logger.Log.Debug ("Mensaje de archivo"); Logger.Archive.Info (Functions.MessageToString (mailInfo.Mail)); ) catch (Exception ex) (Logger.Log.Error ("Error de análisis de correo electrónico: (0)", ex.Message); Functions.ErrorsCounters.Increment (); // Archivar correo de todos modos Logger.Log.Debug ("Mensaje de archivo "); Logger.Archive.Info (Encoding.Default.GetString (client.GetMessageAsBytes (i + 1)));) if (_config.DeleteMail) client.DeleteMessage (i + 1); if (_stopPipeline) se rompe; ) Logger.Log.Debug ("Hecho con" (0) "", info.User); )) catch (Exception ex) (Logger.Log.Error ("Error general - tipo: (0), mensaje: (1)", ex, ex.Message); Funciones.ErrorsCounters.Increment ();))
Aquí utilizamos contadores de errores estáticos (en el contexto de los tipos de recuadro), en los que ErroresCounters es:

Diccionario público estático ErrorCounters \u003d nuevo diccionario ();
Y los contadores se pueden hacer así:

Counter.cs

contador de clase (contador privado _ largo; contador público () (_ contador \u003d 0;) público nulo Incremento () (Interbloqueado. Incremento (ref _contador);) público largo Leer () (retorno _ contador;) público largo Actualizar () (retorno interbloqueado .Exchange (ref _counter, 0);) public void Add (valor largo) (Interlocked.Add (ref _counter, value);) public void Set (valor largo) (Interlocked.Exchange (ref _counter, value);))


Pasemos a crear una tubería. Digamos que tenemos cajas donde se vierten los contestadores automáticos. Dichas cartas deben analizarse (qué tipo de respuesta automática, de quién, por qué correo, etc.) y poner el resultado en el repositorio (DB). Supongamos que hay cuadros donde caen los informes FBL. Inmediatamente agregamos tales letras a la base de datos. Consideramos que todas las demás letras son "útiles": deben verificarse para detectar spam y enviarse a un sistema externo, por ejemplo, CRM.

Como ya entendió, este ejemplo considera principalmente el uso del recopilador para tareas de marketing: recopilación de estadísticas sobre la entrega de correo, información sobre correo no deseado.

Entonces, decidimos el flujo de trabajo. Declaramos los bloques necesarios en la clase Crawler:

Clase MessageInfo (public bool IsSpam (get; set;) public Message Mail (get; set;) public string Subtipo (get; set;) public string Recipient (get; set;) public MessageType Type (get; set;) public MailboxInfo Mailbox (get; set;)) class Crawler (// Pipeline private TransformBlock _sortMailDataBlock; TransformBlock privado _spamFilterDataBlock; TransformBlock privado _checkBounceDataBlock; TransformBlock privado _identifyDataBlock; bloque de acción privado _addToCrmDataBlock; bloque de acción privado _addToFblDataBlock; bloque de acción privado _addToBounceDataBlock; ...
Creamos un método de inicialización y creamos bloques de canalización (utilizamos nuestras maravillosas secciones de configuraciones para inicializar los bloques):

Public void Init () (// *** Crear canalización *** // Crear TransformBlock para obtener el tipo de mensaje var blockOptions \u003d _config.GetDataBlockOptions ("_ sortMailDataBlock"); _sortMailDataBlock \u003d new TransformBlock (mail \u003d\u003e SortMail (mail), new ExecutionDataflowBlockOptions (MaxDegreeOfParallelism \u003d blockOptions.Maxdop, BoundedCapacity \u003d blockOptions.BoundedCapacity)); // Crear TransformBlock para filtrar spam blockOptions \u003d _config.GetDataBlockOptions ("_ spamFilterDataBlock"); _spamFilterDataBlock \u003d nuevo TransformBlock (mail \u003d\u003e FilterSpam (mail), nuevo ExecutionDataflowBlockOptions (MaxDegreeOfParallelism \u003d blockOptions.Maxdop, BoundedCapacity \u003d blockOptions.BoundedCapacity)); // Crear TransformBlock para ordenar rebotes blockOptions \u003d _config.GetDataBlockOptions ("_ checkBounceDataBlock"); _checkBounceDataBlock \u003d nuevo TransformBlock (mail \u003d\u003e BounceTypeCheck (mail), nuevo ExecutionDataflowBlockOptions (MaxDegreeOfParallelism \u003d blockOptions.Maxdop, BoundedCapacity \u003d blockOptions.BoundedCapacity)); // Crear TransformBlock para identificar el propietario del rebote blockOptions \u003d _config.GetDataBlockOptions ("_identDataBlock"); _identifyDataBlock \u003d nuevo TransformBlock (mail \u003d\u003e GetRecipient (mail), new ExecutionDataflowBlockOptions (MaxDegreeOfParallelism \u003d blockOptions.Maxdop, BoundedCapacity \u003d blockOptions.BoundedCapacity)); // Crear ActionBlock para enviar correo a CRM blockOptions \u003d _config.GetDataBlockOptions ("_ addToCrmDataBlock"); _addToCrmDataBlock \u003d nuevo ActionBlock (mail \u003d\u003e AddToCrm (mail), nuevo ExecutionDataflowBlockOptions (MaxDegreeOfParallelism \u003d blockOptions.Maxdop, BoundedCapacity \u003d blockOptions.BoundedCapacity)); // Crear ActionBlock para enviar FBL a MailWH blockOptions \u003d _config.GetDataBlockOptions ("_ addToFblDataBlock"); _addToFblDataBlock \u003d nuevo ActionBlock (mail \u003d\u003e AddToFbl (mail), nuevo ExecutionDataflowBlockOptions (MaxDegreeOfParallelism \u003d blockOptions.Maxdop, BoundedCapacity \u003d blockOptions.BoundedCapacity)); // Crear ActionBlock para enviar Bounce a MailWH blockOptions \u003d _config.GetDataBlockOptions ("_ addToBounceDataBlock"); _addToBounceDataBlock \u003d nuevo ActionBlock (mail \u003d\u003e AddToBounce (mail), nuevo ExecutionDataflowBlockOptions (MaxDegreeOfParallelism \u003d blockOptions.Maxdop, BoundedCapacity \u003d blockOptions.BoundedCapacity));
Montamos el transportador de acuerdo con nuestro esquema:

// *** Crear canalización *** _sortMailDataBlock.LinkTo (_spamFilterDataBlock, info \u003d\u003e info.Type \u003d\u003d MessageType.GENERAL); _sortMailDataBlock.LinkTo (_addToFblDataBlock, info \u003d\u003e info.Type \u003d\u003d MessageType.FBL); _sortMailDataBlock.LinkTo (_checkBounceDataBlock, info \u003d\u003e info.Type \u003d\u003d MessageType.BOUNCE); _sortMailDataBlock.LinkTo (DataflowBlock.NullTarget (), info \u003d\u003e info.Type \u003d\u003d MessageType.UNKNOWN); / * STUB * / _checkBounceDataBlock.LinkTo (_identifyDataBlock); _identifyDataBlock.LinkTo (_addToBounceDataBlock); _spamFilterDataBlock.LinkTo (_addToCrmDataBlock, info \u003d\u003e! info.IsSpam); _spamFilterDataBlock.LinkTo (DataflowBlock.NullTarget (), info \u003d\u003e info.IsSpam); / * STUB * /
Como puede ver, todo es extremadamente simple: asociamos el bloque con lo siguiente (con la posibilidad de establecer la condición de comunicación). Todos los bloques se ejecutan en paralelo. Cada bloque tiene un grado de paralelismo y capacidad (utilizando la capacidad, puede ajustar la cola frente al bloque, es decir, el bloque ha recibido un mensaje, pero aún no lo procesa). Por lo tanto, puede establecer un alto grado de paralelismo para operaciones "complejas" y largas, como analizar el contenido de una carta.

No describiré el material de DataFlow, es mejor leer todo en la fuente de TPL DataFlow.

SortMailDataBlock.Completion.ContinueWith (t \u003d\u003e (if (t.IsFaulted) ((IDataflowBlock) _spamFilterDataBlock) .Fault (t.Exception); else _spamFilterDataBlock.Complete ();)); _sortMailDataBlock.Completion.ContinueWith (t \u003d\u003e (if (t.IsFaulted) ((IDataflowBlock) _addToFblDataBlock) .Fault (t.Exception); else _addToFblDataBlock.Complete ();)); _sortMailDataBlock.Completion.ContinueWith (t \u003d\u003e (if (t.IsFaulted) ((IDataflowBlock) _checkBounceDataBlock) .Fault (t.Exception); else _checkBounceDataBlock.Complete ();)); _spamFilterDataBlock.Completion.ContinueWith (t \u003d\u003e (if (t.IsFaulted) ((IDataflowBlock) _addToCrmDataBlock) .Fault (t.Exception); else _addToCrmDataBlock.Complete ();)); _checkBounceDataBlock.Completion.ContinueWith (t \u003d\u003e (if (t.IsFaulted) ((IDataflowBlock) _identifyDataBlock) .Fault (t.Exception); else _identifyDataBlock.Complete ();)); _identifyDataBlock.Completion.ContinueWith (t \u003d\u003e (if (t.IsFaulted) ((IDataflowBlock) _addToBounceDataBlock) .Fault (t.Exception); else _addToBounceDataBlock.Complete ();)); )
Todo, de hecho, la canalización ya está funcionando, puede publicar mensajes en él. Solo queda detenerlo completando nuestro método de Inicio:

comienzo

public void Start () (do (var getMailsTasks \u003d _config.CredentialsList.Select (credentials \u003d\u003e Task.Run (() \u003d\u003e GetMails (credentials))). ToList (); foreach (tarea var en getMailsTasks) task.Wait ( ); Thread.Sleep (2000);) while (! _StopPipeline); // Detener canalización: esperar la finalización de todos los puntos finales _sortMailDataBlock.Complete (); _addToCrmDataBlock.Completion.Wait (); _addToFblDataBlock.Completion.WaitBo) .Completion.Wait (); if (_stopPipeline) Logger.Log.Warn ("El usuario ha detenido la canalización");)


Pasamos a los delegados.
Ordenando ... Bueno, digamos que todo es simple con nosotros (siempre tenemos tiempo para complicarlo):

Private MessageInfo SortMail (MessageInfo mail) (switch (mail.Mailbox.Type) (case MailboxType.Crm: mail.Type \u003d MessageType.GENERAL; break; case MailboxType.Bounce: mail.Type \u003d MessageType.BOUNCE; break; case MailboxType. Fbl: mail.Type \u003d MessageType.FBL; break;) devolver correo;)
Filtro de spam. Esto es para la tarea: use SpamAssassin.
Aquí hay un delegado para ti:

Private MessageInfo FilterSpam (correo de MessageInfo) (// TODO: Agregar correo de devolución de lógica de SpamAssassin;)
Y clases para trabajar con la API SpamAssassin (enlace al proyecto).
Y pasamos a analizar letras. Parsim te contestamos. Aquí es donde entra MEF.
Cree un proyecto (dll) con interfaces para nuestros complementos (Llamemos Interfaces).
Agregar interfaz:

Interfaz pública ICondition (string Check (Mensaje mimeMessage);) interfaz pública IConditionMetadata (Tipo Tipo (get;))
Y eso es. Nuestro TopCrawler depende de este proyecto y el proyecto con complementos también lo usará.
Cree un nuevo proyecto (también dll), llame a Condiciones.
Agregar tipos de respuesta automática:

#region --- Tipos --- clase estática BounceType (public const string Full \u003d "BounceTypeFull"; public const string Timeout \u003d "BounceTypeTimeout"; public const string Refused \u003d "BounceTypeRefused"; public const string NotFound \u003d "BounceTypeNotFound"; public const string Inactive \u003d "BounceTypeInactive"; public const string OutOfOffice \u003d "BounceTypeOutOfOffice"; public const string HostNotFound \u003d "BounceTypeHostNotFound"; public const string NotAuthorized \u003d "BounceTypeNotAuthorized"; public constent StringC)
Y las clases que implementan nuestra interfaz:

Clase pública ConditionNotFound1: ICondition (comprobación de cadena pública (mensaje mimeMessage) (if (! MimeMessage.MessagePart.IsMultiPart) devuelve nulo; patrón de cadena constante \u003d "Código de diagnóstico :. + Smtp. + 550"; var regexp \u003d new Regex (patrón , RegexOptions.IgnoreCase); return mimeMessage.MessagePart.MessageParts.Any (part \u003d\u003e part.ContentType.MediaType \u003d\u003d "message / delivery-status" && regexp.IsMatch (part.GetBodyAsText ()))? BounceType.NotFound.Not ;)) ... public class ConditionTimeout2: ICondition (return BounceType.Timeout;) ...
Como notó, todo el punto está en los atributos. Al usarlos, se cargarán complementos.
Regrese a nuestro proyecto y cargue complementos:

Class Crawler (... // Complementos públicos IEnumerable \u003e BounceTypeConditions (get; set;) private void LoadPlugins () (try (var container \u003d new CompositionContainer (new DirectoryCatalog (_config.PluginDirectory), true); container.ComposeParts (this);) catch (Exception ex) (Logger.Log .Error ("No se pueden cargar complementos: (0)", por ejemplo, Mensaje);)) ...
Tiramos LoadPlugins en el constructor de nuestra clase. No explicaré en detalle el mecanismo de carga: a Google le irá mejor.

Pasamos a nuestro delegado de cheques como Bounce. Las condiciones se aplicarán sucesivamente hasta que la primera funcione, el método exclusivo:

Private MessageInfo BounceTypeCheck (MessageInfo mailInfo) (try (foreach (var condition in BounceTypeConditions) (var res \u003d condition.Value.Check (mailInfo.Mail); if (res \u003d\u003d null) continue; mailInfo.Subtype \u003d res; Logger.Log .Debug ("Condición de tipo de rebote [(0)] activada para el mensaje [(1)]", condition.Metadata.Type, mailInfo.Mail.Headers.MessageId); break;)) catch (Exception ex) (Logger.Log .Error ("Error al determinar el tipo de rebote para el mensaje" (0) ": (1)", mailInfo.Mail.Headers.MessageId, ex.Message); Logger.ErrorsCounters.Increment ();) return mailInfo;)
Por lo tanto, si aparece un nuevo logicab, es suficiente agregar una nueva clase al proyecto con complementos que implementen nuestra interfaz y ¡listo! No aplicaré un ejemplo del segundo complemento por definición del remitente de la carta, por lo que ya es una publicación larga (el servidor mismo generó la Respuesta automática, por lo que el remitente también debe resolverse desde los encabezados del mensaje).

Con el registro de los resultados en la base de datos tampoco es nada inusual. Por ejemplo, así:

AddToBounce privado vacío (Mail de MessageInfo) (intente (MailWH.BounceAdd (mail); Functions.ProcessedCounters.Increment (); Functions.Log.Debug ("Enviar rebote a MailWH");) catch (Exception ex) (Functions.Log. Error ("Error al guardar el mensaje de rebote" (0) "a MailWH: (1)", mail.Mail.Headers.MessageId, ex.Message); Functions.ErrorsCounters.Increment ();))

Bounceadd

public static long BounceAdd (mensaje MessageInfo) (usando (var conn \u003d new SqlConnection (ConnectionString)) usando (var cmd \u003d new SqlDataAdapter ("BounceAdd", conn)) (var body \u003d message.Mail.FindFirstPlainTextVersion () \u003d\u003d null? message.Mail.FindFirstHtmlVersion (). GetBodyAsText (): message.Mail.FindFirstPlainTextVersion (). GetBodyAsText (); var outId \u003d new SqlParameter ("@ ID", SqlDbType.BigInt) (Direction \u003d ParameterDut.utut.utut.utut.ut.ututut.ut.mut.ututut.ut.mut. .CommandType \u003d CommandType.StoredProcedure; cmd.SelectCommand.Parameters.Add (new SqlParameter ("@ RawMessage", message.Mail.RawMessage)); cmd.SelectCommand.Parameters.Add (new SqlParameter ("@ Message", body)) ; cmd.SelectCommand.Parameters.Add (nuevo SqlParameter ("@ Subject", message.Mail.Headers.Subject ?? "")); cmd.SelectCommand.Parameters.Add (new SqlParameter ("@ MessageID", message.Mail .Headers.MessageId ?? "")); cmd.SelectCommand.Parameters.Add (nuevo SqlParameter ("@ AddressTo", message.Mail.Headers.To.Address ?? "")); cmd.SelectComm and.Parameters.Add (nuevo SqlParameter ("@ AddressFrom", message.Mail.Headers.From.Address ?? "")); cmd.SelectCommand.Parameters.Add (nuevo SqlParameter ("@ DateRecieved", DateTime.Now)); cmd.SelectCommand.Parameters.Add (nuevo SqlParameter ("@ BounceTypeSysName", (objeto) message.Subtype ?? DBNull.Value)); cmd.SelectCommand.Parameters.Add (nuevo SqlParameter ("@ SourceFrom", (object) message.Recipient ?? DBNull.Value)); // TODO: Agregar ListId soporte cmd.SelectCommand.Parameters.Add (new SqlParameter ("@ ListId", DBNull.Value)); cmd.SelectCommand.Parameters.Add (outId); conn.Open (); cmd.SelectCommand.ExecuteNonQuery (); return outId.Value tanto tiempo? ?? 0; )))


Lo sentimos por no tener tiempo para mostrar TopShelf: la publicación ya está demasiado hinchada.

conclusiones

En este tutorial, aprendimos que recopilar correo podría no ser tan fácil. El núcleo desarrollado le permite agregar rápidamente nuevos pasos de proceso: bloques DataFlow, sin afectar la lógica existente. El subsistema de complementos le permite construir rápidamente una lógica de análisis similar a un script, y DataFlow en sí paraleliza todos los cálculos (y podemos configurar de manera flexible el subprocesamiento múltiple para una máquina específica). TopShelf nos brinda la capacidad de ejecutar el servicio tanto en modo de servicio como en modo de consola para facilitar la depuración.

En mi opinión, Gmail tiene una de las interfaces web más convenientes para trabajar con el correo electrónico. Además de una interfaz agradable y conveniente, los creadores no se olvidaron de la parte funcional. Conversaciones, creación de varias carpetas, filtros, etc. Todo esto ha convertido a Gmail en uno de los servicios de correo electrónico más populares del mundo. Muchos desconocen una característica tan excelente como un recopilador de correo. Por ejemplo, tiene uno o más buzones en su nombre de dominio, pero la interfaz de correo web estándar y los clientes de correo no le convienen ( Mozilla Thunderbird, Microsoft Outlook, The Bat) En este caso, puede usar el recopilador de correo y procesar todo el correo a través de Gmail, ahora consideraremos cómo hacerlo.

  1. Necesita una cuenta de Gmail, el proceso de registro es bastante simple y creo que no es difícil resolverlo.
  2. Después de registrarse, en Gmail debe ir a la configuración
  3. En la configuración, seleccione el elemento "Cuentas e importación"

  4. En esta sección, nos interesan dos puntos: "Enviar cartas como:" y "Verificar el correo de otras cuentas (usando POP3):". Tienen los enlaces "Agregar su otra dirección de correo electrónico" y "Agregar su cuenta de correo electrónico POP3".

  5. Para recoger el correo de otro buzón, haga clic en "Agregar su cuenta de correo electrónico POP3". Aparece una nueva ventana en la que debe ingresar la dirección del buzón y hacer clic en "Siguiente". Después de eso, aparecen varios campos que deben completarse:
    Nombre de usuario
    Contraseña
    Servidor POP y puerto - Dirección del servidor POP y puerto para conectarse al servidor del que se recopilará el correo. Puede encontrar esta información en apoyo de su servicio de correo, generalmente se publica en la sección "Preguntas y respuestas".
    Guardar copias de los mensajes recibidos en el servidor - si la casilla de verificación no está instalada, después de descargar las letras, estas letras se eliminarán del buzón. .
    Utilice siempre una conexión segura (SSL) cuando reciba correos electrónicos - debe establecerse si su servicio de correo utiliza una conexión SSL segura para el trabajo.
    Bandeja de entrada de etiquetas - una etiqueta, esta es una marca visual cerca de la letra. Es conveniente utilizar para comprender a qué buzón se envió la carta.
    Bandeja de entrada de archivo (omitir bandeja de entrada) - las cartas recopiladas de este buzón se archivarán, no se incluirán en los mensajes entrantes.

  6. Haga clic en "Agregar cuenta", después de lo cual, Gmail envía una carta de verificación a su buzón especificado. En la carta de elección habrá dos opciones de verificación, un enlace y un código. El enlace que solo necesita ir y pegue el código en el campo de confirmación. Es más fácil seguir el enlace, el código aparentemente se envía por si acaso, de repente el enlace se mostrará incorrectamente en la carta.
  7. Bueno, eso es todo, ahora nuestra cuenta de Gmail recoge automáticamente cartas de otro buzón. Si necesita responder desde esta u otra dirección utilizando el mismo Gmail, en la configuración, haga clic en el enlace "Agregar otra dirección de correo electrónico" Complete los campos:
    "Nombre:" - Puede ingresar cualquier dato, por ejemplo, su nombre.
    "Dirección de correo electrónico:" - indique la dirección postal en nombre de la cual responderemos.
    Marca de verificación "Usar como un alias ".- esta dirección se usará como un alias de su dirección principal y, al enviarle una carta, se mostrará en su bandeja de entrada, descrita con más detalle en la ayuda de Google usando el enlace "Más ...".
    Ingrese una dirección diferente en el cuadro Respuesta (opcional) - Por defecto, la respuesta llega a la misma dirección que se utilizó para el envío. Al hacer clic en el enlace, puede especificar otro buzón al que se enviarán las cartas enviadas a esta dirección.
    Haga clic en Siguiente"

  8. A continuación, vemos algunos campos más que deben completarse.
    Servidor SMTP y Puerto - Esta información debe obtenerse del servicio postal.
    Nombre de usuario - por lo general, esta es una dirección de correo electrónico, este es el inicio de sesión para acceder al buzón.
    Contraseña - contraseña para acceder al buzón.
    Conexión segura usando TLS (recomendado) y conexión segura usando SSL - La segunda opción (SSL) se puede seleccionar solo si su servicio de correo utiliza este tipo de conexión segura. Básicamente, puede seleccionar el primer elemento.

    Después de hacer clic en "Agregar cuenta", se enviará una carta de verificación, similar a agregar un buzón para recoger el correo. Confirmamos y todo está listo.

Bueno, eso es todo, de esta manera, puede configurar el conjunto de cartas y la respuesta de otros buzones a través de Gmail. Un pequeño matiz, el calendario para recoger el correo de otros buzones de Gmail se forma de forma independiente, por separado para cada uno de esos buzones. Es decir, la carta enviada al buzón desde el que recoge el correo en la bandeja de entrada en la interfaz de Gmail no se mostrará de inmediato, sino solo después de la verificación. La frecuencia del cheque depende del número y la frecuencia de recepción de cartas a este buzón, el buzón, cuantas más cartas lleguen, más a menudo ocurrirá el cheque. No puede cambiar este parámetro de ninguna manera, pero en la configuración puede forzar la ejecución de la exploración.