Desplegando señales para On-Premises: integración de PowerMTA

Vamos a profundizar en los detalles de la configuración de PowerMTA para SparkPost Signals.

Publicado por

Bird

Fecha

30 ago 2019

Categoría

Correo electrónico

Desplegando señales para On-Premises: integración de PowerMTA

Vamos a profundizar en los detalles de la configuración de PowerMTA para SparkPost Signals.

Publicado por

Bird

Fecha

30 ago 2019

Categoría

Correo electrónico

Desplegando señales para On-Premises: integración de PowerMTA

Vamos a profundizar en los detalles de la configuración de PowerMTA para SparkPost Signals.

Publicado por

Bird

Fecha

30 ago 2019

Categoría

Correo electrónico

Vamos a sumergirnos en los detalles de la configuración de PowerMTA para SparkPost Signals. Vas a necesitar:

  • Un host para ejecutar la última versión de PowerMTA – ya sea nuevo o una máquina existente

  • Una cuenta de SparkPost con permiso de clave API para “Eventos Entrantes: Escribir” como se describe aquí

Configuraremos PowerMTA para transmitir eventos a tu cuenta de SparkPost, y luego podrás usar lo siguiente:

Primero, instala (o actualiza) a PowerMTA 5.0 r4 o posterior, siguiendo las instrucciones habituales de instalación v5.0 que son bastante simples. Luego trabajaremos a través de los siguientes pasos:

  • Configura el conector de PowerMTA para SparkPost Signals

  • Configura el seguimiento de compromiso con un dominio de seguimiento personalizado

  • Selecciona qué flujos de tráfico de PowerMTA informar a Signals

  • Prueba que tus eventos están llegando a Signals

  • Revisa cómo usar nombres significativos que se muestren bien en los informes.

También cubriremos otros aspectos específicos de la configuración de PowerPMTA utilizados en nuestra demostración de Signals:

  • Eventos FBL (Quejas de Spam) y rebotes remotos (fuera de banda)

  • Configuración de inyección, incluyendo DKIM

  • Configuración de FBL y OOB

  • Configuración y nombrado de VirtualMTA (y cómo esto aparece en tus informes de SparkPost Signals)

Finalmente, hay una “característica extra” con código para asegurar que los nombres de tus campañas son compatibles con las convenciones de nombres de PowerMTA X-Job .


Configurar el conector de PowerMTA

La configuración de Signals se describe en la sección 10.1 de la Guía del Usuario 5.0. Aquí comenzaremos con “Caso de Uso #2”, que habilita Signals para todo el tráfico de este host de PowerMTA y habilita el seguimiento de compromiso de SparkPost.

# # SparkPost Signals # <signals> clave-api ##mi clave API de ingestión aquí## url-de-carga https://api.sparkpost.com/api/v1/ingest/events log-verbose true min-free-space 1G engagement-tracking sparkpost # esto activa el seguimiento de abiertos y clics en PowerMTA id-cliente 123 # Tu número de cuenta de SparkPost aquí </signals> enable-signals true

A continuación, se explica lo que hace cada atributo:

clave-api

Esto es único para tu cuenta de SparkPost, es el valor que obtuviste de SparkPost anteriormente.

url-de-carga

Esto necesita coincidir con la dirección de tu servicio API de SparkPost, ya sea de EE.UU. o de la UE. Para más información, consulta aquí. Los valores habituales son:

SparkPost (EE.UU.): https://api.sparkpost.com/api/v1/ingest/events

SparkPost UE:    https://api.eu.sparkpost.com/api/v1/ingest/events

log-verbose

Esta directiva es opcional y, cuando está habilitada, brinda un poco más de información en el archivo pmta.log, lo que puede ser útil durante la configuración para confirmar que todo está funcionando correctamente. Cada minuto, incluso cuando no hay tráfico, verás:

2019-07-26 11:47:57 Signals: Se descubrieron 0 archivos

Con tráfico, verás algo como:

2019-07-26 11:50:57 Signals: Se descubrió sp1-0000000000003FBD.json 2019-07-26 11:50:57 Signals: Se transfirió sp1-0000000000003FBD.json exitosamente. 2019-07-26 11:50:57 Signals: Se descubrió 1 archivo, se transfirió 1 archivo exitosamente

min-free-space

Esto le indica a PowerMTA el umbral de espacio en disco en el cual debe comenzar a eliminar los archivos JSON más antiguos de SparkPost para hacer espacio para nuevos archivos cuando el espacio en disco esté bajo.

enable-signals

Esto le indica a PowerMTA que cargue a Signals, en este caso de forma global para todo el tráfico (más información aquí, para v5.0). Puedes ser más selectivo acerca de qué flujos de tráfico cargar si lo deseas.

También puedes marcar tráfico particular de PowerMTA para que se informe como perteneciente a una subcuenta de SparkPost – esta es otra manera de distinguir un flujo de tráfico particular de otro.

seguimiento-de-compromiso, id-cliente
La solución de Seguimiento de Compromiso de PowerMTA por defecto usa el dominio de seguimiento para el servicio alojado en EE.UU. de SparkPost. Especificas tu ID de cliente numérico de SparkPost; aquí están las instrucciones para encontrarlo.

dominio-de-seguimiento

Para cuentas de SparkPost de la UE, agrega la siguiente línea:

dominio-de-seguimiento pmta.eu.spgo.io # este es el punto final para SparkPost UE

Dominio de seguimiento personalizado

Si prefieres usar tu propio dominio de seguimiento (esto es mejor desde el punto de vista de la entregabilidad), haz lo siguiente:

  • Crea un dominio de seguimiento con tu proveedor de DNS creando un registro CNAME. Esto suele ser un subdominio de tu dominio de nivel superior, por ejemplo, track.mimempresa.com .

track.mimempresa.com CNAME pmta.spgo.io # si tienes una cuenta de SparkPost de EE.UU. track.mimempresa.com CNAME pmta.eu.spgo.io # si tienes una cuenta de SparkPost de la UE

También puedes usar dominios de seguimiento HTTPS, aunque esto es más complicado (consulta los pasos de configuración de SparkPost aquí).

  • Registra el dominio de seguimiento en tu cuenta de SparkPost y verifícalo. Espera unos minutos antes de intentar esto, para permitir que tus cambios de DNS se propaguen a través de Internet, dependiendo de tu proveedor de DNS.

  • Configura PowerMTA para usar ese dominio en lugar del predeterminado, con

dominio-de-seguimiento tu-dominio.com # Pon tu propio dominio aquí

Puedes verificar que tus correos electrónicos entregados tengan “píxeles abiertos” añadidos y que los enlaces estén envueltos, mirando los internos del correo (en Gmail, usa el menú en la parte superior derecha y selecciona “Mostrar original”).


Notarás los píxeles abiertos al inicio y al final del HTML en el correo. Cada enlace HTML también se cambia para tener REF  apuntando al dominio de seguimiento.


Eso es todo lo que necesitas para hacer que SparkPost Signals funcione con el Seguimiento de Compromiso integrado de PowerMTA.

Prevención de enlaces específicos en tu correo HTML de ser rastreados

Puedes evitar que PowerMTA rastree enlaces específicos, configurando el atributo personalizado data-msys-clicktrack  a “0”  :

<a href="#" data-msys-clicktrack="0">Ejemplo</a>

PowerMTA no envolverá el enlace. También eliminará ese atributo antes de transmitir el mensaje a tu receptor.


Selecciona qué flujos de tráfico de PowerMTA informar a Signals

Puedes seleccionar Signals para que esté activo:

  • Globalmente (esto es lo que usamos en el ejemplo anterior)

  • Para algunos Virtual MTAs y no otros

  • Para algunos grupos de Virtual MTA y no otros

  • Para direcciones “Remitente” o “De” específicas retransmitidas por PowerMTA, en combinación con las selecciones de Virtual MTA / grupo de Virtual MTA

Esta configuración es muy poderosa y se ilustra a través de una serie de casos de uso de ejemplo (v5.0) en la Guía del Usuario.


Prueba que tus eventos están llegando a Signals

A continuación, se muestra una vista de SparkPost Signals, conectado a PowerMTA. Puedes ver que la puntuación de salud está variando.


Los nombres de las campañas están disponibles como facetas de informes, junto con Subcuenta, Grupo IP, Proveedor de Buzón y Dominio de Envío.

Además de mirar los registros de PowerMTA, puedes verificar que los datos de eventos están llegando a SparkPost mirando la pantalla de Integración de Signals.


En tu pantalla de Búsqueda de Eventos de SparkPost, deberías ver eventos aparecer en unos minutos. Estos incluirán eventos de Inyección y Entrega, así como Rebote y potencialmente eventos de Rebote Fuera de Banda y Quejas de Spam, si ya has configurado PowerMTA para manejarlos por ti.
Si tienes habilitado el Seguimiento de Compromiso, también verás eventos de abierto, inicial_open y clic .


Usando nombres significativos que se muestren bien en los informes

Configurar los nombres de los grupos VirtualMTA de PowerMTA y los nombres de trabajos para que sean significativos y legibles por humanos vale la pena hacerlo. Estos aparecen directamente en las facetas de Signals de SparkPost y en el informe de Resumen.

Como mencioné antes, no necesitas crear estos grupos en tu cuenta de SparkPost. SparkPost los recoge de tu configuración de PowerMTA.

A continuación se muestra cómo se traducen los términos de configuración de PowerMTA a términos de SparkPost.

Término PowerMTA Término Informes / Signals de SparkPostDominio del Receptor
(porción de dominio del campo “rcpt” en el archivo de Contabilidad).Dominio del ReceptorLa porción de dominio del encabezado “Remitente” o “De” en el mensaje retransmitido por PowerMTA.
(porción de dominio del “orig” en el archivo de Contabilidad).Dominio de EnvíoVirtualMTA (nombre)—Grupo VirtualMTA (nombre)
(“vmtaPool” en el archivo de contabilidad)Grupo IP (nombre)smtp-source-host a.b.c.d
(“dlvSourceIp” en el archivo de contabilidad)IP de Envío a.b.c.dNombre del trabajo (nombre)
(“jobId” en el archivo de contabilidad)ID de Campaña (nombre)—Plantilla (nombre)“Subcuenta” no es un concepto nativo de PowerMTA.


Sin embargo, PowerMTA puede etiquetar virtualMTAs, grupos de MTA virtuales, o dominios de Remitente o De con un ID de subcuenta para fines de informes de SparkPost.

ID de subcuenta (número)FBL (evento)Queja de Spam (evento)Rebote Remoto (evento)Rebote Fuera de Banda (evento)

 

Configurar al menos una dirección smtp-source-host  también permite que SparkPost identifique correctamente la dirección IP de envío para que aparezca en los eventos de Inyección y Entrega, así como en la vista del informe de Resumen.

Los nombres de trabajos se establecen en PowerMTA a través de un encabezado en el mensaje inyectado. Además de habilitar el control individual del trabajo (pausar/reanudar, etc.), lo que es útil en sí mismo, PowerMTA pasa los nombres a través de los informes de Signals de SparkPost como “ID de campaña”. Consulta la Guía del Usuario sección 12.8 “Rastreo de una campaña en PowerMTA con un JobID”.

Hay algunas cosas que debes tener en cuenta respecto al nombramiento de trabajos. Mientras que SparkPost (con formato JSON, y escape JSON) permite caracteres como <SPACE>  en los nombres de campaña, los encabezados de correo son más restrictivos. Los caracteres válidos permitidos en el encabezado X-Job  son:

A-Za-z0-9!#$%&'()*+,-./:;<=>?@[\]^_{|}~ 

En otras palabras, los caracteres no permitidos incluyen <SPACE>, comillas dobles “  y acento grave `. Si estás acostumbrado a trabajar con nombres X-Job, esto no será sorprendente, y los nombres de tus ID de campaña “simplemente funcionarán” en el informe de SparkPost. Si como yo, conociste primero SparkPost, tal vez quieras una herramienta para asegurar que tus valores X-Job sean seguros; consulta la característica extra al final de este artículo.

Eventos FBL (Quejas de Spam) y rebotes remotos (fuera de banda)

PowerMTA puede recibir y procesar eventos FBL (conocidos en SparkPost como eventos de Queja de Spam) y rebotes remotos (conocidos en SparkPost como rebotes fuera de banda, porque la respuesta regresa algún tiempo después, en lugar de durante la conversación SMTP).

Hay artículos en el foro de soporte de Port25 sobre cómo configurar el Procesador de Rebotes y el Procesador FBL. Si eres un usuario existente de PowerMTA, probablemente ya los tengas.

A continuación, se muestra la configuración que hice para una demostración, basada en estos artículos y orientada a alojar PowerMTA en Amazon EC2.

Si estás familiarizado con la configuración de PowerMTA en esta área, puedes omitir esta parte, hasta la siguiente línea horizontal.

Configuración de inyección

Usaremos el puerto 587 para mensajes inyectados, que vendrán a través de Internet público desde otro host. Necesitamos detener a los actores maliciosos de descubrir y abusar de este servicio, por lo que aplicamos autenticación de nombre de usuario/contraseña y TLS opcional, similar a los puntos de inyección SMTP de SparkPost.

Queremos poder enviar mensajes desde fuentes que estén debidamente autenticadas a cualquier destino. También queremos un oyente separado en el puerto 25 para respuestas de FBL y rebotes remotos que no requieren autenticación.

# # Dirección(s) IP y puerto(s) en los que escuchar para conexiones SMTP entrantes # smtp-listener 0.0.0.0:587 smtp-listener 0.0.0.0:25

En las siguientes declaraciones <source> , estamos usando autenticación de nombre de usuario/contraseña y TLS opcional para defendernos contra la inyección de mensajes maliciosos. También establecemos límites de tasa en las conexiones que intentan adivinar la contraseña.

Tu configuración podría ser diferente; por ejemplo, si tienes una red privada entre el inyector y PowerMTA, no necesitarás autenticación por contraseña.

# Una regla de origen para toda inyección, interna o externa. Hacer cumplir auth, excepto para rebotes y FBLs # <source 0/0> log-connections false log-commands false # ADVERTENCIA: ¡verbo! solo para dev log-data false # ADVERTENCIA: ¡aún más verboso! smtp-service true # permitir servicio SMTP smtp-max-auth-failure-rate 1/min allow-unencrypted-plain-auth false allow-starttls true rewrite-list mfrom </source> <source {auth}> always-allow-relaying yes # solo si la autenticación tiene éxito default-virtual-mta default process-x-job true </source>

La declaración <source {auth}>  (ver aquí. v5.0) se aplica una vez que la autenticación ha pasado. Aquí, permite reenvíos hacia adelante, configura el grupo de MTA virtual predeterminado a usar, y añade el encabezado X-Job (que será informado por SparkPost Signals como campaign_id).

La lista de reescritura mapea los mensajes inyectados para usar un dominio MAIL FROM específico (también conocido como dominio de rebote o Return-Path:).

# # Reescribir la dirección MAIL FROM para que coincida con el dominio de rebote # <rewrite-list mfrom> mail-from *@pmta.signalsdemo.trymsys.net *@bounces.pmta.signalsdemo.trymsys.net </rewrite-list>

Luego configuramos nuestra configuración de TLS y nombre de usuario/contraseña SMTP, de acuerdo con recomendaciones actuales.

# # Asegura el servicio entrante con nombre de usuario, contraseña y TLS. SMT 2020-06-15 # smtp-server-tls-certificate /etc/pmta/pmtasignalsdemo.pem smtp-server-tls-allow-tlsv1 false smtp-server-tls-allow-tlsv1.1 false smtp-server-tls-allow-tlsv1.2 true smtp-server-tls-allow-tlsv1.3 true # # Usuarios SMTP (autenticados a través de SMTP AUTH) # <smtp-user SMTP_Injection> password ##PON AQUÍ TU CONTRASEÑA## authentication-method password </smtp-user>

Podemos verificar que el TLS (inseguro, obsoleto) v1.0 no se acepta usando mi herramienta de prueba SMTP favorita,  swaks.

swaks --server pmta.signalsdemo.trymsys.net --port 587 --to test@trymsys.net --from any@sparkpost.com --tls --tls-protocol tlsv1

Vemos:

*** Fallo en el inicio de TLS (connect(): error:00000000:lib(0):func(0):reason(0)) *** STARTTLS intentado pero falló

Igualmente para –tls-protocol tlsv1_1.

También apliquemos la firma DKIM en nuestros mensajes salientes, ya que es una buena práctica (seguí estas instrucciones para configurar la clave).

# # DKIM # domain-key mypmta, pmta.signalsdemo.trymsys.net, /etc/pmta/mypmta.pmta.signalsdemo.trymsys.net.pem


Configuración FBL y OOB

Ahora.. por fin.. declaramos qué dominios específicos están abiertos para respuestas de rebote remoto y FBL. No queremos reenviarlas a ningún lado (para evitar ataques de rebote), solo procesar esas respuestas internamente.

# # Habilitar el procesamiento de Rebotes y FBL en dominios específicos # relay-domain pmta.signalsdemo.trymsys.net relay-domain bounces.pmta.signalsdemo.trymsys.net relay-domain fbl.pmta.signalsdemo.trymsys.net <bounce-processor> deliver-unmatched-email no deliver-matched-email no <address-list> domain pmta.signalsdemo.trymsys.net domain bounces.pmta.signalsdemo.trymsys.net </address-list> </bounce-processor> <feedback-loop-processor> deliver-unmatched-email no deliver-matched-email no <address-list> domain fbl.pmta.signalsdemo.trymsys.net </address-list> </feedback-loop-processor>

Puedes ver que configuré dos dominios de rebote, ya que estaba experimentando con usar/no usar la regla de reescritura mfrom .

El dominio FBL generalmente se registra con servicios externos como Microsoft SNDS; consulta este artículo para más información. Para esta demostración, los FBL vendrán del Bouncy Sink, así que no es necesario registrarse.


Prueba del oyente SMTP

Es importante probar que tu oyente SMTP requiera autorización para cualquier destino general, rechazando mensajes que no están específicamente dirigidos a los dominios de rebote y FBL.

swaks --server pmta.signalsdemo.trymsys.net --port 25 --to test@strange.pmta.signalsdemo.trymsys.net --from any@sparkpost.com

La respuesta, como se esperaba, muestra que el reenvío está denegado:

550 5.7.1 reenvío denegado para el destinatario en "RCPT TO:<test@strange.pmta.signalsdemo.trymsys.net>

(Fin de la descripción de la configuración de demostración).

Configuración y nombrado de VirtualMTA

Los VirtualMTAs de PowerMTA (y los grupos de VirtualMTA) son características poderosas para gestionar flujos de mensajes, y las características de informes de PowerMTA / SparkPost Signals funcionan mejor con estos activos.

# # Rutar todo el tráfico saliente a través de este MTA / grupo virtual. # Declara la dirección IP de entrega aquí, para que los eventos de inyección de señales de SparkPost (también conocidos como "recepción") # llevarán el atributo sending_IP correcto # <virtual-mta mta1>     smtp-source-host 172.31.25.101 pmta.signalsdemo.trymsys.net </virtual-mta> <virtual-mta-pool default>     virtual-mta mta1     <domain *>         max-smtp-out    20       # máx. conexiones *por dominio*         bounce-after    4d12h    # 4 días, 12 horas         retry-after     10m      # 10 minutos         dkim-sign       yes     </domain> </virtual-mta-pool>

La configuración del agrupamiento de MTA virtual  se informa en SparkPost como “Grupo IP”, y está disponible como una faceta de informes de SparkPost Signals (el menú desplegable debajo de los gráficos).


El Informe de Resumen también muestra el Grupo IP como una faceta de informes “Agrupar por”.


Como se mencionó anteriormente en este artículo, configurar al menos una dirección  smtp-source-host también permite que SparkPost identifique correctamente la dirección IP de envío, para que aparezca en los eventos de Inyección y Entrega, y en el Informe de Resumen:


Eso es todo lo que necesitas para hacer que una integración básica funcione entre PowerMTA y SparkPost Signals. Encontrarás el ejemplo de archivo de configuración completo aquí.

Antes de que te vayas, aquí está la característica extra que mencioné.

Característica extra: Verificación/Filtro de nombres X-Job

Para asegurar que cualquier cadena de caracteres sea segura para usar como un nombre X-Job de PowerMTA, aquí hay una función simple de Python para mapear cualquier carácter inseguro a un guión bajo “_”

import re def pmtaSafeJobID(s):    """    :param s: str    :return: str    Mapear una cadena de ID de campaña arbitraria a caracteres permitidos para el encabezado X-Job de PMTA.    Ver https://download.port25.com/files/UsersGuide-5.0.html#tracking-a-campaign-in-powermta-with-a-jobid    Específicamente prohibir <sp> " ` pero permitir pasar la mayoría de otros caracteres.    """    # Nota que hay que escapar ' - [ ] y doble-escapar \ - ver https://docs.python.org/3/library/re.html    disallowedChars = '[^A-Za-z0-9!#$%&\'()*+,\-./:;<=>?@\[\\\\\]^_{|}~]'    return re.sub(disallowedChars, '_', s)

Esto usa expresiones regulares de Python de una manera específica. Declara el conjunto de caracteres no permitidos usando el operador “complemento de conjunto” ^ en lugar de enumerar todos los caracteres permitidos. Eso significa que capturamos (y hacemos seguros) caracteres más allá del conjunto habitual de 7 bits. Podemos mostrar eso usando este fragmento de prueba:

s='' for i in range(32, 256): s += chr(i) print(pmtaSafeJobID(s))

Dando

_!_#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^__abcdefghijkl mnopqrstuvwxyz{|}~___________________________________________________________ ______________________________________________________________________

Puedes ver que <SPACE>, comillas dobles “, y acento grave `, así como todos los caracteres más allá de ~ son mapeados a un guión bajo.

¿Listo para ver a Bird en acción?

Programa una demostración ahora.

El CRM primero en IA para Marketing, Servicios y Pagos

Al hacer clic en "Obtener una demostración" aceptas los términos de Bird's

El CRM primero en IA para Marketing, Servicios y Pagos

Al hacer clic en "Obtener una demostración" aceptas los términos de Bird's

El CRM primero en IA para Marketing, Servicios y Pagos

Al hacer clic en "Obtener una demostración" aceptas los términos de Bird's