Как я могу удалить HTML и вложения из электронных писем? - PullRequest
1 голос
/ 16 декабря 2008

Я использую программу ниже, чтобы сортировать и в конечном итоге распечатывать сообщения электронной почты. Некоторые сообщения могут содержать вложения или HTML-код, который не подходит для печати. Есть ли простой способ вырезать вложения и вырезать HTML, но не текст, отформатированный в сообщениях HTML?

#!/usr/bin/perl
use warnings;
use strict;
use Mail::Box::Manager;

open (MYFILE, '>>data.txt');
binmode(MYFILE, ':encoding(UTF-8)');


my $file = shift || $ENV{MAIL};
my $mgr = Mail::Box::Manager->new(
    access          => 'r',
);

my $folder = $mgr->open( folder => $file )
or die "$file: Unable to open: $!\n";

for my $msg ( sort { $a->timestamp <=> $b->timestamp } $folder->messages)
{
    my $to          = join( ', ', map { $_->format } $msg->to );
    my $from        = join( ', ', map { $_->format } $msg->from );
    my $date        = localtime( $msg->timestamp );
    my $subject     = $msg->subject;
    my $body        = $msg->decoded->string;

    # Strip all quoted text
    $body =~ s/^>.*$//msg;

    print MYFILE <<"";
From: $from
To: $to
Date: $date
Subject: $subject
\n
$body

}

Ответы [ 4 ]

3 голосов
/ 16 декабря 2008

Mail::Message::isMultipart сообщит вам, есть ли у данного сообщения какие-либо вложения. Mail::Message::parts выдаст вам список почтовых отправлений.

Таким образом:

if ( $msg->isMultipart ) {
    foreach my $part ( $msg->parts ) {
        if ( $part->contentType eq 'text/html' ) {
           # deal with html here.
        }
        elsif ( $part->contentType eq 'text/plain' ) {
           # deal with text here.
        }
        else {
           # well?
        }
    }
}
1 голос
/ 16 декабря 2008

Аспект HTML-разборки объясняется в FAQ # 9 (или в первом элементе из perldoc -q html). Вкратце, соответствующими модулями являются HTML :: Parser и HTML :: FormatText.

Что касается вложений, то электронные письма с вложениями отправляются как MIME. Из этого примера вы можете видеть, что формат достаточно прост, чтобы вы могли довольно легко найти решение, или изучить модули MIME на CPAN .

0 голосов
/ 27 ноября 2014

вы получили полный пример в perl Mail-Box-2.117:

http://cpansearch.perl.org/src/MARKOV/Mail-Box-2.117/examples/strip-attachments.pl

0 голосов
/ 16 декабря 2008

Похоже, кто-то уже решил это на форуме linuxquestions .

С форума:

            # This is part of Mail::POP3Client to get the headers and body of the POP3 mail in question
            $body = $connection->HeadAndBody($i);
            # Parse the message with MIME::Parser, declare the body as an entitty
            $msg = $parser->parse_data($body);
            # Find out if this is a multipart MIME message or just a plaintext
            $num_parts=$msg->parts;
            # So its its got 0 parts i.e. is a plaintext
            if ($num_parts eq 0) {
            # Get the message by POP3Client
            $message = $connection->Body($i);
            # Use this series of regular expressions to verify that its ok for MySQL
            $message =~ s/</&lt;/g;
            $message =~ s/>/&gt;/g;
            $message =~ s/'//g;
                                  }
            else {
                  # If it is MIME the parse the first part (the plaintext) into a string
                 $message = $msg->parts(0)->bodyhandle->as_string;
                  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...