]>
git.proxmox.com Git - pmg-api.git/blob - PMG/SMTP.pm
6 use Proxmox
::SafeSyslog
;
7 use Proxmox
::MailQueue
;
12 my($this, $sock) = @_;
14 my $class = ref($this) || $this;
16 croak
("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
};
56 my $lic = Proxmox
::License-
>new ();
57 if (!$lic->valid || $lic->expired_trial) {
69 $self->reply ("500 5.5.1 Error: bad syntax");
72 ($cmd, $args) = split(/\s+/, $_, 2);
75 if ($cmd eq 'helo' || $cmd eq 'ehlo' || $cmd eq 'lhlo') {
79 $self->reply ("500 5.5.1 Error: No valid License");
83 $self->reply ("250-PIPELINING");
84 $self->reply ("250-ENHANCEDSTATUSCODES");
85 $self->reply ("250-8BITMIME");
86 $self->reply ("250-XFORWARD NAME ADDR PROTO HELO");
87 $self->reply ("250 OK.");
88 $self->{lmtp
} = 1 if ($cmd eq 'lhlo');
90 } elsif ($cmd eq 'xforward') {
91 my @tmp = split (/\s+/, $args);
92 foreach my $attr (@tmp) {
93 my ($n, $v) = ($attr =~ /^(.*?)=(.*)$/);
94 $self->{xforward
}->{lc($n)} = $v;
96 $self->reply ("250 2.5.0 OK");
98 } elsif ($cmd eq 'noop') {
99 $self->reply ("250 2.5.0 OK");
101 } elsif ($cmd eq 'quit') {
102 $self->reply ("221 2.2.0 OK");
104 } elsif ($cmd eq 'rset') {
106 $self->reply ("250 2.5.0 OK");
108 } elsif ($cmd eq 'mail') {
109 if ($args =~ m/^from:\s*<(\S*)>/i) {
112 $self->reply ('250 2.5.0 OK');
115 $self->reply ("501 5.5.2 Syntax: MAIL FROM: <address>");
118 } elsif ($cmd eq 'rcpt') {
119 if ($args =~ m/^to:\s*<(\S+)>/i) {
120 push @{$self->{to
}} , $1;
121 $self->reply ('250 2.5.0 OK');
124 $self->reply ("501 5.5.2 Syntax: MAIL FROM: <address>");
127 } elsif ($cmd eq 'data') {
128 if ($self->save_data ()) {
129 eval { &$func ($data, $self); };
136 foreach $a (@{$self->{to
}}) {
137 if ($self->{queue
}->{status
}->{$a} eq 'delivered') {
138 $self->reply ("250 2.5.0 OK ($self->{queue}->{logid})");
139 } elsif ($self->{queue
}->{status
}->{$a} eq 'blocked') {
140 $self->reply ("250 2.7.0 BLOCKED ($self->{queue}->{logid})");
141 } elsif ($self->{queue
}->{status
}->{$a} eq 'error') {
142 my $code = $self->{queue
}->{status_code
}->{$a};
143 my $resp = substr($code, 0, 1);
144 my $mess = $self->{queue
}->{status_message
}->{$a};
145 $self->reply ("$code $resp.0.0 $mess");
147 $self->reply ("451 4.4.0 detected undelivered mail to <$a>");
153 foreach $a (@{$self->{to
}}) {
154 if (!($self->{queue
}->{status
}->{$a} eq 'delivered' ||
155 $self->{queue
}->{status
}->{$a} eq 'blocked')) {
160 $self->reply ("250 2.5.0 OK ($self->{queue}->{logid})");
162 $self->reply ("451 4.4.0 detected undelivered mail");
170 last if $count >= $maxcount;
171 last if $data->{errors
}; # abort if we find errors
175 $self->reply ("500 5.5.1 Error: unknown command");
178 $self->{sock
}->close;
186 if(!defined($self->{from
})) {
187 $self->reply ("503 5.5.1 Tell me who you are.");
191 if(!defined($self->{to
})) {
192 $self->reply ("503 5.5.1 Tell me who to send it.");
196 $self->reply ("354 End data with <CR><LF>.<CR><LF>");
198 my $sock = $self->{sock
};
203 $queue = Proxmox
::MailQueue-
>new ($self->{from
}, $self->{to
});
212 # RFC 2821 compliance.
217 print {$queue->{fh
}} $_;
218 $queue->{bytes
} += length ($_);
221 $queue->{fh
}->flush ();
223 $self->{queue
} = $queue;
228 $self->reply ("451 4.5.0 Local delivery failed: $@");
231 if(!defined($done)) {
232 $self->reply ("451 4.5.0 Local delivery failed: unfinished data");