HELP! Помогите с отправкой почтой нескольких файлов

S
На сайте с 04.02.2007
Offline
318
svv
1037

Коллеги, HELP!

Есть папка "upload". В ней несколько фото (1.jpg, 2.jpg, 3.jpg и 4.jpg). Их нужно в одном письме скриптом отправить мне на почту.

КАК это сделать правильно?

Второй день мучаюсь - есть работающие образцы скриптов, но они отправляют ОДИН файл, второй прицепить не получается, не говоря о 3 и 4 .....

lutskboy
На сайте с 22.11.2013
Offline
172
#1

отправьте себе на почту яндекса такое письмо где есть несколько изображений. небольшого размера . пару кб.

потом на почте открываем свойства письма. и смотрим как все устроено

какие заголовки. как отделяются файлы друг от друга

ваша задача добиться такого самого в скрипте том что у вас есть

S
На сайте с 23.05.2004
Offline
316
#2

Какой язык то, пхп ? Используйте готовые библиотеки. Первый же результат из гугла по "php mail library" - https://github.com/PHPMailer/PHPMailer


<?php
require 'PHPMailerAutoload.php';

$mail = new PHPMailer;

//$mail->SMTPDebug = 3; // Enable verbose debug output

$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp1.example.com;smtp2.example.com'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'user@example.com'; // SMTP username
$mail->Password = 'secret'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587; // TCP port to connect to

$mail->setFrom('from@example.com', 'Mailer');
$mail->addAddress('joe@example.net', 'Joe User'); // Add a recipient
$mail->addAddress('ellen@example.com'); // Name is optional
$mail->addReplyTo('info@example.com', 'Information');
$mail->addCC('cc@example.com');
$mail->addBCC('bcc@example.com');

$mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments
$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name
$mail->isHTML(true); // Set email format to HTML

$mail->Subject = 'Here is the subject';
$mail->Body = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

if(!$mail->send()) {
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
echo 'Message has been sent';
}
Это просто подпись.
S
На сайте с 04.02.2007
Offline
318
svv
#3

Да, PHP, конечно

В примере так разобраться и не смог :( Выдает ошибки :(

Плюс этот скрипт использует sendmail, а нужно обычным mail()

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

<?

$subject = "тема письма";
$to = "mymail@mail.ru";
$message ="Текст сообщения";
// текст сообщения, здесь вы можете вставлять таблицы, рисунки, заголовки, оформление цветом и т.п.

$filename = "12345.jpg";
// название файла

$filepath = "uploads/12345.jpg";
// месторасположение файла


//исьмо с вложением состоит из нескольких частей, которые разделяются разделителем

$boundary = "--".md5(uniqid(time()));
// генерируем разделитель

$mailheaders = "MIME-Version: 1.0;\r\n";
$mailheaders .="Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
// разделитель указывается в заголовке в параметре boundary

$mailheaders .= "From: $user_email <$user_email>\r\n";
$mailheaders .= "Reply-To: $user_email\r\n";

$multipart = "--$boundary\r\n";
$multipart .= "Content-Type: text/html; charset=windows-1251\r\n";
$multipart .= "Content-Transfer-Encoding: base64\r\n";
$multipart .= "\r\n";
$multipart .= chunk_split(base64_encode(iconv("utf8", "windows-1251", $message)));
// первая часть само сообщение

// Закачиваем файл
$fp = fopen($filepath,"r");
if (!$fp)
{
print "Не удается открыть файл22";
exit();
}
$file = fread($fp, filesize($filepath));
fclose($fp);
// чтение файла


$message_part = "\r\n--$boundary\r\n";
$message_part .= "Content-Type: application/octet-stream; name=\"$filename\"\r\n";
$message_part .= "Content-Transfer-Encoding: base64\r\n";
$message_part .= "Content-Disposition: attachment; filename=\"$filename\"\r\n";
$message_part .= "\r\n";
$message_part .= chunk_split(base64_encode($file));
$message_part .= "\r\n--$boundary--\r\n";
// второй частью прикрепляем файл, можно прикрепить два и более файла

$multipart .= $message_part;

mail($to,$subject,$multipart,$mailheaders);
// отправляем письмо

//удаляем файлы через 60 сек.
if (time_nanosleep(5, 0)) {
unlink($filepath);
}


?>
M
На сайте с 04.12.2013
Offline
223
#4

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

Домены и скрипт для коротких ссылок: https://u75.ru/domains-for-shortcuts
S
На сайте с 04.02.2007
Offline
318
svv
#5
miketomlin:
Там нужны идентичные кадры тому, что используется при отправке одного файла, только имена разные указывайте в заголовках.

Имена то даю разные.

Сейчас версия такая:

<?

$to = "mymail@mail.ru";

$N1 = array();

$N1[] = "12345.jpg";
$N1[] = "45678.jpg";


$subject = "тема письма";

$message ="Текст сообщения";
// текст сообщения, здесь вы можете вставлять таблицы, рисунки, заголовки, оформление цветом и т.п.


//исьмо с вложением состоит из нескольких частей, которые разделяются разделителем

$boundary = "--".md5(uniqid(time()));
// генерируем разделитель

$mailheaders = "MIME-Version: 1.0;\r\n";
$mailheaders .="Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
// разделитель указывается в заголовке в параметре boundary

$mailheaders .= "From: $user_email <$user_email>\r\n";
$mailheaders .= "Reply-To: $user_email\r\n";

$multipart = "--$boundary\r\n";
$multipart .= "Content-Type: text/html; charset=windows-1251\r\n";
$multipart .= "Content-Transfer-Encoding: base64\r\n";
$multipart .= "\r\n";
$multipart .= chunk_split(base64_encode(iconv("utf8", "windows-1251", $message)));
// первая часть само сообщение


foreach($N1 as $n1){

$filename = "$n1";
// название файла

$filepath = "uploads/$n1";
// месторасположение файла


// Закачиваем файл
$fp = fopen($filepath,"r");
if (!$fp)
{
print "Не удается открыть файл22";
exit();
}
$file = fread($fp, filesize($filepath));
fclose($fp);
// чтение файла

$message_part = "\r\n--$boundary\r\n";
$message_part .= "Content-Type: application/octet-stream; name=\"$filename\"\r\n";
$message_part .= "Content-Transfer-Encoding: base64\r\n";
$message_part .= "Content-Disposition: attachment; filename=\"$filename\"\r\n";
$message_part .= "\r\n";
$message_part .= chunk_split(base64_encode($file));
$message_part .= "\r\n--$boundary--\r\n";

// второй частью прикрепляем файл, можно прикрепить два и более файла

}

$multipart .= $message_part;
mail($to,$subject,$multipart,$mailheaders);
// отправляем письмо


?>

приходит только второе фото

M
На сайте с 04.12.2013
Offline
223
#6

Кадры, формируемые нашим софтом, выглядят так:


--граница
Content-Transfer-Encoding: base64
Content-Type: application/zip; name="имя"
Content-Disposition: attachment; filename="имя"

код

В самом конце на отдельной строке общий терминатор: --граница--

---------- Добавлено 01.09.2016 в 15:02 ----------

Эээ... zip – это потому что в образцовом дампе были архивные файлы.

---------- Добавлено 01.09.2016 в 15:05 ----------

svv, вы выдачу общего терминатора перенесите за пределы цикла.

S
На сайте с 23.05.2004
Offline
316
#7
svv:
В примере так разобраться и не смог Выдает ошибки
Плюс этот скрипт использует sendmail, а нужно обычным mail()

Какую ошибку ?

И там же есть пример, как слать через mail() функцию

https://github.com/PHPMailer/PHPMailer/blob/master/examples/mail.phps

Т.е. достаточно просто не включать настройку smtp

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