2009-08-25 6 views
5

J'ai un journal qui est créé à partir d'un tas de tâches cron. Ma tâche consiste maintenant à envoyer des journaux spécifiques (par exemple, des résultats d'erreur) sous la forme d'un courrier électronique. Quel est le meilleur moyen d'obtenir du contenu à partir d'un fichier et de l'envoyer par e-mail?Comment puis-je envoyer le contenu du fichier sous forme de courrier électronique en Perl?

J'ai déjà compris comment envoyer un email en perl. J'ai juste besoin de comprendre comment lire dans le fichier et le mettre comme le texte de l'e-mail.

Répondre

4

Vous pouvez simplement gober le contenu du fichier comme tant et l'utiliser comme vous le feriez pour tout autre chaîne:

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

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

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

Utilisez 'File :: Slurp :: read_file'. –

+0

Je pense que c'est ce que je cherchais. Pouvez-vous expliquer le "my $ text = do {...};"? Je suis vraiment nouveau à Perl. – codingbear

+3

Le bloc suivant 'do' est exécuté et la dernière ligne est retournée (voir 'perldoc -f do'). Le $ local/undefines la valeur du séparateur d'enregistrement d'entrée afin que «<$fh>» récupère le fichier entier. Ceci est un idiome perl assez commun appelé slurping de fichiers. Vous pouvez également utiliser 'File :: Slurp :: read_file' comme recommandé par Sinan. – seth

4

Qu'est-ce que vous utilisez pour envoyer l'e-mail? J'utilise MIME::Lite. et vous pouvez l'utiliser pour simplement joindre le fichier.

Sinon, vous n'avez qu'à ouvrir le journal, le lire en ligne à la fois (ou utiliser File::Slurp) et vider le contenu du fichier dans l'e-mail.

11

J'utilise MIME::Lite, c'est le script cron j'utiliser pour mes sauvegardes nocturnes:

$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

J'aime votre chemin. – JDrago

+0

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

+0

Bon exemple, mais je ne voulais pas la pièce jointe. +1 – codingbear

0

Vous pouvez ouvrir un fichier en Perl de plusieurs façons.

Ce que vous devez savoir est décrit dans perl -f open

Voici un exemple:

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

Maintenant, il suffit email $contents dans votre e-mail.

Je ne sais pas comment vous envoyez email, mais la façon dont je l'utilise fréquemment comme suit:

# 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

Je pense que les pièces jointes sont la voie à suivre étant donné ce que vous avez décrit et d'autres ont déjà contribué à hauteur cela, mais si vous avez une exigence ou besoin de lire un fichier et l'analyser dans un contenu d'e-mails (sans pièces jointes) via Perl ici est la façon de le faire:

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

Nous pouvons utiliser mail::outlook au lieu de mime::lite trop :

#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; 
Questions connexes