Динамические данные PHPmailer для нескольких писем?

Я кодирую систему, в которой администратор должен иметь возможность нажать кнопку и отправить письмо всем пользователям. Когда я нажимаю href и перенаправляю с type = 2, он отправляет почту всем учетным записям, но контент, который должен быть динамическим, просто возвращает электронную почту последнего пользователя в массиве.

<?php
include "core/init.php"; 
error_reporting(E_ALL);

date_default_timezone_set('Etc/UTC');
require 'phpmailer/PHPMailerAutoload.php'; 

$mail = new PHPMailer; 
$mail->isSMTP(); 

$mail->SMTPDebug    = 0; 
$mail->Debugoutput  = 'html'; 
$mail->Host         = 'smtprotocl'; 
$mail->Port         = 587; 
$mail->SMTPSecure   = 'tls'; 
$mail->SMTPAuth     = true; 
$mail->Username     = "[email protected]"; 
$mail->Password     = "password";
$mail->CharSet      = 'UTF-8';

$mail->setFrom('[email protected]', 'nameofmailholder'); 

if ($_GET["type"]) {
     if ($_GET["type"] == 2){

        $confirmede = 0;
        $getVendorc = $db->prepare("SELECT * FROM db"); 
        $getVendorc->execute();
        $vresultc = $getVendorc->get_result();
        $getVendorc->store_result();

        while ($rowing = $vresultc->fetch_assoc()) {

            $removeSpace = explode(" ",     decrypt($rowing["email"]));
            $Uemail      = implode("+", $removeSpace);

            $mail->addReplyTo($Uemail); 
            $mail->addAddress($Uemail);

        }

        $mail->isHTML(true);  

        $mail->Subject = 'welcome';


        $mail->Body    = '<a href = "website?id='. encrypt($Uemail) .'" target = "_blank"><button >Bekræft email</button></a>';

    } else {
        urlLocation("index");
    }
}

$mail->AltBody = 'aa';

if ($mail->send()) {
    urlLocation("../../index");
}?>

вы должны отправлять электронное письмо внутри цикла, а не после него

user9487972 04.04.2018 01:17

Я бы рекомендовал взглянуть на пример списка рассылки, поставляемый с PHPMailer.

Synchro 04.04.2018 09:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
796
1

Ответы 1

Либо создайте электронное письмо (используя функции PHPMailer) и отправьте его ВНУТРИ цикла (это то, что вы должны сделать), либо выполните следующие действия, если вы хотите отправить одно электронное письмо всем получателям сразу (не раскрывая электронные письма кому-либо, потому что это BCC ). Я не рекомендую это, но полагаю, что это может сработать.

$mail->addAddress("[email protected]");
$mail->addBCC($email1, $email2, $email3, $email4);

Это должно работать для отправки одного и того же электронного письма нескольким получателям в одном электронном письме, не раскрывая все электронные письма всем.

Лично я использую wuMail ... Это значительно упрощает использование PHPMailer, особенно с SMTP. Вот моя настройка, с явно измененными данными для входа ... Я объясню, как это работает ниже, но вам нужно будет загрузить wuMail (ссылка внизу), чтобы файлы (для PHPMailer) правильно ссылались на config.php и wuMail .php ... Приведенные ниже блоки кода являются ссылками, но их нельзя использовать отдельно без остальной части загрузки wuMail.

Первое, что происходит, это то, что мы устанавливаем системные значения по умолчанию ... Они используются в случае, если определенные параметры электронной почты не передаются в wuMail (). Это отказоустойчивый вариант на тот случай, если вы хотите, чтобы по умолчанию использовался адрес в случае, если часть системы попытается использовать wuMail () без указания адреса. Это позволит вам быстро обнаружить эти типы ошибок.

Ниже приведен код в config.php ... config.php требуется в любом файле, в котором вы хотите использовать функцию wuMail () (для отправки почты). Config установит настройки заранее, а затем загрузит сам файл wuMail.php. Так что не включайте файл wuMail.php, просто config.php!

<?php
/*
NOTE: These settings have been prepared by
WUBUR.COM / WUBUR LLC / BILLY LOWERY / WILL PASSMORE
*/

# DO NOT REMOVE:
$wuMail_Config = new stdClass();

//SENDER CONFIG SETTINGS - YOU CAN CHANGE THESE:
// ----> Note: This current configuration has a form sending to the same address each time
// ----> This could obviously be adapted to allow for emails being sent elsewhere
$wuMail_Config->SiteName = 'Wubur.com';

//SERVER CONFIG SETTINGS - YOU CAN CHANGE THESE:
$wuMail_Config->isSMTP = true;                                   // Set mailer to use SMTP (TRUE / FALSE)
$wuMail_Config->Host = 'smtp.gmail.com';                                            // Specify main and backup SMTP servers
$wuMail_Config->SMTPAuth = true;                                // Enable SMTP authentication (TRUE / FALSE)
$wuMail_Config->AuthType = 'LOGIN';                                                         // Authentification type... ex: PLAIN, LOGIN
$wuMail_Config->Username = '[email protected]';                    // Only blank for GoDaddy's servers
$wuMail_Config->Password = 'PASSWORD';                          // Only blank for GoDaddy's servers
$wuMail_Config->SMTPSecure = 'ssl';                            // ('tls', 'ssl' or false)
$wuMail_Config->Port = 465;                                    // TCP port to connect to
$wuMail_Config->Exceptions = true;                                                      // true/false, if Exceptions enabled
$wuMail_Config->SMTPDebug = 0;                                 // Enable verbose debug output ~~ must be 0 in production environment

//MESSAGE CONFIG SETTINGS - YOU CAN CHANGE THESE:
$wuMail_Config->DefaultToAddress = '[email protected]';
$wuMail_Config->DefaultToName = 'To Name';
$wuMail_Config->DefaultCC = false; // no default CC
$wuMail_Config->DefaultBCC = false;  // no default BCC
$wuMail_Config->DefaultFromAddress = '[email protected]';
$wuMail_Config->DefaultFromName = 'From Name';
$wuMail_Config->DefaultReplyAddress = '[email protected]';
$wuMail_Config->DefaultReplyName = 'Reply Name';
$wuMail_Config->DefaultSubject = 'Default Subject';

# MESSAGE / HTML VERSION CONFIG SETTINGS - YOU CAN CHANGE THESE. BE CAREFUL:
$wuMail_Config->DefaultMessage = 'Default Message (Message Not Supplied)';
$wuMail_Config->ForceHTML = true; // (recommended: true)
// If set to TRUE, and no HTML version of message is supplied to wuMail function, use the HTML template below...Otherwise use HTML supplied to wuMail function if it is supplied.
// If set to FALSE, and no HTML version of message is supplied to wuMail function, simply display a non-HTML message to recipient. If HTML version is supplied, HTML version will be used instead of template
# DefaultHTML: Simply use {!messageInsert!} to insert the regular non-HTML message into the template. {!siteNameInsert!} will insert the config site name.
$wuMail_Config->DefaultHTML = '
<div>
    <center><a href = "site.com"><img style = "width:350px; height:auto; margin-bottom:25px;" src = "site.com/logo.png" alt = "Site Name" /></a></center>
    <div style = "width:100%; color:white; background-color:#c02026; font-weight:500; padding:10px;">Important Information</div>
    <div style = "width:100%; padding:25px; color:black; background-color:#f2f2f2;">
        {!messageInsert!}
    </div>
</div>
';
# NOTE: The 'HTML' key in the options data array for wuMail can be a template with {!messageInsert!} or {!siteNameInsert!} as variables!

// PHPMailer Path Settings:
$wuMail_Path = ""; // path from root dir for site access

// DO NOT REMOVE:
require $wuMail_Path . "wuMail.php";
?>

Очевидно, что URL-адрес и изображение логотипа в шаблоне должны быть обновлены ... Это шаблон по умолчанию, если кто-то отправляет сообщение электронной почты без версии HTML. Это сделано для того, чтобы каждое электронное письмо могло использовать HTML-шаблоны, когда это разрешено, даже если разработчики изначально не использовали их должным образом :) Системные настройки для победы!

Далее у нас есть сам wuMail.php ...

<?php

/*
NOTE: These settings have been prepared by
WUBUR.COM / WUBUR LLC / BILLY LOWERY / WILL PASSMORE
*/

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require $wuMail_Path . 'src/Exception.php';
require $wuMail_Path . 'src/PHPMailer.php';
require $wuMail_Path . 'src/SMTP.php';

function wuMail($data, $multi = false){ 
    global $wuMail_Config;

    if (!is_array($data)){
        $useDefaults = true;
    } else {
        $useDefaults = false;
    }

    $mailSettings = array(
        "TOADDRESS" => $wuMail_Config->DefaultToAddress,
        "TONAME" => $wuMail_Config->DefaultToName,
        "CC" => $wuMail_Config->DefaultCC,
        "BCC" => $wuMail_Config->DefaultBCC,
        "SUBJECT" => $wuMail_Config->DefaultSubject,
        "MESSAGE" => $wuMail_Config->DefaultMessage,
        "HTML" => $wuMail_Config->DefaultHTML,
        "FROMADDRESS" => $wuMail_Config->DefaultFromAddress,
        "FROMNAME" => $wuMail_Config->DefaultFromName,
        "REPLYADDRESS" => $wuMail_Config->DefaultReplyAddress,
        "REPLYNAME" => $wuMail_Config->DefaultReplyName
    );
        # NOTES: THE FOLLOWING CAN BE ARRAYS: ToAddress, ToName (arr key must match ToAddress arr), CC, BCC
        # IN FUTURE, YOU CAN LINE UP EMAILS TO SEND SEPARATELY BY SIMPLY MAKING MULTIDIMENSIONAL ARRAY OF DATA, AND SETTING PARAM 2 (MULTI) EQUAL TO TRUE IN WUMAIL

    if ($useDefaults !== true){
        $submittedOpts = array();
        foreach($data as $submittedOption => $submittedValue){
            $submittedOptionUPPER = strtoupper($submittedOption);
            $submittedOpts[] = $submittedOptionUPPER;
            if (isset($mailSettings[$submittedOptionUPPER])){
                $mailSettings[$submittedOptionUPPER] = $data[$submittedOption];
            } else {
                echo "ERROR: SUBMITTED MAIL OPTION NOT ACCEPTED";
            }
        }

        if (($mailSettings['TOADDRESS'] !== $wuMail_Config->DefaultToAddress) && !in_array('TONAME', $submittedOpts)){ # To address supplied, but no to name supplied
            # do not use a toName...
            $mailSettings['TONAME'] = false;
        }

        if (($mailSettings['FROMADDRESS'] !== $wuMail_Config->DefaultFromAddress) && !in_array('FROMNAME', $submittedOpts)){ # From address supplied, but no fromname supplied
            $mailSettings['FROMNAME'] = false;
            # do not use fromname below, because the supplied from address differs from the default in settings
        }

        if (($mailSettings['REPLYADDRESS'] !== $wuMail_Config->DefaultFromAddress) && !in_array('REPLYNAME', $submittedOpts)){ # Reply address supplied, but no replyname supplied
            $mailSettings['REPLYNAME'] = false;
            # do not use replyname below, because the supplied reply address differs from the default in settings
        }
    } # useDefaults !== true

    $mail = new PHPMailer($wuMail_Config->Exceptions);
    try {
        //Server Settings (from PHPMailer/config.php) - Change in config.php file, not here!
        $mail->SMTPDebug = $wuMail_Config->SMTPDebug;
        if ($wuMail_Config->isSMTP === true){ $mail->isSMTP(); }
        $mail->Host = $wuMail_Config->Host;
        $mail->SMTPAuth = $wuMail_Config->SMTPAuth;
        $mail->AuthType = $wuMail_Config->AuthType;
        $mail->Username = $wuMail_Config->Username;
        $mail->Password = $wuMail_Config->Password;
        $mail->SMTPSecure = $wuMail_Config->SMTPSecure;
        $mail->Port = $wuMail_Config->Port;

    //Recipients
        if ($mailSettings['FROMNAME'] !== false){
            $mail->setFrom($mailSettings['FROMADDRESS'], $mailSettings['FROMNAME']);
        } else {
            $mail->setFrom($mailSettings['FROMADDRESS']);
        }

        if ($mailSettings['TONAME'] !== false){
            $mail->addAddress($mailSettings['TOADDRESS'], $mailSettings['TONAME']);
        } else {
            $mail->addAddress($mailSettings['TOADDRESS']);
        }

        if ($mailSettings['REPLYNAME'] !== false){
            $mail->addReplyTo($mailSettings['REPLYADDRESS'], $mailSettings['REPLYNAME']);
        } else {
            $mail->addReplyTo($mailSettings['REPLYADDRESS']);
        }

        if ($mailSettings['REPLYNAME'] !== false){
            $mail->addReplyTo($mailSettings['REPLYADDRESS'], $mailSettings['REPLYNAME']);
        } else {
            $mail->addReplyTo($mailSettings['REPLYADDRESS']);
        }

        if ($mailSettings['CC'] !== false){
            $mail->addCC($mailSettings['CC']);
        }

        if ($mailSettings['BCC'] !== false){
            $mail->addCC($mailSettings['BCC']);
        }

        //Attachments
        #$mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
        #$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name

        if ($wuMail_Config->ForceHTML !== true && !in_array("HTML", $submittedOpts)){ # ForceHTML is not enforced, and HTML not submitted.... Use plain text message:
            $mailSettings['HTML'] = $mailSettings['MESSAGE'];
            $mail->isHTML(false);
        } else if ($wuMail_Config->ForceHTML === true && !in_array("HTML", $submittedOpts)){ # ForceHTML is true, and wuMail received no HTML template to use: ... use default:
            $templateVarFind = array("{!messageInsert!}", "{!siteNameInsert!}");
            $templateVars = array($mailSettings['MESSAGE'], $wuMail_Config->SiteName);
            $mailSettings['HTML'] = str_replace($templateVarFind, $templateVars, $mailSettings['HTML']); // insert variables into default wuMail HTML template
            $mail->isHTML(true);
        } else {
            $mail->isHTML(true);
        }

        $mail->Subject = $mailSettings['SUBJECT'];

        if ($mailSettings['HTML'] == $mailSettings['MESSAGE']){
            $mail->Body = $mailSettings['MESSAGE'];
        } else {
            $mail->Body = $mailSettings['HTML'];
            $mail->AltBody = $mailSettings['MESSAGE'];
        }

        $mail->send();
        return true;

    } catch (Exception $e) {
            return 'Message could not be sent. Mailer Error: ' . $mail->ErrorInfo;
    }
} // wuMail end
?>

Наконец, после того, как все это настроено в config.php и wuMail.php, мы можем начать использовать функцию wuMail ().

require_once "wuMail/config.php"; 
$mailData = array(
    "TOADDRESS" => "[email protected]",
    "TONAME" => "First Name",
    "SUBJECT" => "Registration",
    "MESSAGE" => "Hello this is a message",
    "HTML" => "Hello this is a <strong>message</strong>",
    "FROMADDRESS" => "[email protected]",
    "FROMNAME" => "Admin Mail",
    "REPLYADDRESS" => "[email protected]"
);
if (wuMail($mailData) === true){
 // mail sent 
} else { 
 // mail not successful, change SMTPDebug to = 4 in config.php to bug test
}

Как видите, не все параметры должны быть указаны ... В массиве $ mailData вы можете указать:

$mailSettings = array(
        "TOADDRESS" => $wuMail_Config->DefaultToAddress,
        "TONAME" => $wuMail_Config->DefaultToName,
        "CC" => $wuMail_Config->DefaultCC,
        "BCC" => $wuMail_Config->DefaultBCC,
        "SUBJECT" => $wuMail_Config->DefaultSubject,
        "MESSAGE" => $wuMail_Config->DefaultMessage,
        "HTML" => $wuMail_Config->DefaultHTML,
        "FROMADDRESS" => $wuMail_Config->DefaultFromAddress,
        "FROMNAME" => $wuMail_Config->DefaultFromName,
        "REPLYADDRESS" => $wuMail_Config->DefaultReplyAddress,
        "REPLYNAME" => $wuMail_Config->DefaultReplyName
    );

Как видите, существует довольно много настраиваемых параметров, которые вы можете ввести в wuMail ($ data), когда хотите отправлять почту. Если вы не укажете что-либо, по умолчанию будут использоваться настройки в config.php для этой конкретной настройки! Ответный адрес / имя и на адрес / имя и от имени / адреса все являются динамическими, поэтому, если вы укажете настраиваемый адрес (но без имени), он не будет несовместим настраиваемый адрес электронной почты с именем по умолчанию. Он просто отправит его с этой информацией как пустой.

Вы можете скачать wuMail, если хотите, по адресу:

http://nerdi.org/stackoverflow/wuMail.zip

wuMail поставляется с упакованным PHPMailer и на 100% бесплатен ... очевидно :)

Это исчерпывающий ответ, но я бы не рекомендовал связывать PHPMailer - лучше использовать композитор, чтобы вам не приходилось беспокоиться о его обновлении самостоятельно.

Synchro 04.04.2018 09:42

Другие вопросы по теме