使用 cron 发送电子邮件,并包含来自 moodle 的电子邮件附件


Email using cron and including attachment to email from moodle

我只想向已完成特定课程的用户发送电子邮件,并将pdf文件(完成课程的证书)作为附件添加到电子邮件中,并在特定时间使用moodle cron执行此操作。

我已经查看了一些插件以了解它是如何完成的,但我仍然不确定我应该如何做到这一点。

我需要:
1. 了解如何向电子邮件添加附件(以及使用哪个 API),
2. 我将如何使用 cron 在特定时间将电子邮件发送到所需的组,
3.如何检索已完成课程的用户,以便我可以向他们发送电子邮件(带附件)。

提前谢谢。

(我使用的是 moodle 3.0 版)

这是一个概述。

  1. 首先创建一个本地插件。例如/local/yourplugin

https://docs.moodle.org/dev/Local_plugins

  1. 然后设置消息提供程序

https://docs.moodle.org/dev/Message_API

定义('MOODLE_INTERNAL') || die();

local/yourplugin/db/messages.php

$messageproviders = array (
    'coursecompleted' => array (
    ),
  1. 然后添加事件观察者 - 您将需要响应course_completed事件

https://docs.moodle.org/dev/Event_2

/local/yourpluginname/db/events.php

有类似的东西

$observers = array(
    array(
        'eventname'   => ''core'event'course_completed',
        'callback'  => 'local_yourplugin_observer::course_completed',
    ),
);
  1. 现在添加消息代码

将类似这样的内容添加到"/local/message/classes/observer.php

defined('MOODLE_INTERNAL') || die();
class local_yourplugin_observer {
    /**
     * Triggered when 'course_completed' event is triggered.
     *
     * @param 'core'event'course_completed $event
     * @return bool
     */
    public static function course_completed('core'event'course_completed $event) {
        // Your code here.
        $message = new 'core'message'message();
        $message->component = 'local_yourplugin'; // Name of your local plugin.
        $message->name = 'coursecompleted'; // Name of message provider.
        $message->userfrom = $USER;
        $message->userto = $user;
        $message->subject = 'message subject 1';
        $message->fullmessage = 'message body';
        $message->fullmessageformat = FORMAT_MARKDOWN;
        $message->fullmessagehtml = '<p>message body</p>';
        $message->smallmessage = 'small message';
        $message->notification = '0';
        $message->contexturl = 'http://GalaxyFarFarAway.com';
        $message->contexturlname = 'Context name';
        $message->replyto = "random@example.com";
        $content = array('*' => array('header' => ' test ', 'footer' => ' test ')); // Extra content for specific processor
        $message->set_additional_content('email', $content);
        // Create a file instance.
        $usercontext = context_user::instance($user->id);
        $file = new stdClass;
        $file->contextid = $usercontext->id;
        $file->component = 'user';
        $file->filearea  = 'private';
        $file->itemid    = 0;
        $file->filepath  = '/';
        $file->filename  = '1.txt';
        $file->source    = 'test';
        $fs = get_file_storage();
        $file = $fs->create_file_from_string($file, 'file1 content');
        $message->attachment = $file;
        $messageid = message_send($message);
    }
}