1<?php
2
3namespace splitbrain\dokuwiki\plugin\smtp;
4
5/**
6 * Class Message
7 *
8 * Overrides the Message class with what we need to reuse the SMTP mailer without using
9 * their message composer
10 *
11 * @package splitbrain\dokuwiki\plugin\smtp
12 */
13class Message extends \Tx\Mailer\Message {
14
15    protected $from;
16    protected $rcpt;
17    protected $body;
18
19    /**
20     * @param string $from Sender Address
21     * @param string $rcpt all recipients (TO, CC, BCC)
22     * @param string $body the full message body including headers
23     */
24    public function __construct($from, $rcpt, $body) {
25        $this->from = $from;
26        $this->rcpt = $rcpt;
27        $this->body = $body;
28    }
29
30    /**
31     * Return the mail only part of the from address
32     *
33     * @return string
34     */
35    public function getFromEmail() {
36        if(preg_match('#(.*?)<(.*?)>#', $this->from, $matches)) {
37            return $matches[2];
38        }
39
40        return $this->from;
41    }
42
43    /**
44     * Get a list of all recipients (mail only part)
45     *
46     * @return array
47     */
48    public function getTo() {
49        $rcpt = array();
50
51        // We need the mail only part of all recipients
52        $addresses = explode(',', $this->rcpt);
53        foreach($addresses as $addr) {
54            // parse address
55            if(preg_match('#(.*?)<(.*?)>#', $addr, $matches)) {
56                $rcpt[] = trim($matches[2]);
57            } else {
58                $rcpt[] = trim($addr);
59            }
60        }
61
62        $rcpt = array_filter($rcpt);
63        $rcpt = array_unique($rcpt);
64        return $rcpt;
65    }
66
67    /**
68     * Return the whole message body ready to be send by DATA
69     *
70     * Includes end of data signature and strips the BCC header
71     *
72     * @return string
73     */
74    public function toString() {
75        // we need to remove the BCC header here
76        $lines = preg_split('/\r?\n/', $this->body);
77        $count = count($lines);
78        for($i=0; $i<$count; $i++) {
79            if(trim($lines[$i]) === '') break; // end of headers, we're done
80            if(substr($lines[$i],0, 4) == 'Bcc:') {
81                unset($lines[$i]); // we found the Bcc: header and remove it
82                while(substr($lines[++$i],0, 1) === ' ') {
83                    unset($lines[$i]); // indented lines are header continuiation
84                }
85                break; // header removed, we're done
86            }
87        }
88        $body = join($this->CRLF, $lines);
89
90        return $body . $this->CRLF . $this->CRLF . "." . $this->CRLF;
91    }
92
93}
94