2016-10-24 4 views
2

Я использую PHPMailer 5.2 Но каждый раз, когда я пытался отправить почту, она идет дважды. Таким образом, получатель получает одну почту дважды. Я ничего не менял по основному классу. Пожалуйста помогите.PHPMailer - Получайте 2 письма каждый раз, когда я запускаю код

class Mail{ 

    static function send($data){ 
     $mail = new PHPMailer; 

     $mail->isSMTP();          // Set mailer to use SMTP 
     $mail->Host = MAIL_HOST; // Specify main and backup SMTP servers 
     $mail->SMTPAuth = true;        // Enable SMTP authentication 
     $mail->Username = MAIL_USERNAME;     // SMTP username 
     $mail->Password = MAIL_PASSWORD;       // SMTP password 
     $mail->SMTPSecure = 'tls';       // Enable TLS encryption, `ssl` also accepted 
     $mail->Port = MAIL_PORT;         // TCP port to connect to 
     $mail->SingleTo = true; 
     $mail->setFrom(MAIL_FROM_ID, MAIL_FROM_NAME); 
     $mail->addAddress($data['email'], $data['name']);  // Add a recipient 
     $mail->isHTML(true);         // Set email format to HTML 

     $mail->Subject = $data['subject']; 
     $mail->Body = $data['body']; 

     if(!$mail->send()) { 
      return false; 
     } else { 
      return true; 
     } 
    } 
} 

Я использую этот код для отправки почты =>

class Index extends Controller{ 

    public function index(){ 

     $data['email'] = '[email protected]'; 
     $data['name'] = 'Kunal Khan'; 
     $data['subject'] = 'Hello Mr. Kunal Khan'; 
     $data['body'] = '<h1>Welcome in frsh Bazar</h1>'; 
     Mail::send($data); 
    } 
} 
+0

Скорее всего, ваш код запускается несколько раз, его часто вызывают браузерные плагины. Попробуйте добавить '$ mail-> Subject = $ data ['subject']. Rand();'; если вы получаете разные цифры в каждом сообщении, ваш код запускается дважды. – Synchro

+0

Вы перенаправляете пользователя в другое место после отправки электронной почты? Потому что, если вы этого не сделаете, перезагрузка страницы может вызвать другое электронное письмо. Раньше у меня была аналогичная проблема, но это был устаревший PHP-код (без фреймворка), который мне пришлось развить, и насколько я помню, проблема заключалась в том, что $ mail-> send() был вызван дважды. Вы должны использовать дополнение rand(), рекомендованное в первом комментарии. – Moha

+0

О, также: вы используете форму ajax для вызова этой отправки по электронной почте? Потому что, если да, некоторые браузеры могут отправлять данные формы как через ajax, так и обычно, поэтому ваш контроллер будет работать дважды. – Moha

ответ

0

Вы можете получить дубликаты, потому что SingleTo несовместим с SMTP транспорта. SingleTo работает только с транспортом «sendmail» или «mail», а не с SMTP. Если вы используете SingleTo с SMTP, этот параметр просто игнорируется без каких-либо ошибок или предупреждений, и вы можете получить дубликаты. Но это очень маловероятно, поскольку у вас есть только один адрес получателя в параметре $ data ['email']. Просто попробуйте прокомментировать строку SingleTo и посмотреть, будет ли она иметь какое-либо значение.

Протокол SMTP разработан таким образом, что вы не можете отправить одно сообщение нескольким другим получателям, каждый из которых имеет только свой адрес в поле TO:. Чтобы каждый получатель имел только свое имя в TO:, все сообщение должно быть передано снова. Это объясняет, почему SingleTo несовместимо с SMTP.

Согласно авторам библиотеки PHPMailer, SingleTo планируется отказаться от выпуска PHPMailer 6.0 и удалить в 7.0. Авторы объяснили, что лучше контролировать отправку нескольким получателям на более высоком уровне, поскольку PHPMailer не является отправителем списка рассылки. Они говорят, что использование функции PHP mail() должно быть обескуражено, потому что это чрезвычайно сложно использовать безопасно; SMTP быстрее, безопаснее и дает больше контроля и обратной связи. И поскольку SMTP несовместим с SingleTo, авторы PHPMailer удаляют SingleTo, а не SMTP.

Другая, и наиболее вероятная причина может заключаться в том, что код вызывается только дважды, в то время как PHPMailer делает все правильно. Чтобы проверить это, добавьте простое ведение журнала в свою функцию, поэтому строка журнала будет записана каждый раз, когда вы будете вызывать функцию. Таким образом, вы сможете подсчитать, сколько раз ваша функция называлась: дважды или один раз.

Если у вас есть доступ к журналу ошибок php на вашем сервере, просто добавьте error_log() в начало вашей функции send(), например.

error_log($data['email']); 

Таким образом, вы увидите из журнала, сколько раз функция была фактически вызвана. Просто не забудьте удалить строку error_log из вашего кода. Если у вас нет доступа к файлу журнала ошибок, используйте file_put_contents:

file_put_contents($filepath, date("r", time())." ". $data['email'].PHP_EOL, FILE_APPEND); 

Перед вызовом его, установите $ путь_к_файлу на имя пути файла, к которому вы имеете доступ.