Mercurial > hg > rc1
comparison plugins/identity_select/identity_select.php @ 0:1e000243b222
vanilla 1.3.3 distro, I hope
| author | Charlie Root |
|---|---|
| date | Thu, 04 Jan 2018 15:50:29 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:1e000243b222 |
|---|---|
| 1 <?php | |
| 2 | |
| 3 /** | |
| 4 * Identity selection based on additional message headers. | |
| 5 * | |
| 6 * On reply to a message user identity selection is based on | |
| 7 * content of standard headers i.e. From, To, Cc and Return-Path. | |
| 8 * Here you can add header(s) set by your SMTP server (e.g. | |
| 9 * Delivered-To, Envelope-To, X-Envelope-To, X-RCPT-TO) to make | |
| 10 * identity selection more accurate. | |
| 11 * | |
| 12 * Enable the plugin in config.inc.php and add your desired headers: | |
| 13 * $config['identity_select_headers'] = array('Delivered-To'); | |
| 14 * | |
| 15 * Note: 'Received' header is also supported, but has bigger impact | |
| 16 * on performance, as it's body is potentially much bigger | |
| 17 * than other headers used by Roundcube | |
| 18 * | |
| 19 * @author Aleksander Machniak <alec@alec.pl> | |
| 20 * @license GNU GPLv3+ | |
| 21 */ | |
| 22 class identity_select extends rcube_plugin | |
| 23 { | |
| 24 public $task = 'mail'; | |
| 25 | |
| 26 | |
| 27 function init() | |
| 28 { | |
| 29 $this->add_hook('identity_select', array($this, 'select')); | |
| 30 $this->add_hook('storage_init', array($this, 'storage_init')); | |
| 31 } | |
| 32 | |
| 33 /** | |
| 34 * Adds additional headers to supported headers list | |
| 35 */ | |
| 36 function storage_init($p) | |
| 37 { | |
| 38 $rcmail = rcmail::get_instance(); | |
| 39 | |
| 40 if ($add_headers = (array)$rcmail->config->get('identity_select_headers', array())) { | |
| 41 $p['fetch_headers'] = trim($p['fetch_headers'] . ' ' . strtoupper(join(' ', $add_headers))); | |
| 42 } | |
| 43 | |
| 44 return $p; | |
| 45 } | |
| 46 | |
| 47 /** | |
| 48 * Identity selection | |
| 49 */ | |
| 50 function select($p) | |
| 51 { | |
| 52 if ($p['selected'] !== null || !is_object($p['message']->headers)) { | |
| 53 return $p; | |
| 54 } | |
| 55 | |
| 56 $rcmail = rcmail::get_instance(); | |
| 57 | |
| 58 foreach ((array)$rcmail->config->get('identity_select_headers', array()) as $header) { | |
| 59 if ($emails = $this->get_email_from_header($p['message'], $header)) { | |
| 60 foreach ($p['identities'] as $idx => $ident) { | |
| 61 if (in_array($ident['email_ascii'], $emails)) { | |
| 62 $p['selected'] = $idx; | |
| 63 break 2; | |
| 64 } | |
| 65 } | |
| 66 } | |
| 67 } | |
| 68 | |
| 69 return $p; | |
| 70 } | |
| 71 | |
| 72 /** | |
| 73 * Extract email address from specified message header | |
| 74 */ | |
| 75 protected function get_email_from_header($message, $header) | |
| 76 { | |
| 77 $value = $message->headers->get($header, false); | |
| 78 | |
| 79 if (strtolower($header) == 'received') { | |
| 80 // find first email address in all Received headers | |
| 81 $email = null; | |
| 82 foreach ((array) $value as $entry) { | |
| 83 if (preg_match('/[\s\t]+for[\s\t]+<([^>]+)>/', $entry, $matches)) { | |
| 84 $email = $matches[1]; | |
| 85 break; | |
| 86 } | |
| 87 } | |
| 88 | |
| 89 $value = $email; | |
| 90 } | |
| 91 | |
| 92 return (array) $value; | |
| 93 } | |
| 94 } |
