¿Cómo enviar correos electrónicos a varios destinatarios y cada uno de ellos recibe un archivo adjunto diferente mediante el comando de correo desde la terminal?

¿Cómo enviar correos electrónicos a varios destinatarios y cada uno de ellos recibe un archivo adjunto diferente mediante el comando de correo desde la terminal?

Aquí está mi escenario. Tengo un archivo de texto. correo electrónicoADD.txt. contiene identificadores de correo electrónico en cada línea

[email protected]
[email protected]
[email protected]

Y tengo archivos en una carpeta.

abc.pdf
def.pdf
hij.pdf

etcétera

Quiero un script para enviar un correo electrónico a la primera identificación con el primer archivo adjunto. luego otro correo electrónico a la segunda identificación con el segundo archivo adjunto y así sucesivamente.

Tanto los ID de correo electrónico como los archivos adjuntos se almacenarán en orden alfabético. la cantidad de identificadores de correo electrónico y archivos adjuntos almacenados será igual.

Por favor recomiende.

Tengo esta idea de jesse_b pero no implica archivos adjuntos diferentes para cada identificación de correo electrónico.

#!/bin/bash
file=/location/of/emailAdd.txt

while 
    read -r email; 
    do
      #printf '%s\n' 'Hello, world!' | sudo mail -s 'This is the email subject' "$email"
    done < "$file"

Respuesta1

Creo que sería más fácil comenzar a recorrer los archivos adjuntos y extraer el destinatario a lo largo del camino, ya que Shell se expandirá en orden alfabético. Su script podría verse así:

#!/usr/bin/env sh

line=1

for i in *.pdf
do
    echo "$i"
    recipient="$(awk -v line="$line" 'NR==line' emailADD.txt)"
    if [ -n "$recipient" ]
    then
        printf "recipient: %s\n" "$recipient"
        line=$((line+1))
        printf '%s\n' 'Hello, world!' | echo mail -s 'This is the email subject' -a "$i" "$recipient"
    fi
done

Elimínelo echopara ejecutar mailel comando, pero ejecútelo primero con él para asegurarse de que hará lo que necesita.

Respuesta2

Si va a enviar una gran cantidad de correos electrónicos, puede obtener un mejor rendimiento si evita abrir emailADD.txt una vez por archivo adjunto. Si estás usando bash, puedes usarlo <()para procesar los archivos adjuntos sin almacenar sus nombres en un archivo:

$ paste emailADD.txt <(ls folder/) | while read -r email pdf; do printf '%s\n' 'Hello, world!' | echo mail -s 'This is the email subject' -a "$pdf" "$email"; done

Puedes eliminarlo echouna vez que parezca que hará lo que quieras.

Sin embargo, si no va a ejecutar esto de forma automática/regular, considere generar el texto de los comandos completos (incluido printf), redirigir la salida a un archivo y luego ejecutar los comandos en ese archivo. Eso permite inspeccionar los comandos, evita sorpresas si emailADD.txt o la lista de archivos adjuntos cambian durante la ejecución y le brinda un registro de lo que se hizo (que se puede guardar o descartar). Como esto:

$ paste emailADD.txt <(ls folder/) | while read -r email pdf; do echo "printf '%s\n' 'Hello, world' | mail -s 'This is the email subject' -a '$pdf' '$email' " ; done >| cmds

información relacionada