Разбор данных текстового файла для отправки почты в perl - PullRequest
0 голосов
/ 04 февраля 2019

Я новичок в PERL.Я хочу создать сценарий PERL, который мог бы отправлять почту, беря все необходимые поля из входного файла, присутствующего на рабочем столе, и может отправлять почту всем в списке рассылки (разделенных запятой) соответственно.Содержимое моего файла входных данных выглядит следующим образом:

  • Получатели заключены в теги TO & ENDTO.
  • Тема письма заключена в объект SUBJECT & ENDSUBJECT.
  • Тело почты заключено между BODY & ENDBODY.

Пример файла данных:

TO
rahul @ example.com, you @ Everyone.com
ENDTO

SUBJECT
Недельный снимок состояния для WW-5
ENDSUBJECT

BODY
Hi All, Недельный снимок прогресса за эту неделю будет сделан в четверг, 30 января, вконец дня.(Пожалуйста, обновите свой статус перед моментальным снимком)
Используйте номер рабочей недели как 5 для обновлений этой недели.
Примечание. Если вы хотите, чтобы с ваших листов были собраны (или удалены) какие-либо дополнительные данные, поработайте со мной, чтобы можно было обновить скрипт сопоставления состояния.
Спасибо,
-Ram
ENDBODY

  • До сих пор я использую код, который получает входные данные от двух разных файлов (получателей "message.txt" & ".txt ") и отправляет почту соответственно.Но теперь я хочу проанализировать данные из одного файла, разделенного полями тегов для получателей, тела и темы.
    $mailprog = "/usr/sbin/sendmail";

    my $file1 = 'message';
    open my $ifh1, '<', $file1;
    local $/ = undef;
    my $contents = $ifh1;

    my $file2 = 'recipients';
    open my $ifh2, '<', $file2;
    local $/ = undef;
    my $recip = $ifh2; 

    close( $ifh2 );
    close( $ifh1 );

    $subject= "Weekly status snapshot for WW-3";
    open(MAIL, "|$mailprog -t");
    print MAIL "To: $recip \n";
    print MAIL "bcc: rahul.agarwal\@everyone.com\n";
    print MAIL "From: rahul.agarwal\@everyone.com\n";
    print MAIL "Subject: $subject\n\n";
    print MAIL "$contents";
    close(MAIL); 



1 Ответ

0 голосов
/ 04 февраля 2019

Как насчет этого?

Суть подхода к реализации: используйте .. бистабильный оператор с регулярными выражениями, определяющими начальное и конечное условия.

#!/usr/bin/perl
use strict;
use warnings;

# Generate regexes for section keywords
my @sections = qw(TO SUBJECT BODY);
my %keywords = map {
    (
     "$_"    => qr/^$_$/,
     "END$_" => qr/^END$_$/
    )} @sections;

my($to, $subject, @body);
while (<STDIN>) {
    chomp;
    if      (/$keywords{TO}/../$keywords{ENDTO}/) {
        # skip keyword lines
        next if /$keywords{TO}|$keywords{ENDTO}/;
        $to = $_;
    } elsif  (/$keywords{SUBJECT}/../$keywords{ENDSUBJECT}/) {
        # skip keyword lines
        next if /$keywords{SUBJECT}|$keywords{ENDSUBJECT}/;
        $subject = $_;
    } elsif  (/$keywords{BODY}/../$keywords{ENDBODY}/) {
        if      (/$keywords{BODY}/) {
            # skip keyword line
        } elsif (/$keywords{ENDBODY}/) {
            # mail is done... send it
            print "To: ${to}\n";
            print "Bcc: rahul.agarwal\@everyone.com\n";
            print "From: rahul.agarwal\@everyone.com\n";
            print "Subject: ${subject}\n";
            print "\n";
            print "$_\n" foreach (@body);
        } else {
            # body text line
            push(@body, $_);
        }
    }
}

exit 0;

Вывод с вашим тестовым примером:

# add "| /usr/sbin/sendmail -t" after command to actually send it...
$ perl dummy.pl <dummy.txt
To: rahul@example.com,you@everyone.com
Bcc: rahul.agarwal@everyone.com
From: rahul.agarwal@everyone.com
Subject: Weekly status snapshot for WW-5

Hi All, Weekly progress snapshot for this week will be taken on Thursday, 30 Jan at the end of the day. ( Please update your status before the snapshot)
Use work week number as 5 for this week's updates .
Note : If you want any additional data to be picked up ( or dropped ) from your sheets, do work with me so that status collation script can be updated to do this .
Thanks ,
-Ram
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...