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 echo
para ejecutar mail
el 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 echo
una 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