我们已经确定一个外部软件生成具有相同的Message-ID字段的电子邮件。 这个软件使用sendmail来执行实际的发送。
由于我们不太容易修改这个外部软件来修复这个bug,我想知道是否可以让sendmail忽略给定的Message-ID并生成一个新的?
EXTRA-INFO:
我发现了一些certificate我的恐惧的文件:
标题仅标记控制标题插入。 如果在input中接收到标题,则将其传递到输出,而不pipe标志设置如何。
请参阅http://docstore.mik.ua/orelly/networking/tcpip/ch10_05.htm ,第10.5.7节定义邮件头
如果您打算使用不同的MTA或至less是一个中间MTA,请查看qpsmtpd。 我目前使用qpsmtpd将传入的uuencoded电子邮件从我们使用的一些旧版应用程序转换为MIME。
这里是我使用的,这是tnef2mime插件的修改版本(所以请忽略任何额外的cruft和引用tnef2mime)。 这可以很容易地修改,以删除现有的消息ID头,并添加一个新的。
#!/usr/bin/perl -wT use MIME::Parser; use MIME::Entity; use MIME::Head; use File::MMagic; use Convert::TNEF; my $parser; my $ent; my $tmpdir='/var/spool/qpsmtpd'; my $count=0; my $foundtnef=0; my (@attachments, @blocked, @tnefs); sub register { my ($self, $qp, %arg) = @_; $self->register_hook("data_post", "tnef2mime"); } sub tnef2mime ( $$ ) { my ($self, $transaction) = @_; # new Parser Object $parser = new MIME::Parser; # temp output directory $parser->output_under( $tmpdir ); $parser->extract_uuencode(1); # read message body open BFN, $transaction->body_filename(); $ent = $parser->parse(\*BFN); close BFN; my $founduu = $ent->parts && !$transaction->header->get('MIME-Version'); if( $founduu ) { $transaction->header->add('MIME-Version', "1.0" ); my $xac = "UUENCODE -> MIME"; $self->log(LOGDEBUG, "uuencoded attachment converted to MIME" ); $transaction->header->add('X-TNEF2MIME-Plugin', $xac ); # fix content-type header $transaction->header->delete('Content-Type'); $transaction->header->add('Content-Type', $ent->head->get('Content-Type')); # write converted message body open BFN, ">" . $transaction->body_filename(); $ent->print(\*BFN); close BFN; } my $output_dir = $parser->output_dir; opendir( DIR, $output_dir ) or die "Could not open temporary output dir $output_dir: $!\n"; while( defined( my $file = readdir( DIR ) ) ) { next if $file =~ /^\.\.?$/; $file =~ s/(^.*$)//; $file = $1; unlink( "$output_dir/$file" ); } closedir( DIR ); rmdir( $output_dir ); return DECLINED; }