Как я могу отправить содержимое файла по электронной почте в Perl? - PullRequest
5 голосов
/ 25 августа 2009

У меня есть журнал, который создается из нескольких заданий cron. Теперь моя задача - отправлять конкретные журналы (например, сообщения об ошибках) в виде электронной почты. Каков наилучший способ получить содержимое из файла и отправить его по электронной почте?

Я уже понял, как отправлять электронную почту в Perl. Мне просто нужно выяснить, как читать файл и поместить его в текст письма.

Ответы [ 6 ]

11 голосов
/ 25 августа 2009

Я использую MIME :: Lite , это скрипт cron, который я использую для своих ночных резервных копий:

$msg = MIME::Lite->new(
  From    => 'backup-bot@mydomain.com',
  To      => 'test@example.com',
  Bcc     => 'test@example.com',
  Subject => "DB.tgz Nightly MySQL backup!",
  Type    => "text/plain",
  Data    => "Your backup sir.");

$msg->attach(Type=> "application/x-tar",
             Path =>"/var/some/folder/DB_Dump/DB.tgz",
             Filename =>"DB.tgz");

$msg->send;
4 голосов
/ 25 августа 2009

Что вы используете для отправки электронной почты? Я использую MIME :: Lite . и вы можете использовать это, чтобы просто прикрепить файл.

В противном случае вы просто открываете журнал, одновременно читаете его в строке (или используете File :: Slurp ) и выгружаете содержимое файла в электронное письмо.

4 голосов
/ 25 августа 2009

Вы можете просто набросать содержимое файла и использовать его так же, как любую другую строку:

 open my $fh, '<', 'file.txt' or die "Ouch: $!\n";

 my $text = do {
   local $/;
   <$fh>
 };

 close $fh or die "Ugh: $!\n";
 print $text,"\n";
0 голосов
/ 23 октября 2015

Мы можем использовать mail::outlook вместо mime::lite тоже:

#open file from local machine   

open my $fh, '<', "C:\\SDB_Automation\\sdb_dump.txt" or die "Ouch: $!\n";
my $text1 = do {
local $/;
<$fh>
};
close $fh or die "Ugh: $!\n";
print $text1,"\n";
#create the object


 use Mail::Outlook;
    my $outlook = new Mail::Outlook();

  # start with a folder
 my $outlook = new Mail::Outlook('Inbox');

  # use the Win32::OLE::Const definitions

   use Mail::Outlook;
    use Win32::OLE::Const 'Microsoft Outlook';
      my $outlook = new Mail::Outlook(olInbox);

  # get/set the current folder

   my $folder = $outlook->folder();
    my $folder = $outlook->folder('Inbox');

  # get the first/last/next/previous message

   my $message = $folder->first();
    $message = $folder->next();
    $message = $folder->last();
    $message = $folder->previous();
  # read the attributes of the current message

   my $text = $message->From();
    $text = $message->To();
    $text = $message->Cc();
    $text = $message->Bcc();
    $text = $message->Subject();
    $text = $message->Body();
    my @list = $message->Attach();


  # use Outlook to display the current message
$message->display;

  # create a message for sending

  my $message = $outlook->create();
    $message->To('xyz@.com');
    $message->Subject('boom boom boom');
    $message->Body("$text1");
    $message->Attach('C:\SDB_Automation\sdb_dump.txt');
    $message->send;
0 голосов
/ 10 января 2013

Я думаю, что вложения - это то, что нужно, учитывая то, что вы описали, и другие уже внесли свой вклад в это, но если у вас есть требование или вам нужно прочитать файл и проанализировать его в контенте электронной почты (без вложений) через Perl, способ сделать это:

#!/usr/bin/perl
#       this program will read a file and parse it into an email
use Net::SMTP;
#you need to change the four below line
my $smtp = Net::SMTP->new("your_mail_server_goes_here");
my $from_email = "your_from_email";
my $to_email = "yuor_to_email";
my $file="the_full_path_to_your_file_including_file_name";

my $header = "your_subject_here";
$smtp->mail($from_email);
#Send the server the 'Mail To' address.
$smtp->to($to_email);
#Start the message.
$smtp->data();
$smtp->datasend("From: $from_email\n");
$smtp->datasend("To: $to_email\n");
$smtp->datasend("Subject: $header  \n");
$smtp->datasend("\n");
#make sure file exists
if (-e $file) {
        $smtp->datasend("testing  \n\n");
        #read the file one line at a time
        open( RFILE, "<$file" )||print "could not open file";
        while (my $line  = <RFILE>){
                $smtp->datasend("$line");
        }
        close(RFILE) || print "could not close file";
}
else {
        print "did not find the report $file ";
        exit 1;
#End the message.
$smtp->dataend();
#Close the connection to your server.
$smtp->quit();
#Send the MAIL command to the server.
$smtp->mail("$from_email"); 
0 голосов
/ 25 августа 2009

Открыть файл в Perl можно несколькими способами.

То, что вам нужно знать, описано в perl -f open

Вот пример:

my $file = 'filename.txt';
open my $ifh, '<', $file
  or die "Cannot open '$file' for reading: $!";
local $/ = '';
my $contents = <$ifh>;
close( $ifh );

Теперь просто напишите $contents в своем письме.

Я не уверен, как вы отправляете электронную почту, но я часто пользуюсь следующим образом:

# Install these modules from CPAN:
use Mail::Sendmail;
use MIME::Base64;

sendmail(
  To                          => 'you@your-domain.com',
  From                        => 'Friendly Name <friendly@server.com>',
  'reply-to'                  => 'no-reply@server.com',
  Subject                     => 'That file you wanted',

  # If you are sending an HTML file, use 'text/html' instead of 'text/plain':
  'content-type'              => 'text/plain',
  'content-transfer-encoding' => 'base64',
  Message                     => encode_base64( $contents ),
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...