У нас есть платформа, основанная на 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 'загружает фактический почтовый просмотр ис этой точки зрения мы создали URL с помощью функции base_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 ресурсов (изображения) и обычныессылки больше.Это будет около 400 писем, запускаемых систематически с 2-минутной (или чем-то) задержкой заданием CRON.
Так, например, изображение или ссылка в письме больше не будут работать, потому что ссылка состоит из: https://nl -be / дизайн / img / интересный / серый / интересный-reizen-grey.svg вместо: https://www.mydomein.be/design/img/interesses/grey/interesse-reizen-grey.svg
Кто-нибудь когда-либо сталкивался с чем-то подобным или знает, что может пойти не так?
Это не первые письма, которые мы отправили через задания CRON, но это первыеписьма, где мы получаем совершенно неправильные URL.
Заранее спасибо!