Обсуждение статьи тематического каталога: Как отправить письмо с аттачем на PHP (php base64 mail)Ссылка на текст статьи: http://www.opennet.me/base/dev/php_mail_attach.txt.html
Класс! Код заработал с первого раза! Я кучу сайтов перекопал. Везде есть примеры, но не рабочие, или с ошибками. Народ хоть сам-то смотрит, чего другим советует?
Нет слов, молодец!
А как два и более файла отправить?
Нет ничего проще...
Достаточно дописать...$zag .= "------------".$un."\n";
$zag .= "Content-Type: application/octet-stream;";
$zag .= "name=\"".basename($filename2)."\"\n";
$zag .= "Content-Transfer-Encoding:base64\n";
$zag .= "Content-Disposition:attachment;";
$zag .= "filename=\"".basename($filename2)."\"\n\n";
$zag .= chunk_split(base64_encode(fread($f2,filesize($filename2))))."\n";При помощи этого примера удалось даже налету создать rtf и домазать к письму...
Первый скрипт, который реально все это делает без гвоздей. Молодец.
Как без гвоздей?
А поле Subject в Base64 запаковать?
мм..я что-то не очень понял...
а куда он все это отправляет? где мыло вписывать куда это все придет?
Пишу такой код:
$filename = "1.JPG";$un = strtoupper(uniqid(time()));
$m ="HELO\n";
$m.="MAIL FROM: srz@srz-holding.ru\n";
$m.="RCPT TO: srz@srz-holding.ru\n";
$m.="DATA\n";
$m.="FROM: srz@srz-holding.ru\n";
$m.="To: srz@srz-holding.ru\n";
$m.="Subject: SIMPLE TEST\n";
$m.="MIME-Version: 1.1
Content-Type: multipart/mixed; boundary=\"----------C0BB13F44576C2\"------------C0BB13F44576C2
Content-Type: text/plain; charset=Windows-1251
Content-Transfer-Encoding: quoted-printablesimple test
srz mailto:srz@srz-holding.ru
------------C0BB13F44576C2
Content-Type: application/octet-stream; name=\"$filename\"
Content-transfer-encoding: base64
Content-Disposition: attachment; filename=\"$filename\"";
$fp = fsockopen("192.168.0.1", 25, &$errno, &$errstr);
if(!$fp)
{
echo "$errstr ($errno)<br>\n";
}
else
{
fputs($fp,$m);
fclose($fp);
echo"That`s OK<hr>";
}
---------
Говорит что все отправлено успешно, а на серваке сервис ругается, что:
read failed. Error Code=connection reset by peer
failed to receive message body (250407 bytes). Error Code=connection reset by peerотправляет не все типы файлов и не любого размера.
Подскажите в чем проблема?
Спасибо большое за скриптик. Все четко и понятно.
Я тут немного доработал этот кодик:
<?
//Функция проверки переменной
function html_filter($str) {
$result = HTMLSpecialChars($str);
return $result;}//Функция проверки e-mail
function isEmail($email){
if (eregi("^[a-z0-9]+([-_\.]?[a-z0-9])+@[a-z0-9]+([-_\.]?[a-z0-9])+\.[a-z]+$", $email)){return TRUE;}else{return FALSE;}}//Функция отправки письма с аттачем
function XMail($from, $to, $subj, $text, $filename, $file)
{
$f = fopen($file,"rb");
$un = strtoupper(uniqid(time()));
$head = "From: $from\n";
$head .= "To: $to\n";
$head .= "Subject: $subj\n";
$head .= "X-Mailer: PHPMail Tool\n";
$head .= "Reply-To: $from\n";
$head .= "Mime-Version: 1.0\n";
$head .= "Content-Type:multipart/mixed;";
$head .= "boundary=\"----------".$un."\"\n\n";
$zag = "------------".$un."\nContent-Type:text/html;\n";
$zag .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n";
$zag .= "------------".$un."\n";
$zag .= "Content-Type: application/octet-stream;";
$zag .= "name=\"".basename($filename)."\"\n";
$zag .= "Content-Transfer-Encoding:base64\n";
$zag .= "Content-Disposition:attachment;";
$zag .= "filename=\"".basename($filename)."\"\n\n";
$zag .= chunk_split(base64_encode(fread($f,filesize($file))))."\n";
if (!@mail("$to", "$subj", $zag, $head))
return 0;
else
return 1;
}//Функция отправки письма без аттача
function EMail($from, $to, $subj, $text)
{
$un = strtoupper(uniqid(time()));
$head = "From: $from\n";
$head .= "To: $to\n";
$head .= "Subject: $subj\n";
$head .= "X-Mailer: PHPMail Tool\n";
$head .= "Reply-To: $from\n";
$head .= "Mime-Version: 1.0\n";
$head .= "Content-Type:multipart/mixed;";
$head .= "boundary=\"----------".$un."\"\n\n";
$zag = "------------".$un."\nContent-Type:text/html;\n";
$zag .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n";
$zag .= "------------".$un."\n";
if (!@mail("$to", "$subj", $zag, $head))
return 0;
else
return 1;
}//Функция отправки письма без аттача
//Получаем данные из формы
if(isset($submit)):
//Проверяем полученные из формы данные
$from = trim(html_filter($from));
$to = trim(html_filter($to));
$subj = trim(html_filter($subj));
$text = trim(html_filter($text));
$text = str_replace("\n", "<br>\n", $text);
$filename = trim(html_filter($file_name));
//Если прикреплен файл
if($filename!="" and $file_size>0):
if(XMail($from, $to, $subj, $text, $filename, $file)==1){header("Location:?send=ok");}
endif;
//Если Не прикреплен файл
if($filename=="" or $file_size==0):
if(EMail($from, $to, $subj, $text)==1){header("Location:?send=ok");}
endif;
endif;
?><html>
<head>
<title>Отправка письма с аттачем и без</title>
</head><body>
<?if($send=="ok"):?><font color="green">Сообщение отправлено</font><br><br><?endif;?>
<form action="<?=$PHP_SELF?>" method="post" enctype="multipart/form-data">
From: <input type="text" name="from"><br>
To: <input type="text" name="to"><br>
Subject: <input type="text" name="subj"><br>
Text:<br><textarea cols="20" rows="5" name="text"></textarea><br>
File: <input type="file" name="file"><br>
<input type="submit" name="submit" value="Отправить">
</form></body>
</html>
Тоже самое, но с проверкой e-mail-ов:<?
//Функция проверки переменной
function html_filter($str) {
$result = HTMLSpecialChars($str);
return $result;}//Функция проверки e-mail
function isEmail($email){
if (eregi("^[a-z0-9]+([-_\.]?[a-z0-9])+@[a-z0-9]+([-_\.]?[a-z0-9])+\.[a-z]+$", $email)){return TRUE;}else{return FALSE;}}//Функция отправки письма с аттачем
function XMail($from, $to, $subj, $text, $filename, $file)
{
$text = str_replace("\n", "<br>\n", $text);
$f = fopen($file,"rb");
$un = strtoupper(uniqid(time()));
$head = "From: $from\n";
$head .= "To: $to\n";
$head .= "Subject: $subj\n";
$head .= "X-Mailer: PHPMail Tool\n";
$head .= "Reply-To: $from\n";
$head .= "Mime-Version: 1.0\n";
$head .= "Content-Type:multipart/mixed;";
$head .= "boundary=\"----------".$un."\"\n\n";
$zag = "------------".$un."\nContent-Type:text/html;\n";
$zag .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n";
$zag .= "------------".$un."\n";
$zag .= "Content-Type: application/octet-stream;";
$zag .= "name=\"".basename($filename)."\"\n";
$zag .= "Content-Transfer-Encoding:base64\n";
$zag .= "Content-Disposition:attachment;";
$zag .= "filename=\"".basename($filename)."\"\n\n";
$zag .= chunk_split(base64_encode(fread($f,filesize($file))))."\n";
if (!@mail("$to", "$subj", $zag, $head))
return 0;
else
return 1;
}//Функция отправки письма без аттача
function EMail($from, $to, $subj, $text)
{
$text = str_replace("\n", "<br>\n", $text);
$un = strtoupper(uniqid(time()));
$head = "From: $from\n";
$head .= "To: $to\n";
$head .= "Subject: $subj\n";
$head .= "X-Mailer: PHPMail Tool\n";
$head .= "Reply-To: $from\n";
$head .= "Mime-Version: 1.0\n";
$head .= "Content-Type:multipart/mixed;";
$head .= "boundary=\"----------".$un."\"\n\n";
$zag = "------------".$un."\nContent-Type:text/html;\n";
$zag .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n";
$zag .= "------------".$un."\n";
if (!@mail("$to", "$subj", $zag, $head))
return 0;
else
return 1;
}//Получаем данные из формы
if(isset($submit)):
//Проверяем полученные из формы данные
$from = trim(html_filter($from));
$to = trim(html_filter($to));
$subj = trim(html_filter($subj));
$text = trim(html_filter($text));
$filename = trim(html_filter($file_name));
//Проверяем e-mail-ы
if(isEmail($from)==false){$from_error=1;}
if(isEmail($to)==false){$to_error=1;}
if($from_error!=1 and $to_error!=1):
//Если прикреплен файл
if($filename!="" and $file_size>0):
if(XMail($from, $to, $subj, $text, $filename, $file)==1){header("Location:?send=ok");}
endif;
//Если Не прикреплен файл
if($filename=="" or $file_size==0):
if(EMail($from, $to, $subj, $text)==1){header("Location:?send=ok");}
endif;
endif;
endif;
?><html>
<head>
<meta http-equiv="Content-Language" content="ru">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Отправка письма с аттачем и без</title>
</head><body>
<?//Печатаем ошибки
if(isset($submit)):
if($from_error==1):?>
<font color="red">E-mail в поле From введен неправильно!</font><br>
<?endif;?>
<?if($to_error==1):?>
<font color="red">E-mail в поле To введен неправильно!</font><br>
<?endif;?>
<?endif;?><?if($send=="ok"):?><font color="green">Сообщение отправлено</font><br><br><?endif;?>
<form action="<?=$PHP_SELF?>" method="post" enctype="multipart/form-data">
From:<br> <input type="text" name="from" value="<?=$from?>"><br>
To:<br> <input type="text" name="to" value="<?=$to?>"><br>
Subject:<br> <input type="text" name="subj" value="<?=$subj?>"><br>
Text:<br><textarea cols="40" rows="10" name="text"><?=$text?></textarea><br>
File:<br> <input type="file" name="file"><br>
<input type="submit" name="submit" value="Отправить">
</form></body>
</html></body>
</html>
Кстати, как налету переформатировать текст из $text в html и сразу прикрепить его к файлу?
А нет случайно примера, как отправить html с картинкой? Насколько я знаю, картинки тоже хранятся в аттаче. А в html в атрибуте src хранится имя аттача и какой-то его идентификатор.
Подскажите пожалуйста! Я пользуюсь ниже указанным кодом для отправки формы с прикрепленным файлом (к примеру фотография) на почтовый ящик. У меня всё нормально доходит,а вот фотография не хочет открываться, хотя она и прикреплена, отображается только крести. Сколько я уже скриптов не перепробывал везде так получается, что вся текстовая информация доходит нормально, а вместо прикрепленной фотографии только крестик (т.е. невозможно отобразить!), интересно, что размер прикрепленной фотографии указан в письме правильно.
Помогите пожалуйста разобраться!
У меня та же проблема, только я понял в чем дело, но не знаю как правильно поступить.Файл не успевает сохраняться на сервере.
Код такой:
if ($_FILES['attach1']['name'] != '')
{
$uploadfile1 = $uploaddir.basename($_FILES['attach1']['name']);
if (!move_uploaded_file($_FILES['attach1']['tmp_name'], $uploadfile1))
{
$errors .= 'Не удалось загрузить файл 1.<br/>';
$uppload1 = 'error';
}
else
{
$attach1_content = implode('', file ($uploadfile1));
//$attach1_content = file_get_contents($uploadfile1);
$mime1 = $_FILES['attach1']['type'];
}
}т.е. когда забираешь текст с файла, он еще на диск не записался. Если файл маленький - все ок. Если файл большой - приходит либо обрезанный, либо 0 длины.
Как сделать правильно?
Желательно избежать функции sleep.
function xmail($from, $to, $subj, $text)
{
$un = strtoupper(uniqid(time()));
$head = "From: $from\n";
$head .= "Subject: $subj\n";
$head .= "X-Mailer: PHPMail Tool\n";
$head .= "Reply-To: $from\n";
$head .= "Mime-Version: 1.0\n";
$head .= "Content-Type: multipart/mixed;";
$head .= "boundary=\"----------".$un."\"\n\n";
$zag = "------------".$un."\nContent-Type: text/html;\n";
$zag .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n";
$filenames = array_slice(func_get_args(), 4);
foreach($filenames as $filename)
{
if (is_readable($filename))
{
$zag .= "------------".$un."\n";
$zag .= "Content-Type: application/octet-stream;";
$zag .= "name=\"".basename($filename)."\"\n";
$zag .= "Content-Transfer-Encoding: base64\n";
$zag .= "Content-Disposition: attachment;";
$zag .= "filename=\"".basename($filename)."\"\n\n";
$zag .= chunk_split(base64_encode(file_get_contents($filename)))."\n";
}
}
return (!@mail($to, $subj, $zag, $head)) ? false : true;
}xmail("a@a", "b@b", "Заголовок", "Сообщение", "site.zip", "photo.jpg");
>[оверквотинг удален]
> $zag .= "Content-Transfer-Encoding: base64\n";
> $zag .= "Content-Disposition: attachment;";
> $zag .= "filename=\"".basename($filename)."\"\n\n";
> $zag .= chunk_split(base64_encode(file_get_contents($filename)))."\n";
> }
> }
> return (!@mail($to, $subj, $zag, $head)) ? false : true;
>}
>
>xmail("a@a", "b@b", "Заголовок", "Сообщение", "site.zip", "photo.jpg");проблему это не решило.. теперь просто не прикладывает файл
Ребят, спасибо за примеры и скрипты.
лНКЧЯЭ МЮ ЮБРНПЮ.
ДКЪ МЕЦН МСФМН ОНЯРЮБХРЭ РНРЕЛ,
ОПХМЕЯРХ ЕЛС ФЕПРБШ,
Х ЛНКХРЭЯЪ МЮ МЕЦН...
ЛНКХРЭЯЪ...ЛНКХРЭЯЪ...ЛНКХРЭЯЪ...яоюяхан юбрнпс!!!!!!!!!!!!!!!!!!!!!!!!!!
domo arigato gozaimasu ^_^
п п╟п╨ п╬я┌п©я─п╟п╡п╦я┌я▄ п©п╦я│я▄п╪п╬ я│ п╟я┌я┌п╟я┤п╣п╪ п╫п╟ PHP (php base64 mail)???????
Огромное спасибо, автор!
Спасибо автору, очень полезная вещь.
Скопировано с http://phpclub.ru/detail/article/mail#part_7
Всё работает, но немогу понять, как можно отправить АНОНИМНОЕ письмо с аттачем (типа с левого адреса)что бы обратная связь потом незамучила))
Автор гений, спасибо
Отлично работает. Но не отправляет exe или zip.
Как пофиксить?
Моя функция на три файлаfunction XMail( $from, $to, $subj, $text, $filename, $filenamereal, $filename1, $filenamereal1, $filename2, $filenamereal3)
{
$f = fopen($filename,"rb");
$un = strtoupper(uniqid(time()));
$head = "From: $from\n";
$head .= "To: $to\n";
$head .= "Subject: $subj\n";
$head .= "X-Mailer: PHPMail Tool\n";
$head .= "Reply-To: $from\n";
$head .= "Mime-Version: 1.0\n";
$head .= "Content-Type:multipart/mixed; charset=utf-8; ";
$head .= "boundary=\"----------".$un."\"\n\n";
$zag = "------------".$un."\nContent-Type:text/html;\n";
$zag .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n";if (strlen($filename)>0)
{
$zag .= "------------".$un."\n";
$zag .= "Content-Type: application/octet-stream;";
$zag .= "name=\"".basename($filenamereal)."\"\n";
$zag .= "Content-Transfer-Encoding:base64\n";
$zag .= "Content-Disposition:attachment;";
$zag .= "filename=\"".basename($filenamereal)."\"\n\n";
$zag .= chunk_split(base64_encode(fread($f,filesize($filename))))."\n";
}if (strlen($filename1)>0)
{
$zag .= "------------".$un."\n";
$zag .= "Content-Type: application/octet-stream;";
$zag .= "name=\"".basename($filenamereal1)."\"\n";
$zag .= "Content-Transfer-Encoding:base64\n";
$zag .= "Content-Disposition:attachment;";
$zag .= "filename=\"".basename($filenamereal1)."\"\n\n";
$zag .= chunk_split(base64_encode(fread($f,filesize($filename1))))."\n";
}if (strlen($filename2)>0)
{
$zag .= "------------".$un."\n";
$zag .= "Content-Type: application/octet-stream;";
$zag .= "name=\"".basename($filenamereal2)."\"\n";
$zag .= "Content-Transfer-Encoding:base64\n";
$zag .= "Content-Disposition:attachment;";
$zag .= "filename=\"".basename($filenamereal2)."\"\n\n";
$zag .= chunk_split(base64_encode(fread($f,filesize($filename2))))."\n";
}if (!@mail("$to", "$subj", $zag, $head))
return FALSE;
else
return TRUE;
}?>
вызывается так XMail( '1@mail.ru', $mailto, $Conff, $StrokaZakaza, $_FILES['fileadd1']['tmp_name'], $_FILES['fileadd1']['name'], $_FILES['fileadd2']['tmp_name'], $_FILES['fileadd2']['name'], $_FILES['fileadd3']['tmp_name'], $_FILES['fileadd3']['name']);
Так не вызывается. Выкидывает ошибки. Как прописать несколько файлов аттача с определенными именами в строке вызова функции?вызывается так XMail( '1@mail.ru', $mailto, $Conff, $StrokaZakaza, $_FILES['fileadd1']['tmp_name'], $_FILES['fileadd1']['name'], $_FILES['fileadd2']['tmp_name'], $_FILES['fileadd2']['name'], $_FILES['fileadd3']['tmp_name'], $_FILES['fileadd3']['name']);