2010-09-23 1 views
0

У меня есть сценарий Perl, который выводит на экран несколько строк вывода. Мне нужно захватить эти строки и либо передать их в один кусок электронной почты (/ bin/mail), либо в текстовый файл, который я могу отправить почтой/bin в другой операции. На самом деле, я уже выяснил легкий (тупой) способ, с помощью которого я использую оболочку bash для выполнения рассылки. Похоже,Как отправить многострочный вывод из 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 

Я хочу использовать Net :: SMTP, чтобы выполнить бит smtp. Вышеизложенное, по меньшей мере, неэлегантно.

я видел что-то вроде этого:

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

на StackOverflow, но не смог перенаправить STDOUT в почту. Я использую:

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

Я не уверен, если вы все должны увидеть скрипт на Perl, чтобы помочь, но it is on pastebin. Пожалуйста, дайте мне знать.

+0

Вы пришли довольно близко, см. Http://stackoverflow.com/questions/655719/how-do-i-unalias-from-perls-stdout – msw

ответ

1

STDOUT здесь не играет. Есть ли что-то, что ты забыл нам сказать? Что произошло, когда вы напечатали файл дескриптора MAIL? Выводил ли этот вывод сообщение? Что происходит, когда вы отправляете несколько строк в дескриптор файла MAIL?

Ваш код:

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

Это ничего не делает. Это строка, которая также является истинным значением. Чередование никогда не происходит с ветвью штампа. Что произошло, когда вы использовали первый бит кода в своем вопросе? Напишите небольшой пример скрипта, чтобы узнать, можете ли вы отправить почту и протестировать, пока не выясните это. Например, это полный сценарий, который проверяет вашу проблему:

#!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 $?"; 

Что происходит, когда вы запускаете это? Что происходит, когда вы пытаетесь выполнить ту же самую команду из командной строки?

Почему бы не использовать модуль Perl (например, один из модулей Email: *) вместо того, чтобы полагаться на внешнюю команду? Есть много информации о межпроцессном общении, и я думаю, что вы стоите за этой кривой. Модуль заботится обо всех деталях для вас, имеет более удобный интерфейс и более гибкий.

+0

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

+0

У меня есть то, что я считаю глобальным скаляром с именем «$ complete_output» в этом скрипте, который собирает все строки вывода. Это работает. Теперь мне нужно отправить эти собранные данные в/bin/mail или/usr/sbin/sendmail. – user455351

+0

Измените свой вопрос с дополнительной информацией. Покажите нам полный примерный сценарий, демонстрирующий проблему, с которой вы сталкиваетесь. –