
En esta parte, veremos cómo se puede adaptar la herramienta para inyectar flujos de correo en plataformas locales como PowerMTA y Momentum.
En parte 1, hicimos un recorrido rápido de S/MIME, observando la firma y el cifrado de nuestras corrientes de mensajes a través de una variedad de clientes de correo. Para las organizaciones que implementan el cifrado S/MIME, comprender cómo recopilar eficientemente las claves públicas de los destinatarios se vuelve crucial para operaciones de correo electrónico seguras y escalables. Parte 2 nos llevó a través de una herramienta simple de línea de comandos para firmar y cifrar correos electrónicos, luego enviarlos a través de SparkPost.
En esta parte, veremos cómo se puede adaptar la herramienta para inyectar corrientes de correo en plataformas locales como Port25 PowerMTA y Momentum.
¡OK – empecemos!
1. Empezar
Instalar la herramienta, obtener tus claves, etc., es exactamente igual que antes. Cuando utilizas un sistema de correo electrónico local como PowerMTA o Momentum, ya eres responsable de configurar los dominios de envío, claves DKIM, etc. Las organizaciones que utilizan sistemas locales también a menudo necesitan abordar desafíos del sistema de archivo de correos electrónicos para el cumplimiento normativo y los requisitos de retención de datos. Lo que necesitamos hacer ahora es proporcionar alguna manera de inyectar los mensajes S/MIME completamente formados en tus servidores.
2. SMTP injection hacia PowerMTA de Port25
3. SMTP Injection hacia Momentum
Momentum admite varios medios de inyección de mensajes, incluyendo API y SMTP. SMTP es el método utilizado aquí, hacia un host que ya está ejecutando Momentum. Dejaremos su configuración sin cambios, ya que ya tiene la capacidad de aceptar inyecciones entrantes de otros hosts aprobados.
Esta es una versión más pequeña de una configuración de producción, donde los nodos de "generation" y los nodos MTA están separados, pero estrechamente acoplados a través de una VLAN privada y equilibradores de carga, llevando tráfico de inyección SMTP interno.

Las herramientas S/MIME están instaladas como antes, y inyectaremos mensajes a la dirección del host SMTP (MTA):
export SMTP_HOST=xx.xx.xx.xx # configure su propia dirección MTA / VIP aquí
Como antes, tenemos la clave privada del remitente (steve@thetucks.com.pem) y la clave pública del destinatario (steve.tuck@sparkpost.com.crt) ya presentes en el nodo de "generation". Las primeras líneas del archivo de mensaje coinciden con estas direcciones.
Enviamos el mensaje desde el nodo de "generation" con exactamente el mismo comando que antes, y el mensaje aparece en el inbox.
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Como se esperaría, S/MIME también coexiste felizmente con el DKIM signing de Momentum.
4. Inyección SMTP hacia SparkPost
En parte 2 utilizamos la API REST de transmisiones de SparkPost para inyectar mensajes. Por supuesto, también es posible inyectar mensajes en SparkPost usando SMTP. Configuramos las variables de entorno de esta forma:
export SMTP_PASSWORD=<<TU CLAVE API AQUÍ>> export SMTP_HOST=smtp.sparkpostmail.com export SMTP_USER=SMTP_Injection export SMTP_PORT=587
Si estás usando el servicio alojado en la UE de SparkPost, entonces configura SMTP_HOST como smtp.eu.sparkpostmail.com.
(Ver aquí para más opciones, por ejemplo, puedes inyectar en el puerto 2525 en lugar de 587.)
La salida a continuación muestra que se usa STARTTLS, junto con el nombre de usuario y la contraseña.
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Verás:
Conexión SMTP abierta (STARTTLS) a smtp.sparkpostmail.com, puerto 587, usuario="SMTP_Injection", contraseña="****************************************" Enviando tests/fancy-HTML-to-smt.eml De: Steve <steve@thetucks.com> Para: SteveT <steve.tuck@sparkpost.com> OK - en 0.057 segundos
La contraseña se imprime con caracteres de sustitución ***, por lo que no comprometes la privacidad de tu clave si alguien está mirando por encima de tu hombro.
Protegiendo tus credenciales
Tenga en cuenta que las variables de entorno podrían configurarse en un archivo de script de shell o similar, para evitar volver a escribirlas. Si lo haces, por favor cuida tus contraseñas/claves API limitando el acceso a ese archivo solo a ti. Por ejemplo, si tu archivo de configuración de credenciales se llama my_envs.sh, entonces ejecuta:
chmod 0700 my_envs.sh
Advertencias Relacionadas con SMTP Que Puedes Ver
La inyección SMTP de SparkPost es bastante estricta, como cabría esperar de un servicio público. Si no has configurado el número de puerto SMTP, verás una advertencia:
{'bob.lumreeker@gmail.com': (550, b'5.7.1 relaying denied')}
Si no has configurado el nombre de usuario SMTP o no has establecido la contraseña, verás:
(530, b'5.7.1 Authorization required. Ref. https://developers.sparkpost.com/api/index#header-smtp-relay-endpoints', 'steve@thetucks.com')
Estos mensajes de error se informan tal cual desde la biblioteca SMTP de Python, de ahí el formato.
¿Cuál es más rápido – SMTP o API?
Francamente, es poco probable que S/MIME sea un caso de uso de alto volumen, pero tener la misma herramienta con dos opciones de salida ¡era como pedirnos que corriéramos una carrera!
El archivo de prueba de correo electrónico "Avocado" utilizado aquí tiene aproximadamente 19KB. Repetir las pruebas 10 veces mediante un bucle bash mostró que los tiempos promedio eran similares para SMTP y API, alrededor de 60 milisegundos por mensaje, lo cual es bastante rápido. En este caso, inyectamos desde una instancia EC2 media en la misma región de alojamiento que SparkPost.com, lo cual es una buena manera de mantener bajos los tiempos de ida y vuelta de la red.
Repitiendo esto con un archivo de prueba más grande (577KB), la API tomó aproximadamente 200 milisegundos, mientras que SMTP tomó 280 milisegundos por mensaje, lo cual sigue siendo impresionante para un tamaño de archivo 30 veces mayor. Por supuesto, su experiencia puede variar dependiendo de la ubicación, la congestión de Internet, etc., pero es poco probable que el rendimiento sea un problema.
Si realmente necesita el máximo rendimiento, un buen punto de partida sería lanzar un número determinado de procesos/sesiones de inyección concurrentes según nuestras recomendaciones de mejores prácticas de transmisión, por ejemplo, desde una tarea de supervisión.