отправка почты, все за и против

есть куча способов отправки почты от /usr/sbin/sendmail до use CGI;
но в небольших скриптах выполняющие фактически отправку использовать масивный use CGI; мне кажется не совсем разумным и я пользовался простым способом:

$mailprog="/usr/sbin/sendmail -t -f $my_mail";
open (MAIL, "|$mailprog");
print MAIL "To: $to_mail\n";
print MAIL "From: $my_mail\n";
print MAIL "Content-Type: text/html; charset=windows-1251\n";
print MAIL "Subject: test\n\n";
print MAIL "Здрасте!";
close(MAIL);

И тут не жданно не гадано укрнетовцы стали на такие письма вешать "550 spam message"
После показа своего кода отправки. от них поступил ответ:
> Вот тут вот и порилась собака.
> Возьмите любую из свободно распространяемых библиотек формирующую красивие правильные письма и проблема исчезнет.

Как порекомендуете поступить? или где то код дополнить или какую библиотеку посоветуете?
суть в том что отправляется много писем и надо нагрузку свести к минимуму

Доброго

Доброго времени суток! Помимо того, что Вас будут воспринимать как спамера, решение получается крайне неперосимым. Я как-то видел в Cookbook описание подобной проблемы, они так даже приводили название модуля, инкапсулирующего работу с SMTP и красиво формирующего заголовки. Кажется, Mail::Sendmail

Варианты есть, но какой лучше...

первый
use Mail::Sendmail;
%mail = ( To => 'Комy@надо.послать',
From => 'От@кого.письмо',
Message => "Это собственно тело письма!!",
SMTP => 'smtp.mail.ru'
);
sendmail(%mail) or die $Mail::Sendmail::error;

второй
use MIME::Lite;
$msg = MIME::Lite->new (
From =>'John Doe ',
To =>'Frank Smith ',
Subject =>'Test.',
Data =>"It's just test!!!"
);
$msg->send;

третий
use IO::Socket;
my $socket = IO::Socket::INET->new ("127.0.0.1:25");
defined $socket or die "ERROR: $!";
$socket->print ("HELO1512");
$r = <$socket>;
$socket->print ("MAIL FROM:John Doe 1512");
$r = <$socket>;
$socket->print ("RCPT TO:Frank Smith 1512");
$r = <$socket>;
$socket->print ("DATA1512");
$r = <$socket>;
$socket->print ("From:John Doe \nTo:Frank Smith
\nSubject:Test. \n\nIt's just test!!!1512");
$r = <$socket>;
$socket->print ("\.1512");
$r = <$socket>;
$socket->print ("QUIT1512");
$r = <$socket>;

Вариант номер

Вариант номер три слабо отличается от оригинального спам-бота:)

У вас проблема в mime type

По моему у вас проблема в mime type, который просто нужно правильно оформлять в шапке и ограничить в теле.
Как только вы его корректно опишете, все замечательно поедет.

Это несложно сделать где-то одной страничкой кода, если не считать что по-правильному у письма с html обязательно в теле еще есть урезанная версия того-же что и в html, но plain text (text-alternative, кажется).

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

писем много

писем действительно много.
уйти то можно, знать бы куда?

только что нашел причину из за которго меня спмером считают :)
это строчка print MAIL "Content-Type: text/html; charset=windows-1251\n";
если ее убрать. то все работает нормально, но как быть с кодировкой???
open (MAIL, "|/usr/sbin/sendmail -t -f $my_mail");
print MAIL "From: $my_mail\n";
print MAIL "To: $to_mail\n";
print MAIL "Subject: test2\n\n";
print MAIL "Здрасте!";
close(MAIL);

Ключевые слова

Ключевые слова RFC MIME. За обучение гуглению беру почасовую оплату :)
Письма можно не отправлять сразу а складывать в БД, откуда их будет периодически выбирать коллектор и рассылать.

коллектор?

с RFC MIME разобрался, спасибо!
для страждующих - обратите внимание что если вы используете text/html, то письмо обязано содержать минимальный набор необходимих тегов ...

Вопрос по коллектору:
Сам по себе коллектор - устроейство для сбора, в данном случае определенное к-во писем, это понятно.
Далее опять предполагается далнейшее использование?
for (0 .. $collector) {
open (MAIL, "|/usr/sbin/sendmail -t -f $my_mail");
print MAIL "From: $my_mail\n";
print MAIL "To: $to_mail\n";
print MAIL "Subject: test2\n\n";
print MAIL "Здрасте!";
close(MAIL);
}
Все верно?

можно

можно так:

while(1)
{
@mails = readSQLArray();
foreach (@mails)
{
send_mail($_);
}
sleep 10;
}

или запускать по cron такое:
@mails = readSQLArray();
foreach (@mails)
{
send_mail($_);
}

- всегда стоит оформлять какие-то часто используемые нетривиальные куски кода функциями с "говорящим" названием.

теперь mail.ru

с укрнетом все впорядке, а mail.ru кричит о спаме и ответ от них “В сообщении нарушен почтовый стандарт RFC-822.”

Return-path: <my@my.com.ua>
Received: from rupcom by host.biz.ua with local (Exim 4.69)
    (envelope-from <my@my.com.ua>)
    id 1KJEZX-0003Xr-5z
    for user@mail.ru; Thu, 17 Jul 2008 00:30:03 +0300
To: user@mail.ru
From: my@my.com.ua
Subject: тест
MIME-Version: 1.0
Content-Type: text/html; charset=windows-1251
X-Priority: 0 (Normal)
Importance: Normal
X-MSMail-Priority: Normal
X-Mailer: Perl!!!
Message-Id: <E1KJEZX-0003Xr-5z@host.biz.ua>
Date: Thu, 17 Jul 2008 00:30:03 +0300
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<TITLE>тест</TITLE>
<style type="text/css"><!--
.style1 { font-family: Arial, Helvetica, sans-serif; font-size: 16px; font-weight: bold; font-style: italic; color: #FFFFFF; }
.style2 { font-size: 14px; font-family: Arial, Helvetica, sans-serif; color: #af0000; }
.style3 { font-size: 12px; font-family: Arial, Helvetica, sans-serif; }
.style4 { FONT-SIZE: 10px; COLOR: #af0000; FONT-FAMILY: Arial, Helvetica, sans-serif; TEXT-DECORATION: underline }
-->
</style>
</head>
<body>
<table width=100% cellpadding="5"><tr><td bgcolor="#af0000" class="style1">тест<br></td></tr></table>
<br><strong><span class="style2">тема</span></strong>
<br><span class="style3">тело</span> <a href="http://www.host" class="style4">Подробнее</a></body>
</html>

Но в спацификации RFC-822 сказано что: Минимально необходимыми являются поля Date, From, To. + если используется text/html то письмо должно оформляться html тегами Минимально необходимыми являются поля Date, From, To. + если используется text/html то письмо должно оформляться html тегами

Все это учтено и даже более.

Не все учтено.

Не все учтено.
Если вы пишете в mime, там уже недостаточно соответствия rfc-822.
Посмотрите, как отправляет письма например thunderbird.

люди, вопрос

люди, вопрос такой...
где мне найти _бесплатный_ сервер для отправки почты под Виндовс?
у меня есть скрипт, выстраданый мной для отправки почты через smtp.mail.ru, но на 9м письме меня забанили мол я спаммер - очень расстраивает(. если интересно, могу поделиться таким скриптом (хотя в нем мало чего особенного).

А у тебя что,

А у тебя что, хостинг на Win32?
Вопрос вдогонку - что, есть какие-то отличия по отправке почты под Unix системами и Win32:))?

А в чем вообще

А в чем вообще состоит задача? (только, пожалуйста, про почту, частоту, размеры писем, что в письмах (html или аттачменты), адрес отправителя, адреса получателей, а с win32 потом разберемся :) )

:) я не

:) я не веб-программист. нету у меня _пока_ хостинга) я наоборот системный программист, просто маленький еще, и мне все интересно)).

отличия Юникс от Виндовс - насколько я понимаю, их нету, разве что нужен smtp-сервер. Под юниксом бесплатные сервера есть. А под виндовсом - стоял один такой - максимум 10 писем в день, потом просил денюжку. Может, я плохо гуглил?

Задача(пока что мне ее не ставили как работу, но...как сейчас без этого?) состоит в том, чтобы мой скрипт при необходимости отправил письма N людям :) размер маленький, вложения - вряд ли. хтмл - вряд ли, хотя меня несколько расстроила наша дискуссия - по вашим словам мэйл-сервера как-то не любят хтмл (мимэ и т.д.)...

надеюсь, выразил мысль ясно)

Во первых, вам

Во первых, вам самому будет удобнее сделать отправку почты прямо из скрипта, потому что его можно очень гибко настраивать. Да и вобщем сложность не в самой отправке а в корректном оформлении письма (во всех этих шапках, в кодировках и в конверте).

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

В третьих, mime (правильно читается майм) это и есть вложение.
И я уже тут говорил, что наиболее корректно при отправке письма с html-вложением, также отправлять в этом-же письме дополнительным вложением тот-же текст что и в html, но чистым текстом (plain text). Смысл в том что если читалка не умеет работать с html, она покажет plain text.