【问题标题】:Parse text file data to send a mail in perl解析文本文件数据以在 perl 中发送邮件
【发布时间】:2019-02-04 20:46:07
【问题描述】:

我是 PERL 新手。我想创建一个 PERL 脚本,该脚本可以通过从桌面上的输入文件中获取所有必填字段来发送邮件,并可以相应地向邮件列表中的每个人(以逗号分隔)发送邮件。我的输入数据文件内容如下:

  • 收件人包含在 TO 和 ENDTO 标签之间。
  • 邮件主题包含在 SUBJECT 和 ENDSUBJECT 之间。
  • 邮件正文包含在 BODY 和 ENDBODY 之间。

样本数据文件:


rahul@example.com,you@everyone.com
ENDTO

主题
WW-5 的每周状态快照
结束主题

身体
大家好, 本周的每周进度快照将在 1 月 30 日星期四当天结束时拍摄。 (请在快照之前更新您的状态)
使用工作周数作为本周更新的 5。
注意:如果您希望从工作表中提取(或删除)任何其他数据,请与我合作,以便可以更新状态整理脚本来执行此操作。
谢谢,
-拉姆
尾端

  • 到目前为止,我使用的代码从两个不同的文件(“message.txt”和“recipients.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); 



【问题讨论】:

  • 你帖子里的问题在哪里?
  • 没有没有“PERL”。 Perl 是语言; perl 是解释器的名称。

标签: perl


【解决方案1】:

这个怎么样?

实现方法的要点:使用.. 双稳态运算符和定义开始和结束条件的正则表达式。

#!/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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2013-12-20
    • 2015-06-15
    • 2014-09-04
    • 1970-01-01
    • 2012-10-25
    • 2015-01-20
    相关资源
    最近更新 更多