我们有一个基于Codeigniter PHP的平台,偶尔会通过CRON Job发送邮件。 为了不使系统过载,我们将整个邮件作为BLOB放置在数据库队列中,然后每隔x分钟发送一次来自该队列的邮件。
$mailTemplatePartials = load_template_passive_mail_volunteer($region->region_name);
//Create and sent a mail to volunteers (passive matching of vacancies)
$this->email->from(GENERAL_MAIL, 'Give a Day');
$this->email->to($vol->email);
$this->email->subject(lang("new_vacancies_matches"));
$message = $this->load->view($mailTemplatePartials, $mail_data, TRUE);
$this->email->message($message);
//Insert mail in the mail_queue_passive database table
insert_mail_in_passive_queue(GENERAL_MAIL, $vol->email, lang("new_vacancies_matches"), $this->email);
“ load_template_passive_mail_volunteer”加载实际的邮件视图,在此视图中,我们使用base_url()函数构建了URL。例如:
<img alt="" src="<?php echo base_url() . 'design/img/interesses/grey/' . $interest->img; ?>" width="30" style="max-width: 1188px; border-radius: 0%;" class="mcnImage">
“ insert_mail_in_passive_queue”会将整个邮件插入数据库队列:
function insert_mail_in_passive_queue($from, $to, $subject, $mail_object) {
$CI = get_instance();
$CI->load->model('mail/mailQueuePassive_model');
$mail = new stdClass();
$mail->from = $from;
$mail->to = $to;
$mail->subject = $subject;
$mail->mail_object = serialize($mail_object);
return $CI->mailQueuePassive_model->add($mail);
}
因此,现在在我们的数据库队列中,我们有一个具有正确布局和链接的完整邮件对象,整个邮件内容已经就位。因此,我们无需在CRON中创建电子邮件的内容,而只需将其发送即可。
然后是CRON方法,该方法实际上检查邮件队列中是否有要发送的邮件:
public function sendPassiveQueuingMails() {
ini_set('max_execution_time', 0); //Make sure the script does not time out
// this function can only be called from the command line
if (!$this->input->is_cli_request()) {
echo "Access is only allowed from the command line";
return;
}
$this->load->model('mail/mailQueuePassive_model');
$mailsToSent = $this->mailQueuePassive_model->getAllNotSent();
foreach ($mailsToSent as $mail) {
$this->mailQueuePassive_model->setLock($mail->mail_id);
$mailObject = unserialize($mail->mail_object);
$mailSent = $mailObject->send();
if ($mailSent == 1) {
$this->mailQueuePassive_model->setSentSuccessfull($mail->mail_id);
$this->mailQueuePassive_model->setUnlock($mail->mail_id);
} else {
//In een future uitbreiding kan hier de "amount of retries" ook telkens met 1 verhoogd worden, kan gebruikt worden door een slim algoritme (kolom moet nog aangemaakt worden dan)
$this->mailQueuePassive_model->setUnlock($mail->mail_id);
}
}
}
如果我们用一封邮件测试该系统,则它可以完美工作。 邮件到达并包含正确的图像和返回到我们网站的URL。
但是当我们使用实时数据激活它时,我们发现由于某种原因,邮件不再在资源URL(图像)和纯链接中包含主机名。 CRON作业将系统地触发约400封邮件,并延迟2分钟(或类似时间)。
因此,例如,图像或邮件中的链接将不再起作用,因为该链接包含: https://nl-be/design/img/interesses/grey/interesse-reizen-grey.svg 代替: https://www.mydomein.be/design/img/interesses/grey/interesse-reizen-grey.svg
有人遇到过这样的事情吗,或者知道什么地方可能出错?
这些不是我们通过CRON作业发送的第一批邮件,而是我们收到完全错误的url的第一批邮件。
谢谢!