xref: /plugin/publish/action/mail.php (revision 2583d55d91e2f79f025cccb15e1a906389fa7c67)
1698cf656SMichael Große<?php
2698cf656SMichael Große/**
3698cf656SMichael Große * @license GNU General Public License, version 2
4698cf656SMichael Große */
5698cf656SMichael Große
6698cf656SMichael Große
7698cf656SMichael Großeif (!defined('DOKU_INC')) die();
8698cf656SMichael Große
9698cf656SMichael Große
10698cf656SMichael Große/**
11698cf656SMichael Große * Class action_plugin_publish_mail
12698cf656SMichael Große *
13698cf656SMichael Große * @author Michael Große <grosse@cosmocode.de>
14698cf656SMichael Große */
15698cf656SMichael Großeclass action_plugin_publish_mail extends DokuWiki_Action_Plugin {
16698cf656SMichael Große
17a9071e04SMichael Große    /**
18a9071e04SMichael Große     * @var helper_plugin_publish
19a9071e04SMichael Große     */
20a9071e04SMichael Große    private $hlp;
21a9071e04SMichael Große
22a9071e04SMichael Große    function __construct() {
23a9071e04SMichael Große        $this->hlp = plugin_load('helper','publish');
24a9071e04SMichael Große    }
25a9071e04SMichael Große
26698cf656SMichael Große    public function register(Doku_Event_Handler $controller) {
27698cf656SMichael Große
28698cf656SMichael Große        $controller->register_hook('IO_WIKIPAGE_WRITE', 'AFTER', $this, 'send_change_mail', array());
29698cf656SMichael Große    }
30698cf656SMichael Große
314f5c41dbSMichael Große    /**
324f5c41dbSMichael Große     * send an email to inform about a changed page
334f5c41dbSMichael Große     *
344f5c41dbSMichael Große     * @param $event
354f5c41dbSMichael Große     * @param $param
36*2583d55dSMichael Große     * @return bool false if there was an error passing the mail to the MTA
374f5c41dbSMichael Große     */
38698cf656SMichael Große    function send_change_mail(&$event, $param) {
39698cf656SMichael Große        global $ID;
40698cf656SMichael Große        global $ACT;
41698cf656SMichael Große        global $INFO;
42698cf656SMichael Große        $data = pageinfo();
43698cf656SMichael Große
44698cf656SMichael Große        if ($ACT != 'save') {
45698cf656SMichael Große            return true;
46698cf656SMichael Große        }
478bc37331SMichael Große
488bc37331SMichael Große        // IO_WIKIPAGE_WRITE is always called twice when saving a page. This makes sure to only send the mail once.
49698cf656SMichael Große        if (!$event->data[3]) {
50698cf656SMichael Große            return true;
51698cf656SMichael Große        }
52698cf656SMichael Große
538bc37331SMichael Große        // Does the publish plugin apply to this page?
548bc37331SMichael Große        if (!$this->hlp->isActive($ID)) {
558bc37331SMichael Große            return true;
568bc37331SMichael Große        }
578bc37331SMichael Große
588bc37331SMichael Große        //are we supposed to send change-mails at all?
598bc37331SMichael Große        if (!$this->getConf('send_mail_on_change')) {
608bc37331SMichael Große            return true;
618bc37331SMichael Große        }
628bc37331SMichael Große
63698cf656SMichael Große        // get mail receiver
64698cf656SMichael Große        $receiver = $this->getConf('apr_mail_receiver');
65698cf656SMichael Große
66698cf656SMichael Große        // get mail sender
67*2583d55dSMichael Große        $ReplyTo = $data['userinfo']['mail'];
68698cf656SMichael Große
69*2583d55dSMichael Große        if ($ReplyTo == $receiver) {
709e614880SMichael Große            dbglog('[publish plugin]: Mail not send. Sender and receiver are identical.');
719e614880SMichael Große            return true;
72698cf656SMichael Große        }
73698cf656SMichael Große
74698cf656SMichael Große        if ($INFO['isadmin'] == '1') {
759e614880SMichael Große            dbglog('[publish plugin]: Mail not send. Sender is admin.');
769e614880SMichael Große            return true;
77698cf656SMichael Große        }
78698cf656SMichael Große
79698cf656SMichael Große        // get mail subject
80698cf656SMichael Große        $timestamp = $data['lastmod'];
814f5c41dbSMichael Große        $datum = dformat("d.m.Y",$timestamp);
824f5c41dbSMichael Große        $uhrzeit = dformat("H:i",$timestamp);
83698cf656SMichael Große        $subject = $this->getLang('apr_mail_subject') . ': ' . $ID . ' - ' . $datum . ' ' . $uhrzeit;
84698cf656SMichael Große        dbglog($subject);
85698cf656SMichael Große
86e6206222SMichael Große        $body = $this->create_mail_body('change');
87698cf656SMichael Große
88*2583d55dSMichael Große        $mail = new Mailer();
89*2583d55dSMichael Große        $mail->to($receiver);
90*2583d55dSMichael Große        $mail->subject($subject);
91*2583d55dSMichael Große        $mail->setBody($body);
92*2583d55dSMichael Große        $mail->setHeader("Reply-To", $ReplyTo);
93*2583d55dSMichael Große        $returnStatus = $mail->send();
9412699d35SMichael Große        return $returnStatus;
95698cf656SMichael Große    }
96698cf656SMichael Große
97e6206222SMichael Große    /**
98e6206222SMichael Große     * Create the body of mails to inform about a changed or an approved page
99e6206222SMichael Große     *
100e6206222SMichael Große     * @param string $action Must either be "change" or "approve"
101e6206222SMichael Große     * @return bool|string
102e6206222SMichael Große     * @internal param $pageinfo
103e6206222SMichael Große     */
104e6206222SMichael Große    public function create_mail_body($action) {
105e6206222SMichael Große        global $ID;
1068ff23e7fSMichael Große        global $conf;
107e6206222SMichael Große        $pageinfo = pageinfo();
108bc4555caSMichael Große
1098ff23e7fSMichael Große        // get mail text
1108ff23e7fSMichael Große        $body = $this->getLang('mail_greeting') . "\n";
1118ff23e7fSMichael Große        $rev = $pageinfo['lastmod'];
1128ff23e7fSMichael Große
113bc4555caSMichael Große        if ($action === 'change') {
114bc4555caSMichael Große            $body .= $this->getLang('mail_new_suggestiopns') . "\n\n";
115bc4555caSMichael Große
1168ff23e7fSMichael Große            //If there is no approved revision show the diff to the revision before. Otherwise show the diff to the last approved revision.
1178ff23e7fSMichael Große            if($this->hlp->hasApprovals($pageinfo['meta'])) {
1188ff23e7fSMichael Große                $body .= $this->getLang('mail_changes_to_approved_rev') . "\n\n";
119e6206222SMichael Große                $difflink = $this->hlp->getDifflink($ID, $this->hlp->getLatestApprovedRevision($ID), $rev);
1208ff23e7fSMichael Große            } else {
1218ff23e7fSMichael Große                $body .= $this->getLang('mail_changes_to_previous_rev') . "\n\n";
122e6206222SMichael Große                $changelog = new PageChangelog($ID);
1238ff23e7fSMichael Große                $prevrev = $changelog->getRelativeRevision($rev, -1);
124e6206222SMichael Große                $difflink = $this->hlp->getDifflink($ID, $prevrev, $rev);
1258ff23e7fSMichael Große            }
1268ff23e7fSMichael Große            $body = str_replace('@CHANGES@', $difflink, $body);
127f31c6595SMichael Große            $apprejlink = $this->revlink($ID, $rev);
128bc4555caSMichael Große            $body = str_replace('@URL@', $apprejlink, $body);
129bc4555caSMichael Große        } elseif ($action === 'approve') {
130bc4555caSMichael Große            $body .= $this->getLang('mail_approved') . "\n\n";
131f31c6595SMichael Große            $apprejlink = $this->revlink($ID, $rev);
132bc4555caSMichael Große            $body = str_replace('@URL@', $apprejlink, $body);
133bc4555caSMichael Große        } else {
134bc4555caSMichael Große            return false;
135bc4555caSMichael Große        }
136bc4555caSMichael Große
137bc4555caSMichael Große        $body .= $this->getLang('mail_dw_signature');
1388ff23e7fSMichael Große
1398ff23e7fSMichael Große        $body = str_replace('@DOKUWIKIURL@', DOKU_URL, $body);
1408ff23e7fSMichael Große        $body = str_replace('@FULLNAME@', $pageinfo['userinfo']['name'], $body);
1418ff23e7fSMichael Große        $body = str_replace('@TITLE@', $conf['title'], $body);
1428ff23e7fSMichael Große
1438ff23e7fSMichael Große        return $body;
1448ff23e7fSMichael Große    }
1458ff23e7fSMichael Große
1468ff23e7fSMichael Große
1479e614880SMichael Große
1489e614880SMichael Große    /**
1499e614880SMichael Große     * Send approve-mail to editor of the now approved revision
1509e614880SMichael Große     *
151*2583d55dSMichael Große     * @return bool false if there was an error passing the mail to the MTA
1529e614880SMichael Große     */
15319a54b91SMichael Große    public function send_approve_mail() {
15419a54b91SMichael Große        global $ID;
15519a54b91SMichael Große        global $REV;
1568cd8852aSMichael Große
1578cd8852aSMichael Große        /** @var DokuWiki_Auth_Plugin $auth */
1588cd8852aSMichael Große        global $auth;
159698cf656SMichael Große        $data = pageinfo();
16019a54b91SMichael Große
16119a54b91SMichael Große        // get mail receiver
1623c21cb49SMichael Große        if (!$REV) {
1633c21cb49SMichael Große        $rev = $data['lastmod'];
1643c21cb49SMichael Große        } else {
1653c21cb49SMichael Große            $rev=$REV;
1663c21cb49SMichael Große        }
1678cd8852aSMichael Große        $changelog = new PageChangelog($ID);
1683c21cb49SMichael Große        $revinfo = $changelog->getRevisionInfo($rev);
1698cd8852aSMichael Große        $userinfo = $auth->getUserData($revinfo['user']);
1708cd8852aSMichael Große        $receiver = $userinfo['mail'];
171bc4555caSMichael Große
17219a54b91SMichael Große        // get mail sender
173*2583d55dSMichael Große        $ReplyTo = $data['userinfo']['mail'];
174*2583d55dSMichael Große
175*2583d55dSMichael Große        if ($ReplyTo == $receiver) {
176*2583d55dSMichael Große            return true;
177*2583d55dSMichael Große        }
178bc4555caSMichael Große
17919a54b91SMichael Große        // get mail subject
18019a54b91SMichael Große        $subject = $this->getLang('apr_mail_app_subject');
181698cf656SMichael Große
182bc4555caSMichael Große        // get mail text
183e6206222SMichael Große        $body = $this->create_mail_body('approve');
18419a54b91SMichael Große
185*2583d55dSMichael Große        $mail = new Mailer();
186*2583d55dSMichael Große        $mail->to($receiver);
187*2583d55dSMichael Große        $mail->subject($subject);
188*2583d55dSMichael Große        $mail->setBody($body);
189*2583d55dSMichael Große        $mail->setHeader("Reply-To", $ReplyTo);
190*2583d55dSMichael Große        $returnStatus = $mail->send();
1913c21cb49SMichael Große
192*2583d55dSMichael Große        return $returnStatus;
193698cf656SMichael Große    }
194698cf656SMichael Große
195698cf656SMichael Große    /**
196f31c6595SMichael Große     * create link to the specified revision
197698cf656SMichael Große     *
198f31c6595SMichael Große     * @param string $id
199f31c6595SMichael Große     * @param string $rev The timestamp of the revision
200846d3071SMichael Große     * @return string
201698cf656SMichael Große     */
202f31c6595SMichael Große    function revlink($id, $rev) {
203698cf656SMichael Große
204698cf656SMichael Große        $options = array(
205698cf656SMichael Große             'rev'=> $rev,
206698cf656SMichael Große        );
207f31c6595SMichael Große        $revlink = wl($id, $options, true, '&');
208698cf656SMichael Große
209f31c6595SMichael Große        return $revlink;
210698cf656SMichael Große    }
211698cf656SMichael Große
212698cf656SMichael Große}
213