2010-09-23 16 views
0

J'ai un script Perl qui imprime plusieurs lignes de sortie à l'écran. J'ai besoin de capturer ces lignes et soit les envoyer dans un seul morceau de courrier électronique (/ bin/mail) ou dans un fichier texte que je peux envoyer par/bin mail dans une autre opération. En fait, j'ai déjà compris la façon simple (stupide) avec laquelle j'utilise un wrapper bash pour faire le mailing. On dirait,Comment envoyer une sortie multiligne de Perl à/bin/mail?

#!/usr/bin/bash 
source /nethome/zog/.bash_profile 
cd /nethome/zog/bin/perl 
/nethome/zog/bin/perl/find_free_space.pl > text.file 
/bin/mail -s [email protected] [email protected] < text.file 

Je veux utiliser Net :: SMTP pour faire le bit smtp. Ce qui précède est inélégant, c'est le moins qu'on puisse dire.

j'ai vu quelque chose comme ceci:

open(MAIL, "| /bin/mail -s FreePorts me\@geemail.com") || 
    die "mail failed: $!\n"; print MAIL "This is how it goes." 

sur stackoverflow, mais n'a pas réussi à rediriger le courrier dans STDOUT. J'utilise:

$complete_output .= "\n"; "|/bin/mail -s FreePorts zog\@geeemail.com" || die "mail failed: $!\n"; 

Je ne sais pas si vous avez tous besoin de voir le script Perl pour aider, mais it is on pastebin. S'il vous plaît, faites-moi savoir.

+0

vous êtes venu assez près, voir http://stackoverflow.com/questions/655719/how-do-i-unalias-from-perls-stdout – msw

Répondre

1

STDOUT n'est pas en jeu ici. Y a-t-il quelque chose que tu as oublié de nous dire? Que s'est-il passé lorsque vous avez imprimé sur le descripteur de fichier MAIL? Cette sortie a-t-elle été intégrée au message? Que se passe-t-il lorsque vous envoyez plusieurs lignes au descripteur de fichier MAIL?

Votre code est:

"|/bin/mail -s FreePorts zog\@geeemail.com" || die "mail failed: $!\n"; 

Cela ne fait rien. C'est une chaîne, qui est aussi une vraie valeur. L'alternance ne fait jamais à la branche mourir. Que s'est-il passé lorsque vous avez utilisé le premier bit de code dans votre question? Écrivez un petit exemple de script pour voir si vous pouvez envoyer un mail et tester avec ça jusqu'à ce que vous le compreniez. Par exemple, il est un script complet qui teste votre problème:

#!perl 
use strict; 
use warnings; 
open my $mail, '| /bin/mail -s FreePorts [email protected]'; 
print $mail "This is a test message from $$ at " . localtime() . "\n"; 
close $mail or die "The pipe failed!\n $?"; 

Qu'advient-il lorsque vous exécutez cela? Que se passe-t-il lorsque vous essayez cette même commande à partir de la ligne de commande? Pourquoi ne pas utiliser un module Perl (comme l'un des modules Email :: *) au lieu de s'appuyer sur une commande externe? Il y a beaucoup à savoir sur la communication interprocessus, et je pense que vous êtes derrière la courbe. Un module prend soin de tous les détails pour vous, a une interface plus agréable et est plus flexible.

+0

} #print "\ n"; $ complete_output. = "\ N"; "/ bin/mail -s FreePorts zog \ @ gmeeil.com" || die "mail a échoué: $! \ n"; } – user455351

+0

J'ai ce que je pense être un scalaire global nommé "$ complete_output" dans ce script qui recueille toutes les lignes de sortie. Cela marche. Maintenant, je dois être en mesure d'envoyer les données collectées dans/bin/mail ou/usr/sbin/sendmail – user455351

+0

Modifier votre question avec des détails supplémentaires. Montrez-nous un exemple de script complet qui illustre le problème que vous rencontrez. –