Mailen mit telnet

buli

buli

Debianator
Hallo!
Mit telnet kann man ja Mails abrufen und verschicken.
Da dachte ich mir, warum nicht mal ein script dazu schreiben? :D

Leider funzt es nicht so ganz.

Hier mein script:

Code:
#! /bin/bash
#
# Mailtel
#
POP_1=pop.gmx.net
SMTP_1=mail.gmx.net
POP_2=pop.mail.yahoo.de
SMTP_2=smtp.mail.yahoo.de

function pop_1() {
echo "Geben Sie Ihren Benutzernamen ein:"
read user
echo "Geben Sie Ihr Passwort ein:"
read -s pass

telnet $POP_1 110
user $user
pass $pass
}

function smtp_1() {
echo "Geben Sie Ihren Benutzernamen ein:"
read user
echo "Geben Sie den Empfänger ein:"
read empf
echo "Geben Sie den Betreff ein:"
read subj

telnet $SMTP_1 25

echo -e "helo"                              # Diese echos werden
echo -e "mail from: $user"            # erst nach dem
echo -e "rcpt to: $empf"               # disconnect ausgeführt
echo -e "data"
echo -e "subject: $subj"
echo -e "Hallo!"
echo -e "."
echo -e "quit"
}
 
function pop_2() {
echo "Geben Sie Ihren Benutzernamen ein:"
read user
echo "Geben Sie Ihr Passwort ein:"
read -s pass

telnet $POP_2 110
user $user
pass $pass
}

function smtp_2() {
echo "Geben Sie Ihren Benutzernamen ein:"
read user
echo "Geben Sie den Empfänger ein:"
read empf
echo "Geben Sie den Betreff ein:"
read subj

telnet $SMTP_2 25

echo -e "helo"                                       # Diese echos werden
echo -e "mail from: $user"                      # erst nach dem
echo -e "rcpt to: $empf"                         # disconnect ausgeführt
echo -e "data"
echo -e "subject: $subj"
echo -e "Hallo!"
echo -e "."
echo -e "quit"
}

echo "Möchten Sie Mails [v]erschicken, oder [a]brufen?"
read eing
echo "Welchen Server möchten Sie verwenden?"
echo "GMX [1], oder Yahoo [2] ?"
read serv

if [ $eing == "a" ] && [ $serv == "1" ]; then
pop_1

elif [ $eing == "v"  ] && [ $serv == "1" ]; then
smtp_1

elif [ $eing == "a" ] && [ $serv == "2" ]; then
pop_2

elif [ $eing == "v" ] && [ $serv == "2" ]; then
smtp_2

fi

Connecten kann ich mich zu pop3 und smtp.
Aber die ganzen "echos" (s.kommentare) werden erst nach dem disconnect ausgeführt.(smtp)

Beim pop-server werden alle eingegebenen Befehle mit einem error kommentiert.

Hat jemand nen Tip/Denkanstoss für mich?
Ist sowas überhaupt mit sh möglich?
 
Zuletzt bearbeitet:
Hrm,

wofür soll das script gut sein? Entweder man weiss über das entsprechende Protokoll bescheid und wie man darüber kommuniziert oder man lässt es sein ;)

Und wenn ich schon über telnet irgendwie was teste dann hat das seinen grund und es sollte interaktiv sein damit ich auch wirklich seh was da passiert.

Mfg Frank

ps: so wird das mit deinem script nicht gehen. dafür gibt es andere programme
 
wofür soll das script gut sein?
Dass es eigentlich keinen praktischen Nutzen hat, weiss ich auch.
Ich interessiere mich halt dafür, und wollte mal rumprobieren.

Ansonsten fand ich deine Antwort nicht sehr konstruktiv.
 
telnet ist ja ein interaktives Programm, dass input erwartet. Wenn du das einfach so startest, erwartet es diesen Input natürlich von der Tastatur. Mit der Standard-Pipe | kannst du z.B. Input übergeben (z.B. echo "irgendwas" | telnet host)
 
Das wird aber schief gehen, weil jedesmal nach dem Senden des Befehls ein Disconnect erfolgt und somit z.B. Authentifizierung u.ä. nicht möglich ist. expect könnte hier evtl. eine Lösung sein, hab ich aber noch keine grosse Erfahrung mit, ist aber dafür gemacht interaktive Eingaben zu ermöglichen.
Der Sinn des Skripts ist aber auch mir schleierhaft. Jeder simple SMTP-Client für die Konsole kann die gewünschten Funktionalitäten und wesentlich mehr.
 
hi,

Benutzt man nicht andere Befehle zum authentifizieren?
So wie es aussieht benutzt du in SMTP_1 auch den gmx-smtp server und der verlangt ein username und ein passwort.

Ich hab mir hier die entsprechenden funktionen selber programmiert, ist aber PHP. Vielleicht hilft es dir trotzdem:

SMTP:
PHP:
<?php
  function smtp_read($socket,$ok = 250,$end = "\r\n",$showend = FALSE) {
    $ok = (string)$ok;
    $n = 0;
    $data = "";
    $i = 0;
    while (TRUE) {
      $byte = fgets($socket,2);
      $data .= $byte;
      if ($byte==$end{$n}) $n++;
      else $n = 0;
      if ($n==strlen($end)) break;
      if ($i==strlen($ok)) {
        if (substr($data,0,$i)!=$ok) return FALSE;
      }
      $i++;
    }
    if (!$showend) $data = substr($data,0,strlen($data)-strlen($end));
    return $data;
  }

  function smtp_open($server,$port = 25,$user = NULL,$pass = NULL) {
    if ($user==NULL xor $pass==NULL) return FALSE;
    $socket = fsockopen($server,$port);
    if (!$socket) return FALSE;
    fputs($socket,"HELO\r\n");
    if (smtp_read($socket)===FALSE) return FALSE;
    if ($user!=NULL and $pass!=NULL) {
      fputs($socket,"AUTH LOGIN\r\n");
      if (smtp_read($socket,334)===FALSE) return FALSE;
      fputs($socket,base64_encode($user)."\r\n");
      if (smtp_read($socket,334)===FALSE) return FALSE;
    }
    return $socket;
  }
  function smtp_send($socket,$from,$to,$msg) {
    fputs($socket,"MAIL FROM:<$from>\r\n");
    if (smtp_read($socket)===FALSE) return FALSE;
    foreach ($to as $t) {
      fputs($socket,"RCPT TO:<$t>\r\n");
      if (smtp_read($socket)===FALSE) return FALSE;
    }
    fputs($socket,"DATA\r\n");
    if (smtp_read($socket,354)===FALSE) return FALSE;
    fputs($socket,"$msg\r\n.\r\n");
    if (smtp_read($socket)===FALSE) return FALSE;
  }
?>

POP:
PHP:
<?php
  function pop3_read($socket,$end = "\r\n",$showend = FALSE) {
    $n = 0;
    $data = "";
    $i = 0;
    while (TRUE) {
      $byte = fgets($socket,2);
      $data .= $byte;
      if ($byte==$end{$n}) $n++;
      else $n = 0;
      if ($n==strlen($end)) break;
      if ($i==3) {
        if (substr($data,0,3)!="+OK") return FALSE;
      }
      $i++;
    }
    if (!$showend) $data = substr($data,0,strlen($data)-strlen($end));
    return $data;
  }

  function pop3_open($user,$pass,$server,$port = 110) {
    $socket = fsockopen($server,$port);
    if (!$socket) return FALSE;
    if (pop3_read($socket)===FALSE) return FALSE;
    fputs($socket,"USER $user\r\n");
    if (pop3_read($socket)===FALSE) return FALSE;
    fputs($socket,"PASS $pass\r\n");
    if (pop3_read($socket)===FALSE) return FALSE;
    return $socket;
  }
  function pop3_close($socket) {
    fputs($socket,"QUIT\r\n");
    fclose($socket);
  }
  function pop3_stat($socket) {
    fputs($socket,"STAT\r\n");
    $stat = pop3_read($socket);
    if (substr($stat,0,3)!="+OK") return FALSE;
    list($ok,$newmails,$size) = explode(" ",$stat);
    return array("newmails"=>$newmails,"size"=>$size);
  }
  function pop3_list($socket,$n = NULL) {
    if ($n!=NULL) $n = " ".$n;
    fputs($socket,"LIST$n\r\n");
    $list = pop3_read($socket,"\r\n.\r\n");
    if (substr($list,0,3)!="+OK") return FALSE;
    list($ok,$list) = explode("\r\n",$list,2);
    $list = explode("\r\n",$list);
    $array = array();
    foreach ($list as $li) {
      list($id,$size) = explode(" ",$li);
      $array[$id] = $size;
    }
    return $array;
  }
  function pop3_get($socket,$n) {
    fputs($socket,"RETR $n\r\n");
    $mail = pop3_read($socket,"\r\n.\r\n");
    if ($mail===FALSE) return FALSE;
    list($ok,$mail) = explode("\r\n",$mail,2);
    return $mail;
  }
  function pop3_remove($socket,$n) {
    fputs($socket,"DELE $n\r\n");
    $ok = pop3_read($socket);
    if ($ok===FALSE) return FALSE;
    else return TRUE;
  }
  function pop3_reset_removed($socket) {
    fputs($socket,"RSET\r\n");
    $ok = pop3_read($socket);
    if ($ok===FALSE) return FALSE;
    else return TRUE;
  }
  function pop3_get_header($socket,$n,$c = 0) {
    fputs($socket,"TOP $n $c\r\n");
    $header = pop3_read($socket,"\r\n.\r\n");
    return $header;
  }
?>
 
@ agebel
Das mit der pipe hat mich schomal einen Schritt weiter gebracht, danke!

@theton
Wie gesagt:
Der praktische Nutzen des scripts ist hierbei für mich weniger relevant.
Meine Programmierkenntnisse sind noch ganz am Anfang, und da wollte ich einfach mal rumexperimentieren. ;)
"expect" scheint eine gute Idee zu sein. :))

@Schneemann
Code:
So wie es aussieht benutzt du in SMTP_1 auch den gmx-smtp server und der verlangt ein username und ein passwort.
Eigentlich nicht:
telnet> o mail.gmx.net 25
Trying 213.165.64.20...
Connected to mail.gmx.net.
Escape character is '^]'.
220 mail.gmx.net GMX Mailservices ESMTP {mp040}
helo
250 mail.gmx.net GMX Mailservices {mp040}
php kann ich leider nicht, aber vll kann ich ja das ein oder andere nützlich für mich übertragen.
Danke!
 
Hallo
Das geht auch sehr leicht mit perl.

Kleines Beispiel für GMX.
Benötigt werden beide Module:
use Net::SMTP;
use Net::SMTP_auth

Code:
#!/usr/bin/perl -w
use Net::SMTP;
use Net::SMTP_auth;

my $m_host = "mail.gmx.net";
my $m_from = "user\@gmx.ch";
my $m_to = "user\@domain.de";
my $user = "username";
my $passwort = "geheim";

#$smtp = Net::SMTP_auth->new($m_host);
my $smtp = Net::SMTP_auth->new($m_host, Timeout => 30, Debug => 1);
my $ret=$smtp->auth('CRAM-MD5', $user, $passwort);
print "Not succes System $!\n" unless $ret;
if ($ret){
my $ok=$smtp->mail("wolle <$m_from>");
$ok=$smtp->to($m_to);
$smtp->data();
$smtp->datasend("To: $m_to\n");
$smtp->datasend("From: $m_from\n");
$smtp->datasend("Subject: Wolles testmail\n");


$smtp->datasend("\n");
$smtp->datasend("Das ist eine Test MSG\n");
$smtp->datasend(scalar localtime(time));
$smtp->datasend("Tschau wolle\n");


$smtp->dataend();
print "Gesendet\n";
}
$smtp->quit;

Gruß Wolfgang
 

Ähnliche Themen

Shellskript - Fehler in Cron

POP3 daemon kein USER command

Mysql connect Problem

Jaunty + Zend + Gdata + xampp

Fetchmail FC4 und Scalix

Zurück
Oben