smtp php
Отправка писем через SMTP с авторизацией13.08.2007 сайт автора: http://webi.ru
публикация данной статьи разрешена только со ссылкой на сайт автора статьиКак отправить почту с помощью php через SMTP сервер используя сокеты. Рассматривается отправка почты с прикрепленными файлами и просто текста.
Комментарии
RSS комментарии
18.08.2010 Артур
Эх, я просто и с ним, и без него пробовал, все никак не хочет...
18.08.2010 Виктор
Артур, значит вообще сокеты запрещены на сервере
15.09.2010 Павел
Доброго дня!
Проблема над которой сегодня бился целый день...
Решил с помощью вашей статьи написать функцию отправки написать.
Написал, засунул в файлик, отправляет все железно и туда куда надо, НО(!)
одна проблема файл (всегда jpg,gif,png) приходит, но он пустой ((( Бьюсь уже полдня - ниче зделать не могу.
Письмо выглядит вроде как обычно - все заголовки проверил - все гут. Единственная зацепка - размер файла показывает "~0 байт" вот ето и смущает.
Помогите пжалста, а то башка уже ниче не соображает%)
15.09.2010 Павел
Полностью разковырял скрипт и выяснил, что если скрипт вытаскивать отдельно и потом вызывать его там где надо функцией include("sript.php");
То не считается размер файла и файл не кодируется. Только вот что с этим делать - все равно понять не могу...
15.09.2010 Павел
теперь точно знаю причину.
$file = $url."/".$file_n;
$fp = fopen($file, "rb");
$code_file = chunk_split(base64_encode(fread($fp, filesize($file))));
fclose($fp);
Если код выше заталкивать в отдельный файл, то он почему-то не работает. Хотя я передаю функции путь к файлу...
А вот теперь вопрос - как это исправить?
15.09.2010 Админ
Павел, информации от вас не хватает.
Привели бы пример вашего кода.
Ну и самое первое, проверьте, точно ли подвязывается файл к скрипту? Может он по какой-то причине не инклюдится.
15.09.2010 Павел
Содержимое файла из которого вызывается скрипт
include("js/pismo.php");
$messaga = "Платежка по счету №".$nomer;
//цеплять файл
$file = $url."/".$file_n;
$fp = fopen($file, "rb");
$code_file = chunk_split(base64_encode(fread($fp, filesize($file))));
fclose($fp);
otpravka("qwerty@zzzz.ru",$messaga,$messaga,$file_n,$code_file);
//Содержимое скрипта
function get_data($smtp_conn)
{ ... }
function otpravka($EMAIL,$SUB,$MESS,$FILE,$CODE64)
{
$EMAIL = iconv("UTF-8","WINDOWS-1251",$EMAIL);
$SUB = iconv("UTF-8","WINDOWS-1251",$SUB);
//шапки для писма с вложением
$header="Date: ".date("D, j M Y G:i:s")." +0700\r\n";
$header.="From: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode($EMAIL)))."?= <payment@your-security.ru>\r\n";
$header.="X-Mailer: The Bat! (v3.99.3) Professional\r\n";
$header.="Reply-To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode($EMAIL)))."?= <".$EMAIL.">\r\n";
$header.="X-Priority: 3 (Normal)\r\n";
$header.="Message-ID: <172562218.".date("YmjHis")."@your-security.ru>\r\n";
$header.="To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode($SUB)))."?= <payment@your-security.ru>\r\n";
$header.="Subject: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode($SUB)))."?=\r\n";
$header.="MIME-Version: 1.0\r\n";
$header.="Content-Type: multipart/mixed; boundary=\"----------A4D921C2D10D7DB\"\r\n";
$text = "------------A4D921C2D10D7DB
Content-Type: text/plain; charset=windows-1251
Content-Transfer-Encoding: 8bit
".$MESS."
------------A4D921C2D10D7DB
Content-Type: application/octet-stream; name=\"".$FILE."\"
Content-transfer-encoding: base64
Content-Disposition: attachment; filename=\"".$FILE."\"
".$CODE64."
------------A4D921C2D10D7DB--
";
// Далее строчки с сокетами в них проблем точно нет, все железно.
15.09.2010 Павел
Хм... но письмо то отправляется. И вложение тоже есть. Только пустой jpg приходит...
16.09.2010 Админ
Павел, вы и сами сказали, что проблема с этим кодом
$file = $url."/".$file_n;
$fp = fopen($file, "rb");
$code_file = chunk_split(base64_encode(fread($fp, filesize($file))));
Мне кажется, что в строке
$file = $url."/".$file_n;
есть проблемы с путями.
Проверьте что находится в $file, похоже сюда приходит не верное значение пути ($url)
16.09.2010 Павел
хм... я неправильный кусок кода привел.
Этот код как раз Работает! Кодирование происходит непосредственно перед передачей данных скрипту,
а вот если кодировать файл внутри функции function otpravka($EMAIL,$SUB,$MESS,$FILE,$CODE64)
{...}
Вот тогда он почему то его не хочет видеть.
16.09.2010 Админ
Павел, ну ведь в эту функцию вы не передаете переменную $url.
16.09.2010 Павел
Внутри функции было так:
$file = "http://www.qwerty.ru/path/to/folder/".$FILE;
$fp = fopen($file, "rb");
$code_file = chunk_split(base64_encode(fread($fp, filesize($file))));
И даже если тупо проверять filesize выдает пустоту.
16.09.2010 админ
Павел, а вы уверены, что такая конструкция у вас работала?
Тут же вы доступ к файлу получаете снаружи, через http://
Если вы не можете получить размер файла через http, значит на сервере запрещено это, поэтому и не можете получить размер файла, и возможно fopen тоже не работает с удаленными файлами.
17.09.2010 Павел
Возможно конечно...
Тогда не понятно что с этим делать...
Но если я этот код ставлю вне функции и сначала кодирую его а потом передаю функции, то все отлично. При этом файл, все же, лежит на сервере.
У Вас нет идей, как это исправляется?
17.09.2010 Админ
Павел, если файл лежит на вашем сервере, зачем тогда вы к нему через http обращаетесь?
Ну и почему этот код работает вне функции, а внутри функции не работает... ну тут где то ваша ошибка, ведь такого не может быть.
что то не хватает в функции.
присылайте весь код мне на почту, я гляну, может найду проблему.
28.09.2010 Дима Кошлоков
Автор, большое вам спасибо за пример и подробное разъяснение. Благодаря вам побеждена проблема отправки почты на mail.ru, до этого антиспамом вся почта даже в папку СПАМ не попадала. Больших вам успехов! Ещё раз спасибо!
05.10.2010 Игорь
Все работает замечательно, мэйл ру принимает нормально файл, а вот гмэйл его принимает как спам. В тоже время при отправке функцией mail() по-простому гмэйл письмо понимает нормально,не как спам. Цирк,да и только
05.10.2010 админ
Игорь, скорее всего дело может быть в сервере smtp, возможно функция mail() ведет отправку через другой сервер, от другого IP, который для gmail является чистым, а сервер smtp или ip сервера на котором работает скрипт считаются у gmail спамерскими.
Антиспам у gmail относится очень лояльно к чистым smtp серверам и чистым IP клиентов от которых идет отправка. Я тестировал доставку писем на gmail используя разные подходы в заголовках и если ip адреса от которых идет доставка чистые, то почта приходит независимо от того, что там напишешь в заголовках.
Чистые, я имею ввиду smtp сервер и ip клиента, с которых не было зафиксировано спамерских писем.
26.10.2010 Вадим
Пригодилось. Автор молодец. Спасибо!
23.11.2010 Nat
Пробую отправлять два письма на разные адреса
fputs($smtp_conn,"RCPT TO:<1@m.ru>\r\n");
$code = substr(get_data($smtp_conn),0,3);
fputs($smtp_conn,"RCPT TO::<2@m.ru>\r\n");
$code = substr(get_data($smtp_conn),0,3);
if($code != 250 AND $code != 251) {print "Сервер не принял команду RCPT TO"; fclose($smtp_conn); exit;}
fputs($smtp_conn,"DATA\r\n");
$code = substr(get_data($smtp_conn),0,3);
Выводит сообщение Сервер не принял команду RCPT TO. На один адрес всё нормально. Что не так, подскажите плиз!
Добавить свой комментарий
|