Свой сервис рассылок - нужен совет

12
NikoX
На сайте с 19.04.2007
Offline
66
#11

Спасибо за наводку.. почитаем.

ЗЫ Ссылочки:

https://mail.google.com/support/bin/answer.py?hl=ru&answer=81126

http://help.yandex.ru/mail/?id=617625

C уважением, Предводителев Сергей (VJiK)
[Удален]
#12

тоже интересна тема.

А вдс для 10 000 писем в день справиться? или нужно сервер брать и может кто сталкивался, посоветовали бы кого нибуть

A
На сайте с 29.12.2007
Offline
68
#13
iia:
тоже интересна тема.
А вдс для 10 000 писем в день справиться? или нужно сервер брать и может кто сталкивался, посоветовали бы кого нибуть

По поводу вдс не скажу, но скажу как не надо делать. Не используйте php-функцию mail, да и smtp тоже не желательно. Делал рассылку. 10к писем через mail рассылались несколько часов, через smtp час-полтора. Когда рассылка увеличилась до 50к smtp уже рассылало часов 6, что не приемлимо для нас было. Переписал на сокеты + несколько ip - рассылается 60к за час-полтора.

P.S.: не забудьте ограничения на рассылке поставить (по времени и количеству) + соблюдайте все правила для рассылок (линки выше). Иначе в бан попадете в первой же рассылке.

NikoX
На сайте с 19.04.2007
Offline
66
#14
aktuba:
Переписал на сокеты + несколько ip

Поподробнее не расскажете? Или ссылочки почитать)

A
На сайте с 29.12.2007
Offline
68
#15
NikoX:
Поподробнее не расскажете? Или ссылочки почитать)

Покажу тестовый код, дальше сами ;)

<?php


class Mailer {

protected static function write_smtp_response($socket, $msg) {
$msg = $msg."\r\n";
socket_write($socket, $msg, strlen($msg));
}

protected static function read_smtp_answer($socket) {
$read = socket_read($socket, 1024);
if ($read{0} != '2' && $read{0} != '3') {
if (!empty($read)) {
throw new Exception('SMTP failed: '.$read."\r\n");
} else {
throw new Exception('Unknown error'."\r\n");
}
}
}

protected static function quoted_printable_encode($input, $line_max = 75) {
$hex = array('0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F');
$lines = preg_split("/(?:\r\n|\r|\n)/", $input);
$linebreak = "=0D=0A=\r\n";
/* the linebreak also counts as characters in the mime_qp_long_line
* rule of spam-assassin */
$line_max = $line_max - strlen($linebreak);
$escape = "=";
$output = "";
$cur_conv_line = "";
$length = 0;
$whitespace_pos = 0;
$addtl_chars = 0;

// iterate lines
for ($j=0; $j<count($lines); $j++) {
$line = $lines[$j];
$linlen = strlen($line);

// iterate chars
for ($i = 0; $i < $linlen; $i++) {
$c = substr($line, $i, 1);
$dec = ord($c);

$length++;

if ($dec == 32) {
// space occurring at end of line, need to encode
if (($i == ($linlen - 1))) {
$c = "=20";
$length += 2;
}

$addtl_chars = 0;
$whitespace_pos = $i;
} elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) {
$h2 = floor($dec/16); $h1 = floor($dec%16);
$c = $escape . $hex["$h2"] . $hex["$h1"];
$length += 2;
$addtl_chars += 2;
}

// length for wordwrap exceeded, get a newline into the text
if ($length >= $line_max) {
$cur_conv_line .= $c;

// read only up to the whitespace for the current line
$whitesp_diff = $i - $whitespace_pos + $addtl_chars;

/* the text after the whitespace will have to be read
* again ( + any additional characters that came into
* existence as a result of the encoding process after the whitespace)
*
* Also, do not start at 0, if there was *no* whitespace in
* the whole line */
if (($i + $addtl_chars) > $whitesp_diff) {
$output .= substr($cur_conv_line, 0, (strlen($cur_conv_line) -
$whitesp_diff)) . $linebreak;
$i = $i - $whitesp_diff + $addtl_chars;
} else {
$output .= $cur_conv_line . $linebreak;
}

$cur_conv_line = "";
$length = 0;
$whitespace_pos = 0;
} else {
// length for wordwrap not reached, continue reading
$cur_conv_line .= $c;
}
} // end of for

$length = 0;
$whitespace_pos = 0;
$output .= $cur_conv_line;
$cur_conv_line = "";

if ($j<=count($lines)-1) {
$output .= $linebreak;
}
} // end for

return trim($output);
}

public static function send($email, $subject, $text, $headers = '', $server = '127.0.0.1'){
$send_start = microtime(TRUE);

$result = FALSE;

$boundary = '_=_boundary_' . strtoupper(uniqid(time())) . '_=_';
$headers .= 'Content-Type: multipart/related;' . "\r\n" . ' boundary="' . $boundary . '"' . "\r\n";
$boundary = '--' . $boundary;

$text = $boundary . "\r\n" . "Content-Type: text/html; charset=windows-1251\r\n" .
"Content-Transfer-Encoding: quoted-printable\r\n\r\n" . self::quoted_printable_encode($text) . "\r\n\r\n";

try {
$socket_create = microtime(TRUE);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0)
throw new Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\r\n");
echo 'socket create: ' . (microtime(TRUE) - $socket_create) . "<br />\r\n";

$socket_connect = microtime(TRUE);
$result = socket_connect($socket, $server, 25);
if ($result === false)
throw new Exception('socket_connect() failed: '.socket_strerror(socket_last_error())."\r\n");
echo 'socket connect: ' . (microtime(TRUE) - $socket_connect) . "<br />\r\n";

$smtp_answer = microtime(TRUE);
self::read_smtp_answer($socket);
echo 'smtp answer: ' . (microtime(TRUE) - $smtp_answer) . "<br />\r\n";

$smtp_write = microtime(TRUE);
self::write_smtp_response($socket, 'MAIL FROM:<info@site.ru>');
echo 'smtp write MAIL FROM: ' . (microtime(TRUE) - $smtp_write) . "<br />\r\n";
self::read_smtp_answer($socket);

$smtp_write = microtime(TRUE);
self::write_smtp_response($socket, 'RCPT TO:<'.$email.'>');
echo 'smtp write RCPT TO: ' . (microtime(TRUE) - $smtp_write) . "<br />\r\n";
self::read_smtp_answer($socket);

$smtp_write = microtime(TRUE);
self::write_smtp_response($socket, 'DATA');
echo 'smtp write DATA: ' . (microtime(TRUE) - $smtp_write) . "<br />\r\n";
self::read_smtp_answer($socket);

$smtp_write = microtime(TRUE);
$message = 'To: ' . $email . "\r\n";
$message .= 'Subject: ' . $subject . "\r\n";
$message .= $headers . "\r\n";
$message .= $text;

self::write_smtp_response($socket, $message."\r\n.");
echo 'smtp write MESSAGE: ' . (microtime(TRUE) - $smtp_write) . "<br />\r\n";
self::read_smtp_answer($socket);

$smtp_write = microtime(TRUE);
self::write_smtp_response($socket, 'QUIT');
echo 'smtp write QUIT: ' . (microtime(TRUE) - $smtp_write) . "<br />\r\n";
self::read_smtp_answer($socket);

$result = TRUE;

} catch (Exception $e) {
echo "\r\nError: ".$e->getMessage();
}

echo 'send ok: ' . (microtime(TRUE) - $send_start) . "<br /><br />\r\n\r\n";

return $result;
}

}

На этом коде я тестировал... Куча лишнего, но кому надо - разберется быстро ;)

P.S.: кое-что вырезал, т.к. на пост ограничение в 10к символов.

NikoX
На сайте с 19.04.2007
Offline
66
#16

aktuba, спасибо за пример! Будем разбираться)

РИА
На сайте с 30.07.2006
Offline
208
#17

iia, справится VDS не самый простой если брать.

384 - 512 Mb памяти остальное не важно.

Все услуги хостинга (http://www.park-web.ru). Москва, Казань, Новосибирск, Чехия. Работаем с юридическими лицами.
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий