Enviar un correo electrónico con un archivo adjunto usando telnet o netcat

15

A menudo uso telnet o netcat para conectar servidores smtp para enviar un correo electrónico como prueba.

¿Alguien sabe cómo enviaría un correo electrónico usando telnet o netcat pero también adjuntaría un archivo ? Probablemente hay mejores formas, pero aún quiero saber :-)

Estaría contento con una solución que usa un pequeño bash shell para lograr el objetivo, pero no quiero usar ninguna otra herramienta ...

Kyle Brandt
fuente
1
Ehlo, esto probablemente incluirá la creación de un archivo adjunto MIME en un archivo, codifíquelo y luego péguelo en su ventana. Si bien puede ser muy útil poder simplemente hacer telnet a un servidor SMTP, escribir un correo breve y enviarlo (y puedo), enviar un archivo como ese simplemente no es muy práctico. Pruebe 'sendfile' o 'mutt' (incluso si no le gusta usar herramientas).
Andrioid
Justo después del eco '.'; es posible que desee agregar este eco '.'; dormir 3; echo 'salir';

Respuestas:

10

De acuerdo, entonces, usando los comentarios de todos como punto de partida, se me ocurrió este lío tonto :-) ...

{ 
    sleep 5; 
    echo 'ehlo';
    sleep 3;
    echo 'MAIL FROM:<[email protected]>';
    sleep 3; 
    echo 'RCPT TO: <kyle@test_dest.com>';
    sleep 3;
    echo 'DATA';
    sleep 3;
    echo -e 'To:[email protected]\nMIME-Version: 1.0 (mime-construct 1.9)\nContent-Type: application/zip\nContent-Transfer-Encoding: base64\n\n';
    dd if=/dev/urandom bs=4 count=10 2>/dev/null | openssl base64;
    echo '.';
} | telnet mx1.testdest.com 25
Kyle Brandt
fuente
Aunque ya que solo estoy enviando datos aleatorios, no estoy seguro de si los datos permanecen intactos ...
Kyle Brandt
¡Tienes una mayor tolerancia al tedio que yo! > sonrisa <
Evan Anderson
¿Cómo podría alterar esto para enviar un archivo de texto específico?
user987654321
8

Ick Tendrá que codificar en base64 el archivo adjunto y crear los encabezados MIME.

En lugar de generar un nuevo mensaje "sobre la marcha" cada vez, probablemente sería más fácil enviarse un mensaje de ejemplo muy breve de un programa de correo electrónico "real" (aprovechando el trabajo que hicieron las personas que lo escribieron para poner el archivo adjunto en la codificación adecuada y la creación de los encabezados MIME).

Guarde ese mensaje en un archivo de texto con sus encabezados (eliminando el encabezado de transporte, por supuesto), y simplemente modifíquelo / cópielo / péguelo en telnet o netcat para futuras sesiones.

Evan Anderson
fuente
6

Si bien las pruebas manuales de los servidores SMTP son posibles y viables, usar una herramienta diseñada para esto será mucho más fácil.

Este artículo explica SWAKS . swaks está diseñado para pruebas de servidor smtp. Admite archivos adjuntos, autenticación y cifrado.

hayalci
fuente
+1 ¡Eso es algo que voy a comenzar a usar! :-)
Kyle Brandt el
4

Me sorprendió esta entrada mientras buscaba algo de lo mismo. y de las bocinas aquí y algunas investigaciones adicionales logré hacer este guión.

#!/bin/sh

# Default reception
TOEMAIL="[email protected]";
# Default Subject
SUBJECT="You got mail - $DATE";
# Default Contents
MSGBODY="Hello, this is the default message body";
# Default Attachment
#ATTACHMENT="/tmp/testoutput"
# Default smtp server
mailserver="smtp.server.ltd"
mailserverPort="25"

showUsage() {
        echo "$0 -a /file/to/attach [-m /message/file] [-M \"Message string\"] -s \"subject\" -r [email protected]"
        echo
        echo "The attachment (-a) is required, if no attachment is used then rather use sendmail directly."
}

fappend() {
    echo "$2">>$1;
}
DATE=`date`

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# This might need correction to work on more places, this is tested at a ubuntu 13.10 machine.  #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
domain=`grep search /etc/resolv.conf | awk '{print $2;}'`
computer=`hostname`
user=`whoami`
FREMAIL="$user@$computer.$domain"

while getopts "M:m:a:s:r:" opt; do
  case $opt in
        s)
          SUBJECT="$OPTARG - $DATE"
          ;;
        r)
          TOEMAIL="$OPTARG"
          ;;
        m)
          MSGBODY=`cat $OPTARG`
          ;;
        M)
          MSGBODY="$OPTARG"
          ;;
        a)
          ATTACHMENT="$OPTARG"
          ;;
        :)
          showUsage
          ;;
        \?)
          showUsage
          ;;
  esac
done

if [ "$ATTACHMENT" = "" ]; then
        showUsage
        exit 1
fi

MIMETYPE=`file --mime-type -b $ATTACHMENT`
TMP="/tmp/tmpmail_"`date +%N`;
BOUNDARY=`date +%s|md5sum|awk '{print $1;}'`
FILENAME=`basename $ATTACHMENT`

DATA=`cat $ATTACHMENT|base64`

rm $TMP 2> /dev/null

fappend $TMP "EHLO $computer.$domain"
fappend $TMP "MAIL FROM:<$FREMAIL>"
fappend $TMP "RCPT TO:<$TOEMAIL>"
fappend $TMP "DATA"
fappend $TMP "From: $FREMAIL"
fappend $TMP "To: $TOEMAIL"
fappend $TMP "Reply-To: $FREMAIL"
fappend $TMP "Subject: $SUBJECT"
fappend $TMP "Content-Type: multipart/mixed; boundary=\"$BOUNDARY\""
fappend $TMP ""
fappend $TMP "This is a MIME formatted message.  If you see this text it means that your"
fappend $TMP "email software does not support MIME formatted messages."
fappend $TMP ""
fappend $TMP "--$BOUNDARY"
fappend $TMP "Content-Type: text/plain; charset=UTF-8; format=flowed"
fappend $TMP "Content-Disposition: inline"
fappend $TMP ""
fappend $TMP "$MSGBODY"
fappend $TMP ""
fappend $TMP ""
fappend $TMP "--$BOUNDARY"
fappend $TMP "Content-Type: $MIMETYPE; name=\"$FILENAME\""
fappend $TMP "Content-Transfer-Encoding: base64"
fappend $TMP "Content-Disposition: attachment; filename=\"$FILENAME\";"
fappend $TMP ""
fappend $TMP "$DATA"
fappend $TMP ""
fappend $TMP ""
fappend $TMP "--$BOUNDARY--"
fappend $TMP ""
fappend $TMP "."
fappend $TMP "quit"

netcat $mailserver $mailserverPort < $TMP >> $TMP
rc="$?"
if [ "$rc" -ne "0" ]; then
    echo "Returncode: $rc"
    echo "Please inspect $TMP"
else
    rm $TMP;
fi

Una cosa que quizás desee agregar es la autenticación. No lo necesito, así que no lo he agregado.

Creo que solo requiere los comandos md5sum , netcat , file , awk y base64 , creo que son bastante estándar en la mayoría de los sistemas.

Ravenmeister
fuente
¿Sería posible agregar múltiples archivos adjuntos fácilmente a esta solución?
Try TryAgain
3

Esto es lo que estoy haciendo para enviar correos electrónicos con bash. Lo uso para enviarme un archivo de registro y una dirección IP externa, no dude en usarlo:

#!/bin/bash
# Send email from bash with attachment
# by Psirac - www.subk.org
[email protected]
[email protected]
mailserver=smtp.test.com
mylogin=`echo 'MYUSERNAME' | openssl base64`
mypassword=`echo 'MYPASSWORD' | openssl base64`
myip=`wget -qO- icanhazip.com`
myfile=`cat /tmp/mytest.log | openssl base64`
mydate=`date`

exec 9<>/dev/tcp/$mailserver/25
echo "HELO routeur.tripfiller" >&9
read -r temp <&9
#echo "$temp"
echo "auth login" >&9
read -r temp <&9
#echo "$temp"
echo "$mylogin=" >&9
read -r temp <&9
#echo "$temp"
echo "$mypasswd=" >&9
read -r temp <&9
#echo "$temp"
echo "Mail From: $from" >&9
read -r temp <&9
#echo "$temp"
echo "Rcpt To: $to" >&9
read -r temp <&9
#echo "$temp"
echo "Data" >&9
read -r temp <&9
#echo "$temp"
echo "To:$to" >&9
echo "MIME-Version: 1.0" >&9
echo "Subject: Test mail sended at $mydate" >&9
echo "From: $from" >&9
echo "To: $to" >&9
echo "Content-Type: multipart/mixed; boundary=sep" >&9
echo "--sep" >&9
echo "Content-Type: text/plain; charset=UTF-8" >&9
echo "Here your text..." >&9
echo "External IP adress: $myip" >&9
echo "--sep" >&9
echo "Content--Type: text/x-log; name=\"mytest.log\"" >&9
echo "Content-Disposition: attachment; filename=\"mytest.log\"" >&9
echo "Content-Transfer-Encoding: base64" >&9
echo "" >&9
echo "$myfile" >&9
echo "--sep--" >&9
echo "." >&9
read -r temp <&9
echo "$temp"
echo "quit" >&9
read -r temp <&9
echo "$temp"
9>&-
9<&-
#echo "All Done. See above for errors"
exit 0

Espero que haya sido bueno para ti;)

psirac

psirac
fuente
3

Telnet: envíe un correo electrónico con varios archivos adjuntos

cat attach.zip | base64> zip.txt
cat attach.pdf | base64> pdf.txt

# Tipo de contenido: texto / csv; name = "$ FILE" # para archivos CSV
# Tipo de contenido: application / x-msdownload; name = "$ FILE" # para ejecutable
# Tipo de contenido: texto / xml; name = "$ FILE" # para archivos xml o pruebe application / xml

telnet smtp.server.dom 25

HELO
CORREO DESDE: [email protected]
RCPT A: [email protected]
DATOS
Asunto: correo electrónico de prueba
De: [email protected]
Para: [email protected]
Versión MIME: 1.0
Tipo de contenido: multiparte / mixto; límite = "X - = - = - = - límite de texto"

--X - = - = - = - límite de texto
Tipo de contenido: texto / plano

Pon tu mensaje aquí ...

--X - = - = - = - límite de texto
Tipo de contenido: aplicación / zip; nombre = "archivo.zip"
Contenido-Transferencia-Codificación: base64
Disposición de contenido: archivo adjunto; filename = "file.zip"

UEsDBBQAAAAIAG1 + zEoQa .... copiar / pegar zip.txt

--X - = - = - = - límite de texto
Tipo de contenido: texto / pdf; nombre = "archivo.pdf"
Contenido-Transferencia-Codificación: base64
Disposición de contenido: archivo adjunto; filename = "archivo.pdf"

UEsDBBQAAAAIAG1 + zEoQa .... copiar / pegar pdf.txt

--X - = - = - = - límite de texto
.

DEJAR
Anrik
fuente
1
Bienvenido a serverfault. ¡Las personas que publican respuestas como la suya son realmente bienvenidas en este sitio web! :) gratz
bgtvfr
1

Deberá revisar la especificación del protocolo SMTP. Es una lectura sorprendentemente ligera para una especificación técnica, y lo ayudará a comprender cómo funciona el proceso de correo electrónico.

Específicamente, tenga en cuenta que los archivos adjuntos se convierten en tipos MIME y se codifican en texto, por lo que cualquier archivo adjunto que desee enviar a través de Telnet tendría que convertirse en texto y transmitirse como tal a través del protocolo Telnet.

sangretu
fuente
1

Si todo lo que está probando es "se entregó el archivo adjunto", es posible que se salga con la suya con el estándar de archivos adjuntos pre-MIME: uuencode. A diferencia de MIME, es mucho más simple crear mensajes. A diferencia de MIME, no requiere ningún encabezado. Sin embargo, ya no todos los clientes de correo reconocen los archivos sin codificar como archivos adjuntos, por lo que sugiero probar para ver si puede usarlo. Si es así, te has ahorrado mucho esfuerzo. Si no lo hace, entonces preconstruir su mensaje MIMEed a través de Perl o algo y canalizarlo a través de algo como NetCat es probablemente el camino a seguir.

Digno de una mirada.

sysadmin1138
fuente
Hace 20 años esta fue una buena respuesta. Ahora no. Use una de las muchas bibliotecas MIME y cree un correo electrónico compatible con MIME, completo con codificación Base64.
james.garriss