php cron邮件包含没有主机名的链接,缺少base_url

时间:2018-12-10 17:40:12

标签: php codeigniter email cron

我们有一个基于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

enter image description here enter image description here

有人遇到过这样的事情吗,或者知道什么地方可能出错?

这些不是我们通过CRON作业发送的第一批邮件,而是我们收到完全错误的url的第一批邮件。

谢谢!

0 个答案:

没有答案