diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/identity_select/identity_select.php	Thu Jan 04 15:50:29 2018 -0500
@@ -0,0 +1,94 @@
+<?php
+
+/**
+ * Identity selection based on additional message headers.
+ *
+ * On reply to a message user identity selection is based on
+ * content of standard headers i.e. From, To, Cc and Return-Path.
+ * Here you can add header(s) set by your SMTP server (e.g.
+ * Delivered-To, Envelope-To, X-Envelope-To, X-RCPT-TO) to make
+ * identity selection more accurate.
+ *
+ * Enable the plugin in config.inc.php and add your desired headers:
+ *   $config['identity_select_headers'] = array('Delivered-To');
+ *
+ * Note: 'Received' header is also supported, but has bigger impact
+ *       on performance, as it's body is potentially much bigger
+ *       than other headers used by Roundcube
+ *
+ * @author Aleksander Machniak <alec@alec.pl>
+ * @license GNU GPLv3+
+ */
+class identity_select extends rcube_plugin
+{
+    public $task = 'mail';
+
+
+    function init()
+    {
+        $this->add_hook('identity_select', array($this, 'select'));
+        $this->add_hook('storage_init', array($this, 'storage_init'));
+    }
+
+    /**
+     * Adds additional headers to supported headers list
+     */
+    function storage_init($p)
+    {
+        $rcmail = rcmail::get_instance();
+
+        if ($add_headers = (array)$rcmail->config->get('identity_select_headers', array())) {
+            $p['fetch_headers'] = trim($p['fetch_headers'] . ' ' . strtoupper(join(' ', $add_headers)));
+        }
+
+        return $p;
+    }
+
+    /**
+     * Identity selection
+     */
+    function select($p)
+    {
+        if ($p['selected'] !== null || !is_object($p['message']->headers)) {
+            return $p;
+        }
+
+        $rcmail = rcmail::get_instance();
+
+        foreach ((array)$rcmail->config->get('identity_select_headers', array()) as $header) {
+            if ($emails = $this->get_email_from_header($p['message'], $header)) {
+                foreach ($p['identities'] as $idx => $ident) {
+                    if (in_array($ident['email_ascii'], $emails)) {
+                        $p['selected'] = $idx;
+                        break 2;
+                    }
+                }
+            }
+        }
+
+        return $p;
+    }
+
+    /**
+     * Extract email address from specified message header
+     */
+    protected function get_email_from_header($message, $header)
+    {
+        $value = $message->headers->get($header, false);
+
+        if (strtolower($header) == 'received') {
+            // find first email address in all Received headers
+            $email = null;
+            foreach ((array) $value as $entry) {
+                if (preg_match('/[\s\t]+for[\s\t]+<([^>]+)>/', $entry, $matches)) {
+                    $email = $matches[1];
+                    break;
+                }
+            }
+
+            $value = $email;
+        }
+
+        return (array) $value;
+    }
+}