Thread EMails empfangen und weiterverarbeiten (15 answers)
Opened by Gustl at 2013-05-06 13:43

Gustl
 2013-05-21 13:21
#167715 #167715
User since
2011-01-27
441 Artikel
BenutzerIn
[Homepage]
user image
Danke, werde ich in Zukunft beherzigen.

Folgende Testskripte habe ich erstellt:
mail_server.pl:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/perl
use warnings;
use strict;

use IO::Socket::INET;
use Net::Server::Mail::SMTP;

#our $host = $ARGV[0] || "157.163.168.131" ;
$| = 1;
 
my @local_domains = qw(example.com example.org);
my $server = IO::Socket::INET->new(Listen => 1, LocalPort => 25);
 
print "Waiting for incoming SMTP connections\n";
my $conn;
while($conn = $server->accept)
{
    my $smtp = Net::Server::Mail::SMTP->new(socket => $conn);
    $smtp->set_callback(RCPT => \&validate_recipient);
    $smtp->set_callback(DATA => \&queue_message);
    $smtp->process() or die $!;
    $conn->close();
}
 
sub validate_recipient
{
    my($session, $recipient) = @_;
 
    my $domain;
    if($recipient =~ /@(.*)>\s*$/)
    {
        $domain = $1;
    }
 
    if(not defined $domain)
    {
        return(0, 513, 'Syntax error.');
    }
    elsif(not(grep $domain eq $_, @local_domains))
    {
        return(0, 554, "$recipient: Recipient address rejected: Relay access denied");
    }
 
    return(1);
}
 
sub queue_message
{
    my($session, $data) = @_;
 
    my $sender = $session->get_sender();
    my @recipients = $session->get_recipients();
 
    return(0, 554, 'Error: no valid recipients')
        unless(@recipients);
 
    my $msgid = add_queue($sender, \@recipients, $data)
      or return(0);
 
    return(1, 250, "message queued $msgid");
}


und sendmail.pl:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/perl -w

use strict;
use MIME::Lite;

# EMail verfassen
my $mailfrom = 'name@email.de';
my $mailto   = 'name@email.de';
my $subject  = "TEST_SUBJECT";
my $mailtext ="TEST";


#E-Mail versenden:
my $msg = MIME::Lite->new(
         From    => $mailfrom,
         To      => $mailto,
         Subject => $subject,
         Type    => "multipart/related"
    );
$msg->attach(
        Type => "text/html",
        Data => $mailtext,
    );   
    
$msg->send("smtp", "157.163.168.131");      #or die ...
#mail.dc4ca.siemens.de
       
print "Email von $mailfrom an $mailto gesendet!";


Wenn ich nun mail_server.pl starte hört er ja quasi auf den Port 25.
nun Schicke ich die Test emial mit sendmail.pl.
Daraufhin kommt eine meldung von perl.exe: perl.exe funktioniert nicht mehr -> Programm schließen.
mail_server.pl beendet sich dann ohne Fehlermeldung und bei sendmail.pl:
Quote
SMTP Failed to connect to mail server: Bad file descriptor at line 25


Wenn eine Mail kommt, quasi $server->accept, habe ich ein Problem bei $smtp->process() in mail_server.pl... Wie kann ich das beheben?

View full thread EMails empfangen und weiterverarbeiten