2015-10-29 5 views
3

Потребуется время для отправки почты пользователю и выполнения кода до заголовка местоположения. Я хочу запустить код отправки почты в другой поток, поэтому не потребуется время для поиска или загрузки этой конкретной страницы.Как отправить асинхронную почту?

$sql = "SELECT email FROM user_info where username = ?"; 

     $statement = $db->prepare($sql); 
     $statement->bindParam(1, $cmtTo); 
     $statement->execute(); 

     $row = $statement->fetch(); 

//  echo $row['email']; 

     $mailSender = new PuzzleEmailSender(); 
     $body = "<html> 
        <body> 
      <h2 style=\"font-weight:bold;font-size:24px;font-family:Helvetica,Arial,sans-serif;line-height:26px;color:#999;margin:0\"><img class=\"navbarimg\" src=\"" alt=\"/></h2><br> 
          <div style=\"font:normal 14px Helvetica,Arial,sans-serif;line-height:19px;color:#333\"> 
       <p>Hi, <strong>" . $cmtTo . "</strong> </p> 
           <p><strong>" . $cmtBy . "</strong> expressed comment on your puzzle answer</strong></p> 
       <p><a style=\"text-decoration:underline;color:#00aff0;font-weight:bold\" href='" "' target=\"_blank\">Click on the link to check</a></p>         
       <p>Team,</p> 
       <p style=\"font-weight:bold;font-size:15px;line-height:24px;font-family:Arial,Helvetica,sans-serif;color:#666;margin:0\"> 
       " "</p></div> 
          </div> 
        </body> 
     </html>"; 

     $subject = "Comment On Your Answer"; 

     $mailSender->sendQueryEmail($row['email'], "", $body, $subject, "", false); 

     header("Location: puzzleDisplay"); 
+0

Включите отправку почты в собственный файл. Позвоните, что с 'exec' –

+0

Отправка одного письма не займет много времени. Это не стоит хлопот создания другого потока или кроны для него. –

+0

в этом случае вы должны проверить laravel jobs – dynamic

ответ

1

создать таблицу: mail_queue

поля: идентификатор, адрес электронной почты, при условии, тело

изменение:

$mailSender->sendQueryEmail($row['email'], "", $body, $subject, "", false); 

в

$sql = "INSERT INTO mail_queue SET email = ?, body = ?, subject = ?" 
$statement = $db->prepare($sql); 
$statement->bindParam(1, $row['email']); 
$statement->bindParam(2, $body); 
$statement->bindParam(3, $subject); 
$statement->execute(); 

создать сценарий: mail_queue.php что будет делать выборку всех сообщений электронной почты и сделать почты отправить, а затем удалить запись после отправки

положить в кронтаб: * * * * * PHP mail_queue.php

0

Вы можете отправить почту в фоновом режиме. Добавьте задачу отправки в очередь, а затем очередь будет выполняться время от времени.

Это может быть достигнуто разными способами:

  • Вы можете использовать постоянные очереди хранения. Как вы храните почту в DB. Затем скрипт из cron будет проверять неотправленные письма и отправлять их по одному .

  • Вы можете использовать gearman-job-server. Заполните свою почту на сервере заданий из вашего основного сценария. Затем напишите код для отправки электронной почты в сценариях gearman worker.

  • Вы можете использовать сервисные решения для хостинга, такие как: iron.io. Laravel очередь использует железо api.

Смежные вопросы