Linux

Linux中的任何實用程序可以將項目添加到特定郵箱中現有電子郵件的標題中?

  • August 25, 2021

我正在嘗試向特定 mbox 中的現有電子郵件添加額外的標題項,例如

X-archived-to-crm: true,user,CRM-ID

歸檔後,CRM-ID 基本上就是 CRM 數據庫中的 id。

我的 MTA 是 sendmail,不確定這是否重要。

我看了一下郵件,mailx,但不知道該怎麼做。

我已經能夠在互動模式下使用 Mutt 來執行此操作,因此必須有一種方法可以從命令行執行此操作。

任何(命令行)實用程序都可以,它只需要以非互動方式工作。

這可以很容易地完成,perl -i因為 mbox 文件只是純文字。perl 有各種 mbox 操作庫模組,但是像這樣簡單的東西不需要它們。

最大的困難是避免在寫入 mbox 文件的同時寫入其他內容。

下面的腳本使用標準的點鎖方法來避免多個同時寫入同一個 mbox 文件(即使用mboxfilename.lock)。

除了dotlock 之外,它可能還應該進行鎖定和 fcntl 鎖定,以匹配您的郵件傳遞代理 (MDA) 和可能正在編寫 mbox 的其他程序(例如mutt,或其他郵件使用者代理 (MUA))使用的任何鎖定方法, 或類似 or 的郵件傳輸代理 (MTA) postfix,sendmail或 POP 或 IMAP 守護程序)。

我將把它作為練習留給讀者 - 請參閱File::FcntlLockFile::Flock perl 庫模組(也有幾個類似的模組具有相同事物的不同實現,這些只是我發現的第一個)。您可以使用apt-get install libfile-flock-perl libfile-fcntllock-perl. 其他發行版可能已經打包了它們或類似的模組。否則,安裝cpan.

#!/usr/bin/perl -i.bak
#!/usr/bin/perl -i
# delete the first #! line if you don't want perl -i to create a .bak copy

use strict;
use Getopt::Std;

my %opts;
getopts('m:i:u:h', \%opts);

if ($opts{h}) {
 print "$0 <-m messsage-id> <-u user> <-i crmid> [mbox file...]\n";
 exit 1;
};

my $msgid = $opts{m} //  die "-m messsage-id is required\n";
my $user  = $opts{u} //  die "-u user is required\n";
my $crmid = $opts{i} //  die "-i crmid is required\n";

# I don't want to implement my own -i, so I'll just iterate
# over each file on @ARGV one at a time
my @files = @ARGV;

foreach my $mbox (@files) {

 # if the mbox is locked, then wait until it isn't.
 while (-e "$mbox.lock") {
   print "$mbox is locked!\n";
   sleep 1;
 };

 # lock it
 open(my $touch, ">", "$mbox.lock") || die "couldn't lock $mbox: $!\n";
 close($touch);

 @ARGV=($mbox);
 while (<>) {
   print;
   # case-insensitive match for "Message-ID" literal string,
   # case-sensitive for actual $msgid
   if (m/^(?:(?i)Message-ID:) <$msgid>/) {
     print "X-archived-to-crm: true,$user,$crmid\n"
   };
 };

 # remove the lock
 unlink "$mbox.lock";
}

給定以下 mbox 文件:

From cas@example.org  Mon Aug 23 16:04:42 2021
Return-Path: <cas@example.org>
X-Original-To: cas@example.org
Delivered-To: cas@example.org
Received: by example.org (Postfix, from userid 1000)
       id 6B1DE3F2C; Mon, 23 Aug 2021 16:04:42 +1000 (AEST)
Date: Mon, 23 Aug 2021 16:04:42 +1000
From: Craig Sanders <cas@example.org>
To: Craig Sanders <cas@example.org>
Subject: test
Message-ID: <YSM6eiyrpvNKgxex@example.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Length: 56
Lines: 6

test messsage

craig

--
craig sanders <cas@example.org>

執行以下命令:

$ ./insert-header.pl -m 'YSM6eiyrpvNKgxex@example.org' -i 99999 -u cas test.mbox

導致 mbox 文件更改為:

From cas@example.org  Mon Aug 23 16:04:42 2021
Return-Path: <cas@example.org>
X-Original-To: cas@example.org
Delivered-To: cas@example.org
Received: by example.org (Postfix, from userid 1000)
       id 6B1DE3F2C; Mon, 23 Aug 2021 16:04:42 +1000 (AEST)
Date: Mon, 23 Aug 2021 16:04:42 +1000
From: Craig Sanders <cas@example.org>
To: Craig Sanders <cas@example.org>
Subject: test
Message-ID: <YSM6eiyrpvNKgxex@example.org>
X-archived-to-crm: true,cas,99999
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Length: 56
Lines: 6

test messsage

craig

--
craig sanders <cas@example.org>

順便說一句,我還在我的主 mbox 的副本上對此進行了測試:

$ ./insert-header.pl -m '.*' -i 99999 -u cas main.mbox

它在 mbox 中的每條消息中都插入了相同的X-archived-to-crm標題。

引用自:https://unix.stackexchange.com/questions/665804