Envoyer un e-mail avec un fichier joint en utilisant telnet ou netcat

15

J'utilise souvent telnet ou netcat pour connecter des serveurs smtp pour envoyer un e-mail comme test.

Est-ce que quelqu'un sait comment envoyer un e-mail à l'aide de telnet ou netcat, mais joindra également un fichier ? Il y a probablement de meilleures façons, mais je veux toujours savoir :-)

Je serais heureux avec une solution qui utilise un petit shell bash pour atteindre l'objectif, mais je ne veux pas utiliser d'autres outils ...

Kyle Brandt
la source
1
ehlo, cela comprendra probablement la création d'une pièce jointe MIME dans un fichier, l'encoder et ensuite le coller dans votre fenêtre. Bien qu'il puisse être très utile de pouvoir simplement Telnet sur un serveur SMTP, écrire un court courrier et l'envoyer (et je peux), envoyer un fichier comme ça n'est tout simplement pas très pratique. Essayez «sendfile» ou «mutt» (même si vous n'aimez pas utiliser d'outils).
Andrioid
Juste après l' écho '.'; vous voudrez peut-être ajouter cet écho '.'; dormir 3; écho «quitter»;

Réponses:

10

D'accord, donc en utilisant les commentaires de tout le monde comme point de départ, j'ai trouvé ce désordre idiot :-) ...

{ 
    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
la source
Bien que je n'envoie que des données aléatoires, je ne sais pas si les données restent intactes ...
Kyle Brandt
Vous avez une tolérance à l'ennui plus élevée que moi! > sourire <
Evan Anderson
Comment pourrais-je modifier cela pour envoyer un fichier texte spécifique?
user987654321
8

Ick. Vous allez devoir encoder la pièce jointe en base64 et créer les en-têtes MIME.

Plutôt que de générer un nouveau message "à la volée" à chaque fois, il serait probablement plus facile de simplement vous envoyer un exemple de message très court à partir d'un "vrai" programme de messagerie (en tirant parti du travail des personnes qui l'ont écrit pour mettre la pièce jointe). dans l'encodage approprié et la création des en-têtes MIME).

Enregistrez ce message dans un fichier texte avec ses en-têtes (en supprimant l'en-tête de transport, bien sûr), et modifiez / copiez / collez-le simplement dans telnet ou netcat pour les sessions futures.

Evan Anderson
la source
6

Bien que le test manuel des serveurs SMTP à la main soit possible et viable, l'utilisation d'un outil conçu à cet effet sera beaucoup plus facile.

Cet article explique SWAKS . swaks est conçu pour les tests de serveur smtp. Prend en charge les pièces jointes, l'authentification et le cryptage!

hayalci
la source
+1 Voilà quelque chose que je vais commencer à utiliser! :-)
Kyle Brandt
4

je suis tombé sur cette entrée alors que je cherchais quelque chose de même. et à partir des arcs ici et des recherches supplémentaires, j'ai réussi à faire ce script.

#!/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

Une chose que vous voudrez peut-être ajouter est l'authentification. je n'en ai pas besoin donc je ne l'ai pas ajouté.

Je pense que cela ne nécessite que md5sum , netcat , file , awk et les commandes base64 , je suppose qu'ils sont assez standard dans la plupart des systèmes.

ravenmeister
la source
Serait-il possible d'ajouter facilement plusieurs pièces jointes à cette solution?
TryTryAgain
3

C'est ce que je fais pour envoyer des e-mails avec bash. Je l'utilise pour m'envoyer un fichier journal et une adresse IP externe, n'hésitez pas à l'utiliser:

#!/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

J'espère que c'était bon pour vous;)

psirac.

psirac
la source
3

Telnet - envoyer un e-mail avec plusieurs pièces jointes

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

# Content-Type: text / csv; name = "$ FILE" # pour les fichiers CSV
# Content-Type: application / x-msdownload; name = "$ FILE" # pour l'exécutable
# Content-Type: text / xml; name = "$ FILE" # pour les fichiers xml ou essayez application / xml

telnet smtp.server.dom 25

HELO
COURRIER DE: [email protected]
RCPT À: [email protected]
LES DONNÉES
Objet: E-mail de test
De: [email protected]
À: [email protected]
Version MIME: 1.0
Type de contenu: en plusieurs parties / mixte; limite = "X - = - = - = - limite de texte"

--X - = - = - = - limite de texte
Type de contenu: texte / simple

Mettez votre message ici ...

--X - = - = - = - limite de texte
Type de contenu: application / zip; name = "file.zip"
Content-Transfer-Encoding: base64
Contenu-Disposition: pièce jointe; filename = "file.zip"

UEsDBBQAAAAIAG1 + zEoQa .... copier / coller zip.txt

--X - = - = - = - limite de texte
Type de contenu: texte / pdf; name = "file.pdf"
Content-Transfer-Encoding: base64
Contenu-Disposition: pièce jointe; filename = "file.pdf"

UEsDBBQAAAAIAG1 + zEoQa .... copier / coller pdf.txt

--X - = - = - = - limite de texte
.

QUITTER
Anrik
la source
1
Bienvenue sur serverfault. Les personnes qui publient des réponses comme la vôtre sont vraiment les bienvenues sur ce site! :) gratz
bgtvfr
1

Vous devrez revoir la spécification du protocole SMTP. C'est une lecture étonnamment légère pour une spécification technique, et vous aidera à comprendre comment fonctionne le processus de messagerie.

Plus précisément, sachez que les pièces jointes sont converties en types MIME et encodées en texte, de sorte que toutes les pièces jointes que vous souhaitez envoyer via telnet doivent être converties en texte et transmises en tant que telles via le protocole telnet.

sangretu
la source
1

Si tout ce que vous testez est `` la pièce jointe a-t-elle été délivrée '', vous pourriez peut-être vous en tirer avec le standard de pièces jointes pré-MIME: uuencode. Contrairement à MIME, il est beaucoup plus simple de créer des messages. Contrairement à MIME, il ne nécessite aucun en-tête. Cependant, tous les clients de messagerie ne reconnaissent plus les fichiers encodés en tant que pièces jointes, je suggère donc de tester pour voir si vous pouvez les utiliser. Si c'est le cas, vous venez de vous épargner beaucoup d'efforts. Si ce n'est pas le cas, alors pré-construire votre message MIMEed via perl ou quelque chose et le canaliser à travers quelque chose comme NetCat est probablement la voie à suivre.

Ça vaut le coup d'oeil.

sysadmin1138
la source
Il y a 20 ans, c'était une bonne réponse. Pas maintenant. Utilisez l'une des nombreuses bibliothèques MIME et créez un e-mail conforme à MIME, complet avec l'encodage Base64.
james.garriss