2009-08-25 5 views
5

Tengo un registro que se crea a partir de un montón de trabajos cron. Mi tarea ahora es enviar registros específicos (por ejemplo, salidas de error) como un correo electrónico. ¿Cuál es la mejor manera de obtener contenido de un archivo y enviarlo como un correo electrónico?¿Cómo puedo enviar el contenido del archivo como correo electrónico en Perl?

Ya he descubierto cómo enviar correos electrónicos en Perl. Solo necesito averiguar cómo leer en el archivo y ponerlo como el texto del correo electrónico.

Respuesta

4

Usted sólo puede sorber el contenido del archivo como tal y utilizarlo como lo haría con cualquier otra cadena:

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

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

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

Use 'File :: Slurp :: read_file'. –

+0

Creo que esta es la manera que estaba buscando. ¿Puedes explicar "my $ text = do {...};"? Soy realmente nuevo en Perl. – codingbear

+3

El bloque que sigue a 'do' se ejecuta y se devuelve la última línea (ver 'perldoc -f do'). El $ local/undefine el valor del separador de registros de entrada para que '<$fh>' obtenga el archivo completo. Esta es una expresión perl bastante común llamada sorber archivos. También podría usar 'File :: Slurp :: read_file' como lo recomienda Sinan. – seth

4

¿Qué estás usando para enviar el correo electrónico? Yo uso MIME::Lite. y puedes usar eso para adjuntar el archivo.

De lo contrario, acaba de abrir el registro, léalo en línea a la vez (o use File::Slurp) y vacíe el contenido del archivo en el correo electrónico.

11

utilizo MIME::Lite, este es el script cron que utilizo para mis copias de seguridad nocturnas:

$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

Me gusta tu camino. – JDrago

+0

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

+0

Gran ejemplo, pero no quería el archivo adjunto. +1 – codingbear

0

Puede abrir un archivo en Perl de varias maneras.

Lo que necesita saber se describe en perl -f open

He aquí un ejemplo:

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

Ahora Simplemente hay que enviar $contents en su correo electrónico.

No estoy seguro de cómo va a enviar correo electrónico, pero la forma en que uso con frecuencia es la siguiente:

# 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

Creo adjuntos son el camino a seguir teniendo en cuenta lo que ha descrito y otros ya han contribuido acerca esto, pero si usted tiene un requisito o necesita leer un archivo y analizarlo en un contenido del correo electrónico (sin archivos adjuntos) a través de Perl aquí es la manera de hacerlo:

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

podemos utilizar mail::outlook en lugar de mime::lite demasiado :

#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; 
Cuestiones relacionadas