xref: /plugin/recommend/helper/mail.php (revision f1a0181d9dce7fda8e22f3a06639ba23f6f04d1e)
15187ba70SAnna Dabrowska<?php
25187ba70SAnna Dabrowska
35187ba70SAnna Dabrowskause dokuwiki\Extension\AuthPlugin;
45187ba70SAnna Dabrowska
55187ba70SAnna Dabrowska/**
65187ba70SAnna Dabrowska * Mail helper
75187ba70SAnna Dabrowska */
85187ba70SAnna Dabrowskaclass helper_plugin_recommend_mail extends DokuWiki_Plugin
95187ba70SAnna Dabrowska{
105187ba70SAnna Dabrowska    /**
115187ba70SAnna Dabrowska     * @param string $recipient
125187ba70SAnna Dabrowska     * @param string $sender
13*f1a0181dSAnna Dabrowska     * @param array $replacements
14*f1a0181dSAnna Dabrowska     *
155187ba70SAnna Dabrowska     * @return void
165187ba70SAnna Dabrowska     */
17*f1a0181dSAnna Dabrowska    public function sendMail($recipient, $sender, $replacements = [])
185187ba70SAnna Dabrowska    {
195187ba70SAnna Dabrowska        global $INPUT;
205187ba70SAnna Dabrowska
21*f1a0181dSAnna Dabrowska        $mailtext = file_get_contents($this->localFN('template'));
22*f1a0181dSAnna Dabrowska
23*f1a0181dSAnna Dabrowska        /* Limit to two empty lines. */
24*f1a0181dSAnna Dabrowska        $mailtext = preg_replace('/\n{4,}/', "\n\n\n", $mailtext);
25*f1a0181dSAnna Dabrowska
265187ba70SAnna Dabrowska        $mailer = new Mailer();
275187ba70SAnna Dabrowska        $mailer->bcc($recipient);
285187ba70SAnna Dabrowska        $mailer->from($sender);
295187ba70SAnna Dabrowska
305187ba70SAnna Dabrowska        $subject = $INPUT->str('subject');
315187ba70SAnna Dabrowska        $mailer->subject($subject);
32*f1a0181dSAnna Dabrowska        $mailer->setBody($mailtext, $replacements);
335187ba70SAnna Dabrowska        $mailer->send();
345187ba70SAnna Dabrowska    }
355187ba70SAnna Dabrowska
365187ba70SAnna Dabrowska    /**
375187ba70SAnna Dabrowska     * Processes recipients from input and returns an array of emails
385187ba70SAnna Dabrowska     * with user groups resolved to individual users
395187ba70SAnna Dabrowska     *
405187ba70SAnna Dabrowska     * @param string $recipients
415187ba70SAnna Dabrowska     * @return array
425187ba70SAnna Dabrowska     * @throws Exception
435187ba70SAnna Dabrowska     */
445187ba70SAnna Dabrowska    public function resolveRecipients($recipients)
455187ba70SAnna Dabrowska    {
465187ba70SAnna Dabrowska        $resolved = [];
475187ba70SAnna Dabrowska
485187ba70SAnna Dabrowska        $recipients = explode(',', $recipients);
495187ba70SAnna Dabrowska
505187ba70SAnna Dabrowska        foreach ($recipients as $recipient) {
515187ba70SAnna Dabrowska            $recipient = trim($recipient);
525187ba70SAnna Dabrowska
535187ba70SAnna Dabrowska            if ($recipient[0] === '@') {
549121cb07SAnna Dabrowska                $this->resolveGroup($resolved, $recipient);
559121cb07SAnna Dabrowska            } elseif (strpos($recipient, '@') === false) {
569121cb07SAnna Dabrowska                $this->resolveUser($resolved, $recipient);
575187ba70SAnna Dabrowska            } else {
5871a147c8SAnna Dabrowska                if (!$this->emailIsValid($recipient)) {
595187ba70SAnna Dabrowska                    throw new \Exception($this->getLang('err_recipient'));
605187ba70SAnna Dabrowska                }
615187ba70SAnna Dabrowska                $resolved[] = $recipient;
625187ba70SAnna Dabrowska            }
635187ba70SAnna Dabrowska        }
645187ba70SAnna Dabrowska        return $resolved;
655187ba70SAnna Dabrowska    }
669121cb07SAnna Dabrowska
679121cb07SAnna Dabrowska    /**
689121cb07SAnna Dabrowska     * @param array $resolved
699121cb07SAnna Dabrowska     * @param string $recipient
709121cb07SAnna Dabrowska     * @return void
719121cb07SAnna Dabrowska     * @throws Exception
729121cb07SAnna Dabrowska     */
739121cb07SAnna Dabrowska    protected function resolveGroup(&$resolved, $recipient)
749121cb07SAnna Dabrowska    {
759121cb07SAnna Dabrowska        /** @var AuthPlugin $auth */
769121cb07SAnna Dabrowska        global $auth;
779121cb07SAnna Dabrowska        if (!$auth->canDo('getUsers')) {
7871a147c8SAnna Dabrowska            throw new \Exception('Auth cannot fetch users by group.');
799121cb07SAnna Dabrowska        }
809121cb07SAnna Dabrowska
819121cb07SAnna Dabrowska        $users = $auth->retrieveUsers(0, 0, ['grps' => substr($recipient, 1)]);
829121cb07SAnna Dabrowska        foreach ($users as $user) {
839121cb07SAnna Dabrowska            $resolved[] = $user['mail'];
849121cb07SAnna Dabrowska        }
859121cb07SAnna Dabrowska    }
869121cb07SAnna Dabrowska
879121cb07SAnna Dabrowska    /**
889121cb07SAnna Dabrowska     * @param array $resolved
899121cb07SAnna Dabrowska     * @param string $recipient
909121cb07SAnna Dabrowska     * @return void
919121cb07SAnna Dabrowska     */
929121cb07SAnna Dabrowska    protected function resolveUser(&$resolved, $recipient)
939121cb07SAnna Dabrowska    {
949121cb07SAnna Dabrowska        /** @var AuthPlugin $auth */
959121cb07SAnna Dabrowska        global $auth;
969121cb07SAnna Dabrowska        $user = $auth->getUserData($recipient);
979121cb07SAnna Dabrowska        if ($user) $resolved[] = $user['mail'];
989121cb07SAnna Dabrowska    }
9971a147c8SAnna Dabrowska
10071a147c8SAnna Dabrowska    /**
10171a147c8SAnna Dabrowska     * Checks validity of given mail. With config 'wikionly' set to true
10271a147c8SAnna Dabrowska     * also checks if user with this email is known.
10371a147c8SAnna Dabrowska     *
10471a147c8SAnna Dabrowska     * @param $mail
10571a147c8SAnna Dabrowska     * @return bool
10671a147c8SAnna Dabrowska     * @throws Exception
10771a147c8SAnna Dabrowska     */
10871a147c8SAnna Dabrowska    protected function emailIsValid($mail)
10971a147c8SAnna Dabrowska    {
11071a147c8SAnna Dabrowska        if(!$this->getConf('wikionly')) return mail_isvalid($mail);
11171a147c8SAnna Dabrowska
11271a147c8SAnna Dabrowska        /** @var AuthPlugin $auth */
11371a147c8SAnna Dabrowska        global $auth;
11471a147c8SAnna Dabrowska        if (!$auth->canDo('getUsers')) {
11571a147c8SAnna Dabrowska            throw new \Exception('Auth cannot fetch users by email.');
11671a147c8SAnna Dabrowska        }
11771a147c8SAnna Dabrowska
11871a147c8SAnna Dabrowska        $user = $auth->retrieveUsers(0, 1, ['mail' => $mail]);
11971a147c8SAnna Dabrowska        return (bool)$user;
12071a147c8SAnna Dabrowska    }
1215187ba70SAnna Dabrowska}
122