Как отправить многострочный вывод из Perl в / bin / mail? - PullRequest
0 голосов
/ 23 сентября 2010

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

#!/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 FreeSpace@NJ3 zog@geemail.com < 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."

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

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

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

1 Ответ

1 голос
/ 23 сентября 2010

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 me@geemail.com';
print $mail "This is a test message from $$ at " . localtime() . "\n";
close $mail or die "The pipe failed!\n $?";

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

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

...