2009-08-25 4 views
5

Mam dziennik, który zostanie utworzony z wielu zadań cron. Moje zadanie polega teraz na wysyłaniu określonych dzienników (np. Wyników błędów) w postaci wiadomości e-mail. Jaki jest najlepszy sposób pobrania zawartości z pliku i wysłania go jako e-maila?Jak mogę wysłać zawartość pliku jako wiadomość e-mail w Perlu?

Zorientowałem się, jak wysłać wiadomość e-mail w języku Perl. Po prostu muszę wymyślić, jak przeczytać w pliku i umieścić go jako tekst wiadomości e-mail.

Odpowiedz

4

Można po prostu slurp się zawartość pliku tak jak i używać go jak każdy inny ciąg:

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

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

close $fh or die "Ugh: $!\n"; 
print $text,"\n"; 
+0

Użyj 'Plik :: Slurp :: read_file'. –

+0

Myślę, że tak właśnie szukałem. Czy możesz wyjaśnić "my $ text = do {...};"? Jestem naprawdę nowy w Perlu. – codingbear

+3

Następujący blok "wykonaj" jest wykonywany, a ostatni wiersz jest zwracany (patrz 'perldoc -f do'). Lokalne $/und definiuje wartość separatora rekordów wejściowych, więc '<$fh>' pobiera cały plik. Jest to dość powszechny idel zwany slurpingiem plików. Możesz również użyć 'File :: Slurp :: read_file' zgodnie z zaleceniami Sinan. – seth

4

Co używasz do wysyłania wiadomości e-mail? Używam MIME::Lite. i możesz użyć tego, aby po prostu dołączyć plik.

W przeciwnym razie wystarczy otworzyć dziennik, przeczytać go w linii na raz (lub użyć File::Slurp) i zrzucić zawartość pliku do wiadomości e-mail.

11

używam MIME::Lite, to jest skrypt cron używam do moich nocnych kopii zapasowych:

$msg = MIME::Lite->new(
    From => '[email protected]', 
    To  => '[email protected]', 
    Bcc  => '[email protected]', 
    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; 
+1

Lubię twoją drogę. – JDrago

+0

Zobacz http://perldoc.perl.org/perlfaq9.html # How-do-I-send-mail% 39 –

+0

Świetny przykład, ale nie chciałem załącznika do pliku. +1 – codingbear

0

Można otworzyć plik w Perl na kilka sposobów.

Co trzeba wiedzieć jest opisana w perl -f open

Oto przykład:

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

Teraz po prostu napisz $contents w emailu.

Nie jestem pewien, w jaki sposób wysyłania wiadomości e-mail, ale sposób, w jaki często używa się następująco:

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

sendmail(
    To       => '[email protected]', 
    From      => 'Friendly Name <[email protected]>', 
    'reply-to'     => '[email protected]', 
    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), 
); 
0

myślę załączniki są do zrobienia, biorąc pod uwagę to, co opisano i inni już przyczyniła się to, ale jeśli masz wymóg lub trzeba czytać pliku i przetwarza go w treści e-maila (bez załączników) poprzez Perl oto sposób to zrobić:

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

Możemy użyć mail::outlook zamiast mime::lite zbyt :

#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('[email protected]'); 
    $message->Subject('boom boom boom'); 
    $message->Body("$text1"); 
    $message->Attach('C:\SDB_Automation\sdb_dump.txt'); 
    $message->send; 
Powiązane problemy