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