为了账号安全,请及时绑定邮箱和手机立即绑定

如何在php中发送邮件之前向用户发送响应

如何在php中发送邮件之前向用户发送响应

Go
开满天机 2021-09-18 21:30:36
我正在开发一个项目,有两个过程。发送邮件。将响应发送回用户。我需要做这一切,但这需要很多时间。所以现在我正在考虑使用多线程。任何人都可以帮助如何在 php 中实现这一目标吗?我只需要尽快发送回复。这是我的代码,我创建了一个发送邮件的功能,成功完成邮件发送后,我将使用 JSON 编码向用户发送响应。/删除预订功能/public function deleteBooking($id){     $where = array('id'=>$id);      $bookingData = $this->Cnc_model->getData('bookings', array('*'), array('id'=>$id));      if(!empty($bookingData)){        if(!empty($bookingData[0]['estimator_id']) && $bookingData[0]['estimator_id'] != 0){                    $name = $this->Cnc_model->getData('users',array('username', 'email'), array('user_id'=> $bookingData[0]['estimator_id']));                       $estimator_name = $name[0]['username'];                    $estimator_mail = $name[0]['email'];                     }                if($bookingData[0]['customer_id'] != 0){                    $cname = $this->Cnc_model->getData('customers',array('name', 'office_contact_email'), array('id'=> $bookingData[0]['customer_id']));                       $customer_name = $cname[0]['name'];                    $customer_mail = $cname[0]['office_contact_email'];                }                $mailHeading = 'Booking Deleted';                $smallHeading = 'Your Booking with '.$customer_name.' on '.$bookingData[0]['booking_date'].' has been deleted by admin.';                $subject = 'Booking Deleted';                $smallHeadingcustomer = 'Your Booking with '.$estimator_name.' on '.$bookingData[0]['booking_date'].' has been deleted by admin.';                $status = 5;/*这里我调用发送电子邮件功能*/                $result = $this->emailSent($id, $mailHeading, $smallHeading, $subject, $smallHeadingcustomer,$status);
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

您可以使用 ignore_user_abort(true); 设置客户端断开连接是否应导致脚本中止。这将断开与您的当前连接,然后将响应发送到前端,但仍会执行其余代码。


 ignore_user_abort(true);


    ob_start();

    echo "success";


    $serverProtocole = filter_input(INPUT_SERVER, 'SERVER_PROTOCOL', FILTER_SANITIZE_STRING);

    header($serverProtocole.' 200 OK');

    header('Content-Encoding: none');

    header('Content-Length: '.ob_get_length());

    header('Connection: close');


    ob_end_flush();

    ob_flush();

    flush();

最初对您的 API 使用后端验证,然后使用上面的代码发送响应,然后您可以编写代码给您的用户发送电子邮件,这样前端将获得响应并执行脚本,直到遇到返回或死亡;这种方法的问题是,如果发送电子邮件时出现错误,您无法向前端发送响应。


否则,您可以在代码中使用邮件队列稍后完成这项工作


查看完整回答
反对 回复 2021-09-18
?
BIG阳

TA贡献1859条经验 获得超6个赞

这取决于你想走多深。理想的方法是运行 RabbitMQ 或 Gearman 服务器并设置“发送邮件”作业供它们处理。提交作业非常快,并且允许脚本完成并将响应发送回用户,但当然这将涉及设置更多基础设施、编写/维护更多代码来处理作业和处理重试/错误状态。

可能问题最少的方法是运行将中继邮件的本地邮件服务器。传递应该非常快,会给出更好的“有效”响应(至少用户会知道邮件已传递到本地邮件服务器)并允许脚本继续。如果电子邮件失败,则本地邮件服务器会将其作为退回给管理员或“发件人”用户进行处理。

概述一种方式在这里将意味着发送响应第一个,然后处理邮件-这意味着它不可能报告故障给用户。不理想,但这取决于您的情况 - 也许管理员处理失败的消息并可以重新发送?



查看完整回答
反对 回复 2021-09-18
  • 2 回答
  • 0 关注
  • 235 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信