/
Addresses.php
192 lines (173 loc) · 4.9 KB
/
Addresses.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
<?php
/**
* Copyright 2014-2016 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (LGPL). If you
* did not receive this file, see http://www.horde.org/licenses/lgpl21.
*
* @category Horde
* @copyright 2014-2016 Horde LLC
* @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
* @package Mime
*/
/**
* This class represents address fields (RFC 5322).
*
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @copyright 2014-2016 Horde LLC
* @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
* @package Mime
* @since 2.5.0
*/
class Horde_Mime_Headers_Addresses
extends Horde_Mime_Headers_Element_Single
implements Horde_Mime_Headers_Element_Address
{
/**
* By default, if more than 1 address header is found, the addresses are
* appended together into a single field. Set this value to false to
* ignore all but the *last* header.
*
* @var boolean
*/
public $append_addr = true;
/**
*/
public function __clone()
{
$this->_values = clone $this->_values;
}
/**
*/
public function __get($name)
{
switch ($name) {
case 'full_value':
case 'value':
case 'value_single':
return strval($this->_values);
}
return parent::__get($name);
}
/**
*/
public function getAddressList($first = false)
{
return $first
? $this->_values
: array($this->_values);
}
protected function _decodeMime($value)
{
if (is_object($value)) {
return $value;
}
return Horde_Mime::decode($value);
}
/**
*
* @throws Horde_Mime_Exception
*/
protected function _setValue($value)
{
/* @todo Implement with traits */
$rfc822 = new Horde_Mail_Rfc822();
// Ensure values are MIME decoded.
// @see Bug 14456
if (is_array($value)) {
foreach ($value as &$adr) {
$adr = $this->_decodeMime($adr);
}
} else {
$value = $this->_decodeMime($value);
}
try {
$addr_list = $rfc822->parseAddressList($value);
} catch (Horde_Mail_Exception $e) {
throw new Horde_Mime_Exception($e);
}
foreach ($addr_list as $ob) {
if ($ob instanceof Horde_Mail_Rfc822_Group) {
$ob->groupname = $this->_sanityCheck($ob->groupname);
} else {
$ob->personal = $this->_sanityCheck($ob->personal);
}
}
switch (Horde_String::lower($this->name)) {
case 'bcc':
case 'cc':
case 'from':
case 'to':
/* Catch malformed undisclosed-recipients entries. */
if ((count($addr_list) == 1) &&
preg_match("/^\s*undisclosed-recipients:?\s*$/i", $addr_list[0]->bare_address)) {
$addr_list = new Horde_Mail_Rfc822_List(
'undisclosed-recipients:;'
);
}
break;
}
if ($this->append_addr && $this->_values) {
$this->_values->add($addr_list);
} else {
$this->_values = $addr_list;
}
}
/**
*/
public static function getHandles()
{
return array(
// Mail: RFC 3798
'disposition-notification-to',
// Mail: RFC 5322 (Address)
'from',
'to',
'cc',
'bcc',
'reply-to',
'sender'
);
}
/**
* @param array $opts See doSendEncode().
*/
protected function _sendEncode($opts)
{
return self::doSendEncode($this->getAddressList(), $opts);
}
/**
* Do send encoding for addresses.
*
* Needed as a static function because it is used by both single and
* multiple address headers.
*
* @todo Implement with traits.
*
* @param array $alist An array of Horde_Mail_Rfc822_List objects.
* @param array $opts Additional options:
* - charset: (string) Encodes the headers using this charset.
* DEFAULT: UTF-8
* - defserver: (string) The default domain to append to mailboxes.
* DEFAULT: No default name.
*/
public static function doSendEncode($alist, array $opts = array())
{
$out = array();
foreach ($alist as $ob) {
if (!empty($opts['defserver'])) {
foreach ($ob->raw_addresses as $ob2) {
if (is_null($ob2->host)) {
$ob2->host = $opts['defserver'];
}
}
}
$out[] = $ob->writeAddress(array(
'encode' => empty($opts['charset']) ? null : $opts['charset'],
'idn' => true
));
}
return $out;
}
}