Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как объеденить все письма для одного пользователя в одно, но ссылками на каждый заказ

Семён Случай Ученик (86), на голосовании 2 недели назад
Как бы рабочий код, но письмо приходит на каждый заказ отдельно, даже одного пользователя, а есть такие у которых больше 100, что в этом коде можно исправить, чтобы в одном письме прикреплялись все ссылки на заказы одного пользователя ?
 require_once '../PHPMailer-master/PHPMailerAutoload.php'; 
$query = "SELECT * FROM book WHERE
id_akk > 0 AND
(data1 - INTERVAL 1 DAY > NOW()) AND
(data1 - INTERVAL 2 DAY < NOW())";
// Результат = запрос на доске
$result = mysqli_query($link,$query);
// Получить массив адресов электронной почты и имен пользователей.
while($row = $result->fetch_array())
{
// Создать НОВОЕ электронное письмо
$email = new PHPMailer;

// Установите настройки электронной почты
//$email->isSMTP();
$email->Host = "ssl://localhost";
$email->SMTPAuth = true;
$email->SMTPKeepAlive = true; // SMTP connection will not close after each email sent, reduces SMTP overhead
$email->Port = 25;
$email->SMTPSecure = 'SSL';
$email->Username = "figyra@mail.ru";
$email->Password = "uuugvciiii";
$email->CharSet = 'UTF-8';
$email->From = 'figyra@mail.ru';

$email->addReplyTo('toster@com.ru', 'Name ');
$email->Subject = "Ваш заказ......";

// Добавить получателя из значений, найденных в Базы данных
$email->addAddress($row["email"], $row["Name"]);
$email->isHTML(true);
$base='https://eresct.ru/';

$email->Body ="Здравствуйте....
Ваш заказ: N {$row['id']}
$base/temа/{$row['zag_url']}_{$row['id']}
$message";
$email->AltBody = $message;

if(!$email->Send())
{
echo "Сообщение не может быть отправлено..";
echo "Ошибка почтовой программы: " . $email->ErrorInfo;
exit;
}

print "Sent mail to: {$row["email"]}
";

}
Подскажите пожалуйста.
Голосование за лучший ответ
Nikassaiop End Просветленный (41045) 1 месяц назад
Строки
 Ваш заказ: N {$row['id']}  
$base/temа/{$row['zag_url']}_{$row['id']}
Заместить циклом прохода по всем доступным ссылкам.
Убедиться, что из тела сайта скрипт будет вызван единожды, а не после каждой кнопки купить или откуда он у вас отрабатывает сейчас.
Семён СлучайУченик (86) 1 месяц назад
Здравствуйте Nikassaiop End, не совсем понятно, это через foreach ?
Татьяна Просветленный (36345) 1 месяц назад
 $userOrders = []; 

while ($row = $result->fetch_array()) {
$userId = $row['id_akk'];
if (!isset($userOrders[$userId])) {
$userOrders[$userId] = ['email' => $row['email'], 'name' => $row['Name'], 'orders' => []];
}
$userOrders[$userId]['orders'][] = $row;
}

foreach ($userOrders as $userData) {
$email = new PHPMailer;
// ... (настройка email)
$email->addAddress($userData['email'], $userData['name']);
$body = "Здравствуйте.... Ваши заказы:\n";
foreach ($userData['orders'] as $order) {
$body .= "N {$order['id']}: {$base}/temа/{$order['zag_url']}_{$order['id']}\n";
}
$email->Body = $body;
$email->send();
}
Семён СлучайУченик (86) 1 месяц назад
Здравствуйте Татьяна, спасибо за подсказку, пытаюсь её применить, но пока не получается, пишет ощибку на $userOrders = [ ]; ругается на квадратную скобку, видно из за версии phpmailer, у меня более ранняя.
Если получится, напишу.
Семён СлучайУченик (86) 1 месяц назад
Не смог применить Ваш код, все время ругается на квадратные скобки, у меня php 5,3 поэтому так
Татьяна Просветленный (36345) Семён Случай, а почему такой старый используешь это php для годов до 2010.
Семён СлучайУченик (86) 1 месяц назад
Здравствуйте Татьяна, да в 2014 начал потихоньку изучать php, писал сайт на Denwer, там стоит php 5.3.13 Позже, будет время перепишу на седьмую версию, лучше будет, чем заново учить новый язык програмирования.
Надо с smtp разобратся, покоя не даёт.
Семён СлучайУченик (86) 1 месяц назад
Здравствуйте Татьяна, скажите пожалуйста, это мне надо учить двойной массив и цикл фореаш, я правильно понимаю ?
Сергей Сулимов Оракул (50660) 1 месяц назад
еденые письма? круть!
Семён СлучайУченик (86) 1 месяц назад
Совсем, плохо с ответами, похоже ечень сложный вопрос.
Рустам Абдрашитов Мыслитель (8667) 1 месяц назад
<?php
require_once '../PHPMailer-master/PHPMailerAutoload.php';

// Функция для отправки писем
function sendEmail($email, $name, $orders) {
$mail = new PHPMailer;
$mail->Host = "ssl://localhost";
$mail->SMTPAuth = true;
$mail->Port = 25;
$mail->SMTPSecure = 'SSL';
$mail->Username = "figyra@mail.ru";
$mail->Password = "uuugvciiii";
$mail->From = 'figyra@mail.ru';
$mail->addAddress($email, $name);
$mail->isHTML(true);
$mail->Subject = "Ваши заказы";
// Объединяем все заказы в одно сообщение
$mail->Body = "Здравствуйте, {$name}!<br>" . implode("<br>", $orders);

if (!$mail->Send()) {
throw new Exception("Сообщение не может быть отправлено. Ошибка: " . $mail->ErrorInfo);
}
}

// Основной код
try {
// Запрос на получение заказов
$query = "SELECT * FROM book WHERE id_akk > 0 AND (data1 - INTERVAL 1 DAY > NOW()) AND (data1 - INTERVAL 2 DAY < NOW())";
$result = mysqli_query($link, $query);

if (!$result) {
throw new Exception("Ошибка выполнения запроса: " . mysqli_error($link));
}

$emails = []; // Массив для хранения писем

// Сбор данных о заказах
while ($row = mysqli_fetch_assoc($result)) {
$email = $row["email"];
if (!isset($emails[$email])) {
$emails[$email] = [
'name' => $row["Name"],
'orders' => []
];
}
// Добавляем ссылку на заказ
$base = 'https://eresct.ru/';
$emails[$email]['orders'][] = "Ваш заказ: N {$row['id']} <br> {$base}temа/{$row['zag_url']}_{$row['id']}";
}

// Отправка писем
foreach ($emails as $email => $data) {
sendEmail($email, $data['name'], $data['orders']);
print "Sent mail to: {$data['name']} <br>";
}

} catch (Exception $e) {
echo "Произошла ошибка: " . $e->getMessage();
}
?>
Семён СлучайУченик (86) 1 месяц назад
Спасибо Рустам Абдрашитов, у меня массив старого образца, первый я исправил на
 $emails = array (); а второй не получается, помоги , что бы проверить.  
 $emails[$email] = [ 
'contakt' => $row["contakt"],
'orders' => []
];
Семён СлучайУченик (86) 1 месяц назад
 Рустам, исправил так, ошибку не пишет, но адрес получателя не видет (You must provide at least one recipient email address.)
$emails= array (
'contakt' => $row["contakt"],
'orders' );
Похожие вопросы