]>
git.proxmox.com Git - pmg-api.git/blob - PMG/SMTP.pm
12 my($this, $sock) = @_;
14 my $class = ref($this) || $this;
16 die("undefined socket: ERROR") if !defined($sock);
19 $self->{sock
} = $sock;
20 $self->{lmtp
} = undef;
25 $self->reply ("220 Proxmox SMTP Ready.");
32 $self->{from
} = undef;
34 $self->{queue
} = undef;
35 delete $self->{xforward
};
36 delete $self->{status
};
40 shift-
>{sock
}->close();
44 print {shift-
>{sock
}} @_, "\r\n";;
49 my ($self, $func, $data, $maxcount) = @_;
53 my $sock = $self->{sock
};
63 $self->reply ("500 5.5.1 Error: bad syntax");
66 ($cmd, $args) = split(/\s+/, $_, 2);
69 if ($cmd eq 'helo' || $cmd eq 'ehlo' || $cmd eq 'lhlo') {
72 $self->reply ("250-PIPELINING");
73 $self->reply ("250-ENHANCEDSTATUSCODES");
74 $self->reply ("250-8BITMIME");
75 $self->reply ("250-XFORWARD NAME ADDR PROTO HELO");
76 $self->reply ("250 OK.");
77 $self->{lmtp
} = 1 if ($cmd eq 'lhlo');
79 } elsif ($cmd eq 'xforward') {
80 my @tmp = split (/\s+/, $args);
81 foreach my $attr (@tmp) {
82 my ($n, $v) = ($attr =~ /^(.*?)=(.*)$/);
83 $self->{xforward
}->{lc($n)} = $v;
85 $self->reply ("250 2.5.0 OK");
87 } elsif ($cmd eq 'noop') {
88 $self->reply ("250 2.5.0 OK");
90 } elsif ($cmd eq 'quit') {
91 $self->reply ("221 2.2.0 OK");
93 } elsif ($cmd eq 'rset') {
95 $self->reply ("250 2.5.0 OK");
97 } elsif ($cmd eq 'mail') {
98 if ($args =~ m/^from:\s*<([^\s\>]*)>[^>]*$/i) {
101 $self->reply ('250 2.5.0 OK');
104 $self->reply ("501 5.5.2 Syntax: MAIL FROM: <address>");
107 } elsif ($cmd eq 'rcpt') {
108 if ($args =~ m/^to:\s*<([^\s\>]+)>[^>]*$/i) {
109 push @{$self->{to
}} , $1;
110 $self->reply ('250 2.5.0 OK');
113 $self->reply ("501 5.5.2 Syntax: RCPT TO: <address>");
116 } elsif ($cmd eq 'data') {
117 if ($self->save_data ()) {
118 eval { &$func ($data, $self); };
121 syslog
('err', $err);
125 foreach $a (@{$self->{to
}}) {
126 if ($self->{queue
}->{status
}->{$a} eq 'delivered') {
127 $self->reply ("250 2.5.0 OK ($self->{queue}->{logid})");
128 } elsif ($self->{queue
}->{status
}->{$a} eq 'blocked') {
129 $self->reply ("250 2.7.0 BLOCKED ($self->{queue}->{logid})");
130 } elsif ($self->{queue
}->{status
}->{$a} eq 'error') {
131 my $code = $self->{queue
}->{status_code
}->{$a};
132 my $resp = substr($code, 0, 1);
133 my $mess = $self->{queue
}->{status_message
}->{$a};
134 $self->reply ("$code $resp.0.0 $mess");
136 $self->reply ("451 4.4.0 detected undelivered mail to <$a>");
142 foreach $a (@{$self->{to
}}) {
143 if (!($self->{queue
}->{status
}->{$a} eq 'delivered' ||
144 $self->{queue
}->{status
}->{$a} eq 'blocked')) {
149 $self->reply ("250 2.5.0 OK ($self->{queue}->{logid})");
151 $self->reply ("451 4.4.0 detected undelivered mail");
159 last if $count >= $maxcount;
160 last if $data->{errors
}; # abort if we find errors
164 $self->reply ("500 5.5.1 Error: unknown command");
167 $self->{sock
}->close;
175 if(!defined($self->{from
})) {
176 $self->reply ("503 5.5.1 Tell me who you are.");
180 if(!defined($self->{to
})) {
181 $self->reply ("503 5.5.1 Tell me who to send it.");
185 $self->reply ("354 End data with <CR><LF>.<CR><LF>");
187 my $sock = $self->{sock
};
192 $queue = PMG
::MailQueue-
>new ($self->{from
}, $self->{to
});
201 # RFC 2821 compliance.
206 print {$queue->{fh
}} $_;
207 $queue->{bytes
} += length ($_);
210 $queue->{fh
}->flush ();
212 $self->{queue
} = $queue;
215 syslog
('err', $err);
216 $self->reply ("451 4.5.0 Local delivery failed: $err");
219 if(!defined($done)) {
220 $self->reply ("451 4.5.0 Local delivery failed: unfinished data");