[pmg-devel] [RFC pmg-api 3/4] add generate_ndr to PMG::SMTP

Mira Limbeck m.limbeck at proxmox.com
Tue Nov 12 16:25:41 CET 2019


s/recepients/recipients/ in the commit message and the syslog() calls

On 11/12/19 3:16 PM, Stoiko Ivanov wrote:
> In order to selectively accept and reject mails when multiple recepients
> are present for a mail, without silently dropping mails to certain recepients
> the sender needs to be informed about those recepients which did not receive
> the mail (via a non-delivery report - NDR).
>
> The format of delivery status notifications (of which an ndr is a subset) is
> specified in RFC 6522 [0]. The format for the 'message/delivery-status'
> MIME-Type is specified in RFC 6533 [1]
>
> The message text was adapted from Postfix' default bounce-messages, however
> we do not attach the original mail to the report. This is acceptable by [0]
> and makes sense (not sending mail, which is likely spam or a virus, back to the
> (potentially faked) sender).
>
> [0] https://tools.ietf.org/html/rfc6522
> [1] https://tools.ietf.org/html/rfc6533
>
> Signed-off-by: Stoiko Ivanov <s.ivanov at proxmox.com>
> ---
>   src/PMG/SMTP.pm | 61 +++++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 61 insertions(+)
>
> diff --git a/src/PMG/SMTP.pm b/src/PMG/SMTP.pm
> index a2a6c48..b311265 100644
> --- a/src/PMG/SMTP.pm
> +++ b/src/PMG/SMTP.pm
> @@ -4,10 +4,12 @@ use strict;
>   use warnings;
>   use IO::Socket;
>   use Encode;
> +use MIME::Entity;
>   
>   use PVE::SafeSyslog;
>   
>   use PMG::MailQueue;
> +use PMG::Utils;
>   
>   sub new {
>       my($this, $sock) = @_;
> @@ -233,4 +235,63 @@ sub save_data {
>       return 1;
>   }
>   
> +sub generate_ndr {
> +    my ($sender, $receivers, $hostname, $queueid) = @_;
> +
> +    my $ndr_text = <<EOF
> +This is the mail system at host $hostname.
> +
> +I'm sorry to have to inform you that your message could not
> +be delivered to one or more recipients.
> +
> +For further assistance, please send mail to postmaster.
> +
> +If you do so, please include this problem report.
> +                   The mail system
> +
> +554 5.7.1 Recipient address(es) rejected for policy reasons
> +EOF
> +;
> +    my $ndr = MIME::Entity->build(
> +	Type => 'multipart/report; report-type=delivery-status;',
> +	To => $sender,
> +	From => 'postmaster',
> +	Subject => 'Undelivered Mail');
> +
> +    $ndr->attach(
> +	Data => $ndr_text,
> +	Type => 'text/plain; charset=utf-8',
> +	Encoding => '8bit');
> +
> +    my $delivery_status = <<EOF
> +Reporting-MTA: dns; $hostname
> +X-Proxmox-Queue-ID: $queueid
> +X-Proxmox-Sender: rfc822; $sender
> +EOF
> +;
> +    foreach my $rec (@$receivers) {
> +	$delivery_status .= <<EOF
> +Final-Recipient: rfc822; $rec
> +Original-Recipient: rfc822;$rec
> +Action: failed
> +Status: 5.7.1
> +Diagnostic-Code: smtp; 554 5.7.1 Recipient address rejected for policy reasons
> +
> +EOF
> +;
> +    }
> +    $ndr->attach(
> +	Data => $delivery_status,
> +	Type => 'message/delivery-status',
> +	Encoding => '7bit',
> +	Description => 'Delivery report');
> +
> +    my $qid = PMG::Utils::reinject_mail($ndr, '', [$sender], undef, $hostname);
> +    if ($qid) {
> +	syslog('info', "sent NDR for rejecting recepients - $qid");
> +    } else {
> +	syslog('err', "sending NDR for rejecting recepients failed");
> +    }
> +}
> +
>   1;



More information about the pmg-devel mailing list