Как «отправить» файлы почты postfix / dovecot на новый сервер

В домене был работающий сервер postfix / dovecot. Клиент решил использовать вместо этого zoho и изменил записи MX на zoho. До распространения DNS около сотни электронных писем дошли до исходного сервера.

Итак, внутри /var/mail/vhosts/ravingo.in/rk/new , например ...

] -rw ------- 3 vmail vmail 24128, 12 сентября 09:29 1473672547.M984731P30716.ravingo.ravingo.id, S = 24128, W = 24567 -rw ------- 1 vmail vmail 52287 12 сентября 10:48 1473677302.M251841P31240.ravingo.ravingo.id, S = 52287, W = 53023 -rw ------- 2 vmail vmail 165851, 12 сентября 14:08 1473689331.M885291P32352.ravingo.ravingo.id, S = 165851, W = 168081

Есть ли способ передать эти сообщения Zoho, чтобы они отображались как обычные электронные письма с вложениями и т. Д.?

1
задан 21 September 2016 в 20:04
1 ответ

Поскольку каждый файл в Maildir уже является полным сообщением электронной почты, достаточно просто настроить SMTP-сессию на почтовом сервере Zoho, а затем снова доставить эти сообщения.

Тривиальный бит perl:

#!/usr/bin/perl -w
#
## purpose: send the contents of a Maildir over SMTP
##
## usage:   perl this_program
#
my $MAILDIR = '/home/hbruijn/Maildir/cur/' ;

# The mailserver to deliver the messages to:
my $MAILHOST = 'smtp.example.com' ;

# The email address of the recipient on $MAILHOST:
my $RECIPIENT = 'hbruijn@example.com' ;

# The email address of the sender in the SMTP envelope and the one to receive errors and bounces:
my $SENDER = 'hbruijn@serverfault.com' ;

use Net::SMTP;

foreach my $MESSAGE (glob("$MAILDIR/*")) {
        printf "%s\n", $MESSAGE;
        my $smtp = Net::SMTP->new($MAILHOST);
        $smtp->mail($SENDER);
        if ($smtp->to($RECIPIENT)) {
                $smtp->data();
                open my $fh, "<", $MESSAGE or die "can't read open '$MESSAGE': $OS_ERROR";
                while (<$fh>) {
                        $smtp->datasend($_);
                }
                $smtp->dataend();
                close $fh or die "can't read close '$MESSAGE': $OS_ERROR";
        } else {
                print "Error: ", $smtp->message();
        };
        $smtp->quit;
} 

Вышеуказанное работает, но довольно грубо, может вызвать анти-спам меры и определенно может быть оптимизировано многими способами.

1
ответ дан 3 December 2019 в 23:41

Теги

Похожие вопросы