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

Dietmar Maurer dietmar at proxmox.com
Thu Nov 14 09:51:25 CET 2019


applied
> On 12 November 2019 15:16 Stoiko Ivanov <s.ivanov at proxmox.com> 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;
> -- 
> 2.20.1
> 
> 
> _______________________________________________
> pmg-devel mailing list
> pmg-devel at pve.proxmox.com
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pmg-devel



More information about the pmg-devel mailing list