Изменить идентификатор сообщения в sendmail
Мы определили, что часть внешнего программного обеспечения генерирует электронные письма с тем же Message-ID
поле. Это программное обеспечение использует sendmail
выполнить фактическую отправку.
Поскольку нам не очень легко изменить это внешнее программное обеспечение, чтобы исправить ошибку, я хотел бы знать, возможно ли сделать sendmail
игнорировать данное Message-ID
и создать новый?
EXTRA-INFO:
Я нашел документацию, подтверждающую мои опасения:
Флаги заголовка контролируют только вставку заголовка. Если заголовок получен на входе, он передается на выход независимо от настроек флага.
См. Http://docstore.mik.ua/orelly/networking/tcpip/ch10_05.htm, раздел 10.5.7 Определение почтовых заголовков.
1 ответ
Если вы открыты для использования другого MTA или хотя бы промежуточного MTA, взгляните на qpsmtpd. В настоящее время я использую qpsmtpd для преобразования входящих электронных писем с uuencoded из некоторых старых приложений, которые мы используем, в MIME.
Вот то, что я использую, это модифицированная версия плагина tnef2mime (поэтому, пожалуйста, не обращайте внимания на любые дополнительные ошибки и ссылки на tnef2mime). это можно легко изменить, чтобы удалить существующий заголовок идентификатора сообщения и добавить новый.
#!/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;
}