Отправка файла с вэб-страницы на емайл..
<input name="attachfile" type="file" />
</form>
- должно работать.
а как attachfile вставить в mail; ?
Сдается мне, тебе придется поднять какую-нибудь библиотеку и кодировать в МИМЕ...
А сервер пусть разбирается что на какое мыло послать.
Посмотри доки на php.net по mail. Там, я помню, был предложен некий класс, который позволяет рассылать письмо с прикрепленными к нему файлами. Я его немного дорабатывал (там как-то странно кодировки поддерживались но сейчас вряд ли найду.
function sendMail($to,$from_mail,$from_name,$subject,$message,$file_name) {
$bound="spravkaweb-1234";
$header="From: \"$from_name\" <$from_mail>\n";
$header.="To: $to\n";
$header.="Subject: $subject\n";
$header.="Mime-Version: 1.0\n";
$header.="Content-Type: multipart/mixed; boundary=\"$bound\"";
$body="\n\n--$bound\n";
$body.="Content-type: text/html; charset=\"windows-1251\"\n";
$body.="Content-Transfer-Encoding: quoted-printable\n\n";
$body.="$message";
$file=fopen($file_name,"rb");
$body.="\n\n--$bound\n";
$body.="Content-Type: application/octet-stream;";
$body.="name=\"".basename($file_name)."\"\n";
$body.="Content-Transfer-Encoding:base64\n";
$body.="Content-Disposition:attachment\n\n";
$body.=base64_encode(fread($file,filesize($file_name."\n";
$body.="$bound--\n\n";
if(mail($to, $subject, $body, $header {
echo "<center>Письмо было успешно отправлено!</center>";
} else {
echo "<center>Сообщение не отправлено!</center>";
};
};
файл беру из
<input type=file name=file_name>
на мыло приходит данный файл, но его название что-то типа "phpuDiY0q".
Как сделать, чтобы название файла оставалось исходным?
Вроде в MSDN'е было написано, что всё-таки должно отправляться имя файла. Но этого вполне может и не быть.
$body.="name=\"".basename($file_name)."\"\n";попробуй
$body.="name=\"".$_FILES["file_name"]["name"]."\"\n";
phpuDiY0q - это временное название выгруженного файла (оно еще лежит в $_FILES["file_name"]["tmp_name"] )
теперь всегда приходит "Часть.att" всесто "phpuDiY0q"..
Покажи var_dump($_FILES["file_name"])
выдает NULL
при использовании вышеприведенного скрипта есть 2 проблемы:
1) приходит на мыло 2 письма вместо одного: первое пуспое с пустым файлом под названием "Часть.att", второе содержит отправленный текст сообщения и прикрепленный файл;
2) но имя файла во втором письме "Часть.att", а не то что прикреплялось.
как доработать данный скрипт, или если у кого есть что получше?
неужели ни кто не сталкивался с такой задачей?
Поставь какой-нибудь почтовый клиент, запусти прозрачный почтовый "сервер", который будет регистрировать всё, что передаётся - и посмотри, как там это делается.
function XMail( $from, $to, $subj, $text, $filename)
{
//-- Формируем $out! ---
$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;";
$head .= "boundary=\"----------".$un."\"\n\n";
$head .= "------------".$un."\nContent-Type:text/html;\n";
$head .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n";
$head .= "------------".$un."\n";
$head .= "Content-Type: application/octet-stream;";
$head .= "name=\"".basename($filename)."\"\n";
$head .= "Content-Transfer-Encoding:base64\n";
$head .= "Content-Disposition:attachment;";
$head .= "filename=\"".basename($filename)."\"\n\n";
$head .= chunk_split(base64_encode(fread($f,filesize($filename."\n";
$f=fsockopen("smtp.server.ru", 25);
if(!$f)
{
echo "error socket open smtp.server.ru";
return 0;
}
else
{
$s=fread($f, 1024);
fwrite($f, "HELO 127.0.0.1\n");
$s.=fread($f, 1024);
fwrite($f, "MAIL From:<mail.ru>\n");
$s.=fread($f, 1024);
fwrite($f, "RCPT To:<mailt.ru>\n");
$s.=fread($f, 1024);
fwrite($f, "DATA\n");
$s.=fread($f, 1024);
fwrite($f, $head) ;
fwrite($f, "\r\n.\r\n");
$s.=fread($f, 1024);
fwrite($f, "QUIT\n");
$s.=fread($f, 1024);
fclose($f);
return $s;
}
}
function sendMail($to,$from_mail,$from_name,$subject,$message,$file_arr) {
$file_name = $file_arr["tmp_name"];
$file_old_name = $file_arr["name"];
$bound="spravkaweb-1234";
$header="From: \"$from_name\" <$from_mail>\n";
$header.="To: $to\n";
$header.="Subject: $subject\n";
$header.="Mime-Version: 1.0\n";
$header.="Content-Type: multipart/mixed; boundary=\"$bound\"";
$body="\n\n--$bound\n";
$body.="Content-type: text/html; charset=\"windows-1251\"\n";
$body.="Content-Transfer-Encoding: quoted-printable\n\n";
$body.="$message";
$file=fopen($file_name,"rb");
$body.="\n\n--$bound\n";
$body.="Content-Type: application/octet-stream;";
$body.="name=\"".$file_old_name."\"\n";
$body.="Content-Transfer-Encoding:base64\n";
$body.="Content-Disposition:attachment\n\n";
$body.=base64_encode(fread($file,filesize($file_name."\n";
$body.="$bound--\n\n";
if(mail($to, $subject, $body, $header {
echo "<center>Письмо успешно отправлено</center>";
} else {
echo "<center>Сообщение не отправлено!</center>"; };
};
$to = "mail.ru";
$from_mail = "mail.ru";
$from_name = "From_name";
$subject = "Test";
sendMail($to,$from_mail,$from_name,$subject,$message,$_FILES["attachfile"]);
спасибо
Оставить комментарий
hadgzik
Есть форма отправки сообщения с сайта на емайл. Как сделать возможность пользователям прикреплять к этому сообщению еще и его файлы?