PHPMailer отправляет дубликаты писем - PullRequest
0 голосов
/ 14 ноября 2018

ПРОБЛЕМА: Я получаю три дубликата электронных писем для каждого пользователя, который подписывается со своим адресом электронной почты.Мой список гостей заполнен дублирующимися электронными письмами, и я не знаю, что не так с моим кодом.

Вероятная причина : У меня есть 3 формы регистрации, поэтому я думаю, что когда я отправляю одну форму регистрации, они все отправляют одновременно.Проблема заключается либо в Bootstrap 4.1.3 JS, либо в HTML.

Код PHP:

$email = $_REQUEST['email'] ;

// Import PHPMailer classes into the global namespace
// These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require './PHPMailer-master/src/Exception.php';
require './PHPMailer-master/src/PHPMailer.php';
require './PHPMailer-master/src/SMTP.php';

// Popup Form Signup
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host = "mail.domain.com";
$mail->SMTPAuth = true;
$mail->Username = "user@domain.com"; 
$mail->Password = "password"; 
$mail->SMTPSecure = 'TLS';                           
$mail->Port = 587;
$mail->From = $email;
$mail->setFrom('$email', 'Guest');
$mail->addAddress('admin@domain.com', 'Admin');
$mail->IsHTML(true);
$mail->Subject = "New Member!";
$mail->Body = $email;
$mail->AltBody = $email;

$mail2 = new PHPMailer();
$mail2->IsSMTP();
$mail2->Host = "mail.domain.com"; 
$mail2->SMTPAuth = true; 
$mail2->Username = "user@domain.com"; 
$mail2->Password = "password"; 
$mail2->SMTPSecure = 'TLS';                      
$mail2->Port = 587;                             
$mail2->setFrom('support@domain.com', 'Support');
$mail2->AddAddress("$email");    
$mail2->AddReplyTo('support@domain.com');

    $mail2->Subject = "Thanks for signing up!";
    $message = '';
    $mail2->Body = $message;
    $mail2->AltBody = $message;


    if(!$mail2->Send())
    {
    echo "Message could not be sent. Please reload the page and try again. <p>";
    echo "Mailer Error: " . $mail2->ErrorInfo;
    exit;
    }

    if(!$mail->Send())
    {
    echo "Message was not received. Please reload the page and try again.<p>";
    echo "Mailer Error: " . $mail->ErrorInfo;
    exit;
    }

У меня также есть другие формы, которые открывают различные файлы PHP, но они не должны быть проблемой здесь.Я просто добавил это здесь на всякий случай, если кто-нибудь сможет что-то выяснить

ФОРМА 1 (та же страница посадки)

<form class="signupForm1 input-group mt-1" method="post" action="topconfirm">
        <div class="input-group">
        <label for="email" class="sr-only">Enter your email address</label>
        <input style ="overflow:hidden;" id="email" type="email" name="email" required class="sentence form-control" aria-label="Large" placeholder="enter your email address">      
        <button style="font-size:17px;" name="topsubmit" type="submit" class="ctabutton semibolder submitButton sentence text-white btn btn-secondary px-lg-3 px-md-1 px-sm-1 btn-lg rounded-0">Get Started</button>
        </div>              
</form>

ФОРМА 2 (та же страница посадки)

<form class="signupForm2 input-group mt-1" method="post" action="bottomconfirm">
                <div class="input-group">
                <label style="font-weight:normal!important;" for="email" class="sr-only">Enter your email address</label>
                <input style ="overflow:hidden;"  id="email" type="email" name="email" required class="sentence form-control" aria-label="Large" placeholder="enter your email address">         
                <input style="font-size:17px;" name="footersubmit" type="submit" class="ctabutton semibolder submitButton sentence text-white btn btn-secondary px-lg-3 px-md-1 px-sm-1 btn-lg rounded-0" value="Get Started"/>
                </div>              
        </form>

Я не эксперт по JavaScript или PHP, кто-то, пожалуйста, покажите мне, как решить эту проблему, я думаю, что это может быть Bootstrap JS 4.13.Любое предложение или помощь будет принята с благодарностью.Спасибо!

Ответы [ 8 ]

0 голосов
/ 22 ноября 2018

Это полный ответ на мой вопрос, спасибо @SearchingSolutions за то, что показали мне правильный способ решения этой проблемы.

Что я сделал, чтобы исправить эту проблему, так это создать 2 разные кнопки с отдельными обработчиками onclick для каждой кнопки.У каждой кнопки разные идентификаторы, и я добавил TYPE = "Submit" на обе.Я дал каждой форме свое имя и добавил небольшой JS-скрипт для отправки конкретной формы при вызове определенного обработчика onclick.

Пока что каждое электронное письмо приходит, как задумано, и все снова работает гладко.

Спасибо всем за отличные ответы!

HTML:

<form class="signupForm1 input-group mt-1" method="post" action="topconfirm">
        <div class="input-group">
        <label for="email2" class="sr-only">Enter your email address</label>
        <input style ="overflow:hidden;" id="email2" type="email" name="email2" required class="sentence form-control" aria-label="Large" placeholder="enter your email address">        
        <button style="font-size:17px;" name="topsubmit" type="submit" class="ctabutton semibolder sentence text-white btn btn-secondary px-lg-3 px-md-1 px-sm-1 btn-lg rounded-0" onclick="submit1();">Get Started"</button>
        </div>              
</form>


<form class="signupForm2 input-group mt-1" method="post" action="footerconfirm">
        <div class="input-group">
        <label style="font-weight:normal!important;" for="email3" class="sr-only">Enter your email address</label>
        <input style ="overflow:hidden;"  id="email3" type="email" name="email3" required class="sentence form-control" aria-label="Large" placeholder="enter your email address">       
        <button style="font-size:17px;" name="footersubmit" type="submit" class="ctabutton semibolder sentence text-white btn btn-secondary px-lg-3 px-md-1 px-sm-1 btn-lg rounded-0" onclick="submit2();">Get Started"</button>
        </div>              
</form>

The JS Script:

<script>
function submit1() {
    $(".signupForm1").submit();
}
function submit2() {
    $(".signupForm2").submit();
}

0 голосов
/ 21 ноября 2018

Прежде всего: Bootstrap здесь не виноват, JS тоже.И если PHP (или php mailer) тоже чистые, вы можете взглянуть на настройки почтового сервера (уточните у своего хоста).

Однако, может быть, форма отправляется дважды?Давайте проверим:

  1. открыть отладчик Google Chrome (F12)
  2. Нажмите «Сеть», отметьте «Сохранить журнал»
  3. Нажмите «Очистить» (2-й значокслева)
  4. Запустите свой обычный скрипт (т.е. заполните форму и отправьте)
  5. Вкладка «Сеть» покажет вам любой повторный вызов вашей страницы PHP

Еслипо-прежнему не получается, попробуйте следующее:

download https://github.com/PHPMailer/PHPMailer

создайте полностью пустой файл, вставьте в него свои строки PHP-рассылки.Удалите форму, ввод, javascript, isset и все остальное.Запустите этот файл, просто вызвав его, чтобы он выглядел так:

    require_once("PHPMailerAutoload.php"); // <---- only this will be required (put your path properly)

    $mail2 = new PHPMailer();
    $mail2->IsSMTP();
    $mail2->Host = "mail.domain.com"; 
    $mail2->SMTPAuth = true; 
    $mail2->Username = "user@domain.com"; 
    $mail2->Password = "password"; 
    $mail2->SMTPSecure = 'TLS';                      
    $mail2->Port = 587;                             
    $mail2->setFrom('support@domain.com', 'Support');
    $mail2->AddAddress("$email");    
    $mail2->AddReplyTo('support@domain.com');

    $mail2->Subject = "Thanks for signing up!";
    $message = '';
    $mail2->Body = $message;
    $mail2->AltBody = $message;


    if(!$mail2->Send())
    {
    echo "Message could not be sent. Please reload the page and try again. 
    <p>";
    echo "Mailer Error: " . $mail2->ErrorInfo;
    exit;
    }

godd luck

0 голосов
/ 21 ноября 2018

Я правильно понял?o_O

Конечно, с этим php-кодом вы отправляете несколько электронных писем.

просто измените свой php-код следующим образом, чтобы вы проанализировали условно разделенные mail1 и mail2:

if (!empty($_POST['topsubmit']))
{
    $mail2 = new PHPMailer();
    ...
    if(!$mail2->Send())
    ...
}

if (!empty($_POST['footersubmit']))
{
    $mail2 = new PHPMailer();
    ...
    if(!$mail2->Send())
    ...
}

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

0 голосов
/ 21 ноября 2018

Попробуйте создать отдельную функцию submit () - (с обработчиком onclick) для каждой кнопки и удалите из них value='submit', например:

    <!--signupform1-->
    <form class="signupForm1 input-group mt-1" method="post" action="topconfirm">
        <div class="input-group">
            <label for="email" class="sr-only">Enter your email address</label>
            <input style ="overflow:hidden;" id="email" type="email" name="email" required class="sentence form-control" aria-label="Large" placeholder="enter your email address">      
            <button style="font-size:17px;" name="topsubmit" type="button" class="ctabutton semibolder submitButton sentence text-white btn btn-secondary px-lg-3 px-md-1 px-sm-1 btn-lg rounded-0" onclick="submit1();">Get Started</button>
        </div>              
    </form>

    <!--signupform2-->
    <form class="signupForm2 input-group mt-1" method="post" action="bottomconfirm">
        <div class="input-group">
            <label style="font-weight:normal!important;" for="email" class="sr-only">Enter your email address</label>
            <input style ="overflow:hidden;"  id="email" type="email" name="email" required class="sentence form-control" aria-label="Large" placeholder="enter your email address">         
            <input style="font-size:17px;" name="footersubmit" type="button" class="ctabutton semibolder submitButton sentence text-white btn btn-secondary px-lg-3 px-md-1 px-sm-1 btn-lg rounded-0" onclick="submit2();" value="Get Started"/>
        </div>              
    </form>

А потом в вашем js:

<script>
    function submit1() {
        $(".signupForm1").submit();
    }
    function submit2() {
        $(".signupForm2").submit();
    }
</script>
0 голосов
/ 21 ноября 2018

Где вы обрабатываете форму отправки события? Создать отдельную функцию для отправки почты. вызывать эту функцию, когда пользователь нажимает на конкретную форму кнопка отправки. как ниже

// Your separate Mail sending function
sendMail(arg1, arg2, arg3){
   // PHP Mailer Configurations
}

// Calling your first form
if(isset($_POST['topsubmit']){
  sendMail(arg1, arg2, arg3);
}

// Calling your second form
if(isset($_POST['footersubmit']){
  sendMail(arg1, arg2, arg3);
}
0 голосов
/ 16 ноября 2018

начать сеанс на вашем сервере и сохранить информацию об отправленной почте

// Import PHPMailer classes into the global namespace
// These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require './PHPMailer-master/src/Exception.php';
require './PHPMailer-master/src/PHPMailer.php';
require './PHPMailer-master/src/SMTP.php';

// Popup Form Signup
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host = "mail.domain.com";
$mail->SMTPAuth = true;
$mail->Username = "user@domain.com"; 
$mail->Password = "password"; 
$mail->SMTPSecure = 'TLS';                           
$mail->Port = 587;
$mail->From = $email;
$mail->setFrom('$email', 'Guest');
$mail->addAddress('admin@domain.com', 'Admin');
$mail->IsHTML(true);
$mail->Subject = "New Member!";
$mail->Body = $email;
$mail->AltBody = $email;

$mail2 = new PHPMailer();
$mail2->IsSMTP();
$mail2->Host = "mail.domain.com"; 
$mail2->SMTPAuth = true; 
$mail2->Username = "user@domain.com"; 
$mail2->Password = "password"; 
$mail2->SMTPSecure = 'TLS';                      
$mail2->Port = 587;                             
$mail2->setFrom('support@domain.com', 'Support');
$mail2->AddAddress("$email");    
$mail2->AddReplyTo('support@domain.com');

    $mail2->Subject = "Thanks for signing up!";
    $message = '';
    $mail2->Body = $message;
    $mail2->AltBody = $message;


if(!$_SESSION['is_mail_1_send']){//check mail sended once
    if(!$mail2->Send())
    {
    echo "Message could not be sent. Please reload the page and try again. <p>";
    echo "Mailer Error: " . $mail2->ErrorInfo;
   $_SESSION['is_mail_1_send']=false;
 exit;
    }else{
            $_SESSION['is_mail_1_send']=true;   
    }
}
if(!$_SESSION['is_mail_2_send']){//check mail sended once
    if(!$mail->Send())
    {
    echo "Message was not received. Please reload the page and try again.<p>";
    echo "Mailer Error: " . $mail->ErrorInfo;
$_SESSION['is_mail_2_send']=false;
    exit;
    }else{
        $_SESSION['is_mail_2_send']=true;
    }
}

?>
0 голосов
/ 16 ноября 2018

Я думаю, что глубокое погружение в ваш код jQuery / JS может дать ответ, но я предполагаю, что элементы button в ваших формах вызывают какое-то событие, которое влияет на другие формы.

Вы пытались изменить все кнопки на <input type='submit'/>?

0 голосов
/ 14 ноября 2018

Я не знаю, какую версию PHPMailer вы используете, но вы также используете метод PHP mail(), что довольно иронично, поскольку вы также используете PHPMailer.Но тем не менее, вот как я это сделал в одном из моих проектов:

function sendAuthEmail($email, $token, $role) {
        try {
            $mail = new PHPMailer(true);
            $mail->SMTPDebug = 0; //SMTP Debug
            $mail->isSMTP();
            $mail->Host = "smtp.gmail.com";
            $mail->SMTPAuth = true;
            $mail->Username = 'example@example.com';
            $mail->Password = 'password';
            $mail->SMTPSecure = 'tls';
            $mail->Port = '587';
            /**
             * SMTPOptions work-around by @author : Synchro
             * This setting should removed on server and
             * mailing should be working on the server
             */
            $mail->SMTPOptions = array(
                'ssl' => array(
                    'verify_peer' => false,
                    'verify_peer_name' => false,
                    'allow_self_signed' => true
                )
            );

            // Recipients

            $mail->setFrom('no-reply@confirmation.com', 'Do Not Reply');
            $mail->addAddress($email, 'Yash Karanke'); // Add a recipient
            $mail->addReplyTo('no-reply@confirmation.com');

            // Content

            $mail->isHTML(true); // Set email format to HTML
            $mail->Subject = 'Authentication Email';
            $mail->Body = 'text to send';
            if ($mail->send()) {
                return true;
            }
            else {
                return false;
                exit();
            }
        }

        catch(Exception $e) {
            return $mail->ErrorInfo;
        }
    }

Если вы ищете более простой пример, удалите упакованную функцию и используйте только тот код, который вам нужен.Подробнее о Документах

В вашем коде вы используете if(!$mail->send()), который, я не уверен, как это работает, но вы должны использовать if($mail->send()), который рекомендуется отДокументы

Этот фрагмент кода взят из версии 6.0.3.

...