2013-11-10 4 views
5

Я следую примеру от this website, чтобы отправить электронное письмо с помощью Perl. Код выглядит так:Отправка электронной почты с использованием Perl с использованием sendmail

my $hostname = `hostname`; 
my $this_day = `date`; 
my $email = "i.h4d35\@gmail.com"; 
my $to = "$email"; 
my $from = "admin\@$hostname"; 
my $subject = "SCHEDULE COMPLETE - $this_day"; 
my $message = "Student schedule for today, completed for the following students: \n\n$names\n\nHave a nice day..."; 
open(MAIL, "|/usr/sbin/sendmail -t"); 
print MAIL "To: $to\n"; 
print MAIL "From: $from\n"; 
print MAIL "Subject: $subject\n\n"; 
print MAIL $message; 
close(MAIL); 

Письмо отправляется, но тема появляется в теле письма, и письмо не имеет темы. Как это исправить?

PS: Не добрался до использования MIME::Lite, пока я все еще изучаю это.

+0

не может воспроизвести проблему. отлично работает для меня. – jkshah

+2

Это не очень хороший учебник по Perl. Вам было бы лучше посмотреть учебники по адресу http://learn.perl.org/ или http://perl-tutorial.org/. –

ответ

7

Использование примеров с веб-сайтов - плохая идея.

Особенно на любом веб-сайте, который инструктирует вас создавать и отправлять низкоуровневые форматы напрямую.

Вы не должны осуществлять какие-либо из следующих форматов вручную:

  • Email
  • HTML
  • CSV
  • IRC протокол
  • т.д.

Какие много сайтов беспомощно подробно, как это сделать, когда им просто нужно сказать Как выполнить эти задачи с помощью модуля.

Вот более простой подход, используя Email: Sender and Email :: Простые, оба качественные части программного обеспечения, написанные кем-то, кто занимается электронной почтой для жизни.

use strict; 
use warnings; 
my $hostname = `hostname`; 
my $this_day = `date`; 

use Email::Simple; 
use Email::Simple::Creator; 
use Email::Sender::Simple qw(sendmail); 

my $email = Email::Simple->create(
header => [ 
     From => "admin\@$hostname", 
     To => "i.h4d35\@gmail.com", 
     Subject => "SCHEDULE COMPLETE - $this_day", 
] 
body => "Student schedule for today, completed for the following students: \n\n$names\n\nHave a nice day..." 
); 
sendmail($email); 
+1

«Использование примеров с сайтов - плохая идея». Даже http://stackoverflow.com? ;) – Kenosis

+0

@ Kenosis Часто да, даже stackoverflow, здесь есть немало ответов, которые пишут Perl, как и 1989 год. ;) Но, как правило, проблема в 2 раза, 1: «Литература стареет быстро» и 2: «Обучение у людей, которые учатся в старой литературе, - это старое знание». Даже мои ответы, которые я стараюсь сделать как можно более свежими, будут устаревать через несколько лет. –

+1

Я действительно знаю, что вы имеете в виду, но только (по иронии судьбы) думал о вашем превосходном ответе на вопрос ОП.Я абсолютно (и довольно смущающе) сбросил мяч в ошибочном ответе на вопрос «сплит» на днях - хотя я использовал его почти 20 лет. Это не только старые ответы ... – Kenosis

3

Выход hostname включает в себя символ новой строки, так что $from содержит символ новой строки, так что Subject: линии появляется после пары символов новой строки, так что это интерпретируется как в теле сообщения. Легко исправить:

chomp($hostname); 

Аналогичная проблема может возникнуть с date.

+0

Идеально !! Спасибо, сэр ... – rahuL

1

Вы можете удалить все новые строки из полей, которые попадают в почтовый заголовок.

tr|\r\n||d for $to, $from, $subject; 
1
#!/usr/local/bin/perl 

use MIME::Lite; 

my $msg = MIME::Lite->new(
     From => '[email protected]', 
     To  => '[email protected]', 
     Type => 'text/plain', 
     Subject => 'your subject', 
     Data => 'your message', 
); 

$msg->send; 
+0

MIME :: Lite не рекомендуется его текущим поддерживающим устройством. http://search.cpan.org/~rjbs/MIME-Lite-3.030/lib/MIME/Lite.pm – Musa

0

Этот код работает для меня надеюсь, что его полезно

#!/usr/bin/perl 

$to = '[email protected]'; 
$from = '[email protected]'; 
$subject = 'Party!!!'; 
$message = 'Details of party'; 

open(MAIL, "|/usr/sbin/sendmail -t"); 

# Email Header 
print MAIL "To: $to\n"; 
print MAIL "From: $from\n"; 
print MAIL "Subject: $subject\n\n"; 
# Email Body 
print MAIL $message; 

close(MAIL); 
print "Email Sent Successfully\n"; 
Смежные вопросы