From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 5C2351FF15C for ; Fri, 19 Sep 2025 16:51:09 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 6F1A319DA5; Fri, 19 Sep 2025 16:51:25 +0200 (CEST) From: Hannes Laimer To: pmg-devel@lists.proxmox.com Date: Fri, 19 Sep 2025 16:50:48 +0200 Message-ID: <20250919145049.20077-2-h.laimer@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250919145049.20077-1-h.laimer@proxmox.com> References: <20250919145049.20077-1-h.laimer@proxmox.com> MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1758293442081 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.042 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [postfix.pm] Subject: [pmg-devel] [PATCH pmg-api 1/1] fix #3450: api: add 'filter' parameter to queue DELETE endpoint X-BeenThere: pmg-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Mail Gateway development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pmg-devel-bounces@lists.proxmox.com Sender: "pmg-devel" This allows to delete all mails in the queue which have a sender/recipient that matches the passed filter. Signed-off-by: Hannes Laimer --- src/PMG/API2/Postfix.pm | 14 ++++++++++++-- src/PMG/Postfix.pm | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/PMG/API2/Postfix.pm b/src/PMG/API2/Postfix.pm index ba0689c..31f7449 100644 --- a/src/PMG/API2/Postfix.pm +++ b/src/PMG/API2/Postfix.pm @@ -339,7 +339,7 @@ __PACKAGE__->register_method({ name => 'delete_queue', path => 'queue/{queue}', method => 'DELETE', - description => "Delete all mails in the queue.", + description => "Delete all mails in the queue, or only those matching an optional filter.", proxyto => 'node', permissions => { check => ['admin'] }, protected => 1, @@ -348,13 +348,23 @@ __PACKAGE__->register_method({ properties => { node => get_standard_option('pve-node'), queue => $queue_name_option, + filter => { + description => "Filter string (matches sender and recipients).", + type => 'string', + maxLength => 64, + optional => 1, + }, }, }, returns => { type => 'null' }, code => sub { my ($param) = @_; - PMG::Postfix::delete_queue($param->{queue}); + if (defined($param->{filter}) && $param->{filter} ne '') { + PMG::Postfix::delete_queue_filtered($param->{queue}, $param->{filter}); + } else { + PMG::Postfix::delete_queue($param->{queue}); + } return undef; }, diff --git a/src/PMG/Postfix.pm b/src/PMG/Postfix.pm index 966130f..7c7869e 100644 --- a/src/PMG/Postfix.pm +++ b/src/PMG/Postfix.pm @@ -221,6 +221,46 @@ sub delete_queue { PVE::Tools::run_command($cmd); } +# delete mails in a queue matching a sender/recipient filter +sub delete_queue_filtered { + my ($queue, $filter) = @_; + + die "no filter specified\n" if !defined($filter) || $filter eq ''; + + open(my $fh, '-|', '/usr/sbin/postqueue', '-j') || die "ERROR: unable to run postqueue - $!\n"; + + my %seen; + my @queue_ids; + my $line; + while (defined($line = <$fh>)) { + my $rec = decode_json($line); + next if $rec->{queue_name} ne $queue; + + my $match = 0; + my $sender = $rec->{sender} // ''; + if ($sender =~ m/$filter/i) { + $match = 1; + } else { + my $recipients = $rec->{recipients} // []; + foreach my $entry (@$recipients) { + if (($entry->{address} // '') =~ m/$filter/i) { $match = 1; last; } + } + } + + next if !$match; + + my $qid = $rec->{queue_id}; + next if !$qid || $seen{$qid}++; + push @queue_ids, $qid; + } + + return if !@queue_ids; + + my $input = join("\n", @queue_ids) . "\n"; + my $cmd = ['/usr/sbin/postsuper', '-d', '-', $queue]; + PVE::Tools::run_command($cmd, input => $input); +} + sub discard_verify_cache { unlink "/var/lib/postfix/verify_cache.db"; -- 2.47.3 _______________________________________________ pmg-devel mailing list pmg-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pmg-devel