#php #email #phpmailer
#php #Адрес электронной почты #phpmailer
Вопрос:
Я использую PHPMailer 5.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'] = 'kunalkhanx@gmail.com';
$data['name'] = 'Kunal Khan';
$data['subject'] = 'Hello Mr. Kunal Khan';
$data['body'] = '<h1>Welcome in frsh Bazar</h1>';
Mail::send($data);
}
}
Комментарии:
1. Вероятно, ваш код запускается более одного раза, часто это вызвано плагинами браузера. Попробуйте добавить
$mail->Subject = $data['subject'].rand();
; если вы получаете разные номера в теме каждого сообщения, ваш код выполняется дважды.2. Вы перенаправляете пользователя куда-нибудь еще после отправки электронного письма? Потому что, если вы этого не сделаете, перезагрузка страницы может вызвать другое электронное письмо. Однажды у меня была похожая проблема, но мне приходилось форкать устаревший PHP-код (без фреймворка), и, насколько я помню, проблема заключалась в том, что $mail-> send() вызывался дважды. Вам следует использовать дополнение rand (), рекомендованное в первом комментарии.
3. О, также: используете ли вы ajax-форму для вызова отправки этого электронного письма? Потому что, если да, некоторые браузеры могут отправлять данные формы как через ajax, так и обычным способом, поэтому ваш контроллер будет запущен дважды.
4. Я попробовал функцию rand (). Я получил два разных номера. Что мне теперь делать.. Пожалуйста, помогите мне.
Ответ №1:
Вы можете получать дубликаты, потому что SingleTo несовместим с транспортом SMTP. SingleTo работает только с пересылками «sendmail» или «mail», но не с SMTP. Если вы используете SingleTo с SMTP, этот параметр просто игнорируется без какой-либо ошибки или предупреждения, и вы можете получить дубликаты. Но это крайне маловероятно, поскольку у вас есть только один адрес получателя в параметре $data [’email’]. Просто попробуйте прокомментировать строку SingleTo и посмотрите, будет ли это иметь какое-либо значение.
Протокол SMTP разработан таким образом, что вы не можете отправить одно сообщение нескольким разным получателям, у каждого из которых есть только свой собственный адрес в поле КОМУ:. Чтобы у каждого получателя было только его имя в 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);
Перед его вызовом задайте в $filepath путь к файлу, к которому у вас есть доступ.