Advertisement
Sabriel

SMTP

Jun 25th, 2013
343
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 4.52 KB | None | 0 0
  1. use MIME::Base64;
  2. use IO::Socket;
  3. $/="\n";
  4. open(F1, "conf.txt") or die "Ошибка открытия файла: $!";
  5. open(F2, "text.txt") or die "Ошибка открытия файла: $!";
  6. my $mailrcpt = <F1>;
  7. chomp $mailrcpt;
  8.  
  9. #$mailrcpt=join("",$whom);
  10. my $subj = <F1>;
  11. my $attachment = <F1>;
  12. chomp $attachment;
  13. open(F3,$attachment);
  14. #my $attachpath = 'C:\\';   # путь к нему
  15.  
  16. my $mailbox  = '666999end@mail.ru'; # ящик-отправитель
  17. my $mailpwd  = '6699end';       # пароль
  18. #my $mailrcpt = '666999end@mail.ru';    # ящик-получатель
  19. while($nya=<F2>){
  20. my $mail.=$nya;
  21. }
  22. close F1;
  23. close F2;
  24. $subj = encode_base64($subj);
  25. $subj =~ s/\n//ig;  # уберем символы перевода строки
  26. $subj =~ s/\r//ig;  # и возврата каретки
  27. $subj = '=?Windows-1251?B?'.$subj.'?=';
  28.  
  29.  
  30. $msg = encode_base64($mail);
  31.  
  32.  
  33.  
  34. # здесь формируем заголовок, минимальная версия
  35. $body = "Mime-Version: 1.0\n";
  36. $body .= "Content-Type: multipart/mixed; boundary=\"my_bound\"\n\n";
  37.  
  38. # вставляем тело письма
  39. $body .= "--my_bound\nContent-Type: text/plain;\n\tcharset=\"Windows-1251\"\nContent-Transfer-Encoding: base64\n\n$msg\n";
  40.  
  41. # и прицепляем файл-вложение
  42. $body .= "--my_bound\nContent-Type: application/octet-stream; name=\"$attachment\"\n";#octet-stream: двоичный файл без указания формата
  43. $body .= "Content-Transfer-Encoding: base64\n";
  44. $body .= "Content-Disposition: inline; filename=\"$attachment\"\n\n";#an inline content-disposition, which means that it should be automatically displayed when the message is displayed
  45.  
  46. # чтобы сформировать вложение, открываем файл
  47. # в двоичном режиме, считываем его в память и кодируем в base64
  48.  
  49. $txt = '';
  50.  
  51. binmode F3;
  52. while($str=<F3>){$txt.=$str};
  53. close F3;
  54. $body .= encode_base64($txt)."\n--my_bound--\n";
  55.  
  56. # собираем письмо полностью
  57. $mailmessage = "From:$mailbox\nTo:$mailrcpt\nSubject:$subj\n$body\n.\n";
  58.  
  59. my $reply;  # код ответа сервера
  60. my $message;    # текст ответа сервера
  61.  
  62. #открываем сокет к SMTP-серверу
  63.  
  64. my $socket = IO::Socket::INET->new('smtp.mail.ru:25');
  65. defined $socket or die "ERROR: $!\n";
  66.  
  67. if(ReadReply() ne 220){print "Failed to establish connection = $message\n"; $socket->close(); exit} #служба готова к работе
  68.  
  69. $socket->print ("EHLO username@mail.ru\n");
  70. if(ReadReply() ne 250){print "Welcome Server Error = $message\n"; $socket->close(); exit} #Запрошенное действие почтовой транзакции успешно завершилось
  71. else{print "Server accepts EHLO\n";}
  72.  
  73. $socket->print("AUTH LOGIN\n");
  74. if(ReadReply() ne 334){print "Autification error = $message\n"; $socket->close(); exit}#waits username@mail_server
  75. else{print "Server accepts autif type, Server waits for username\n";}
  76.  
  77. $socket->print(encode_base64($mailbox));
  78. if(ReadReply() ne 334){print "Autification error = $message\n"; $socket->close(); exit}#waits pswd
  79. else{print "Username was accepted, Server waits for pswd\n";}
  80.  
  81. $socket->print(encode_base64($mailpwd));
  82. if(ReadReply() ne 235){print "Authorization Error = $message\n"; $socket->close(); exit}#Успешное завершение клиентом аутентификационного обмена
  83. else{print "235 Authentication succeeded\n";}
  84.  
  85. $socket->print('mail from: '."$mailbox\n");
  86. if(ReadReply() ne 250){print "Error in the sender's mailbox = $message\n"; $socket->close(); exit}#Требуемые почтовые действия завершены
  87.  
  88. $socket->print("rcpt to: $mailrcpt\n");
  89. if(ReadReply() ne 250){print "Error in the recipient's mailbox = $message\n"; $socket->close(); exit}
  90.  
  91. $socket->print("data\n");
  92. if(ReadReply() ne 354){print "Error at the beginning of the formation of letters = $message\n"; $socket->close(); exit}#Начинай передачу сообщения
  93. $socket->print($mailmessage);
  94.  
  95. if(ReadReply() ne 250){print "Error sending email = $message\n"; $socket->close(); exit}
  96.  
  97. # если дошли до этого места, значит письмо ушло
  98. $socket->close();
  99. print "The letter was sent\n";
  100.  
  101. sub ReadReply{
  102.         $val = 1;
  103.         while($val eq 1){
  104.                 $r = <$socket>;
  105.                 $val = $r =~ m/^\d{3}-/g;
  106.         }
  107.         ($reply,$message) = split(/ /,$r,2);
  108.         return $reply;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement