|
|
@ -249,18 +249,7 @@ else {
|
|
|
|
$MESSAGE->compose = array();
|
|
|
|
$MESSAGE->compose = array();
|
|
|
|
|
|
|
|
|
|
|
|
// get user's identities
|
|
|
|
// get user's identities
|
|
|
|
$MESSAGE->identities = $RCMAIL->user->list_identities();
|
|
|
|
$MESSAGE->identities = $RCMAIL->user->list_identities(null, true);
|
|
|
|
if (count($MESSAGE->identities))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
foreach ($MESSAGE->identities as $idx => $ident) {
|
|
|
|
|
|
|
|
$ident['email'] = format_email($ident['email']);
|
|
|
|
|
|
|
|
$email = format_email(rcube_idn_to_utf8($ident['email']));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$MESSAGE->identities[$idx]['email_ascii'] = $ident['email'];
|
|
|
|
|
|
|
|
$MESSAGE->identities[$idx]['ident'] = format_email_recipient($ident['email'], $ident['name']);
|
|
|
|
|
|
|
|
$MESSAGE->identities[$idx]['email'] = $email;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Set From field value
|
|
|
|
// Set From field value
|
|
|
|
if (!empty($_POST['_from'])) {
|
|
|
|
if (!empty($_POST['_from'])) {
|
|
|
@ -270,92 +259,10 @@ else if (!empty($COMPOSE['param']['from'])) {
|
|
|
|
$MESSAGE->compose['from'] = $COMPOSE['param']['from'];
|
|
|
|
$MESSAGE->compose['from'] = $COMPOSE['param']['from'];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (count($MESSAGE->identities)) {
|
|
|
|
else if (count($MESSAGE->identities)) {
|
|
|
|
$a_recipients = array();
|
|
|
|
$ident = rcmail_identity_select($MESSAGE, $MESSAGE->identities, $compose_mode);
|
|
|
|
$a_names = array();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// extract all recipients of the reply-message
|
|
|
|
|
|
|
|
if (is_object($MESSAGE->headers) && in_array($compose_mode, array(RCUBE_COMPOSE_REPLY, RCUBE_COMPOSE_FORWARD)))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
$a_to = rcube_mime::decode_address_list($MESSAGE->headers->to, null, true, $MESSAGE->headers->charset);
|
|
|
|
|
|
|
|
foreach ($a_to as $addr) {
|
|
|
|
|
|
|
|
if (!empty($addr['mailto'])) {
|
|
|
|
|
|
|
|
$a_recipients[] = format_email($addr['mailto']);
|
|
|
|
|
|
|
|
$a_names[] = $addr['name'];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!empty($MESSAGE->headers->cc)) {
|
|
|
|
|
|
|
|
$a_cc = rcube_mime::decode_address_list($MESSAGE->headers->cc, null, true, $MESSAGE->headers->charset);
|
|
|
|
|
|
|
|
foreach ($a_cc as $addr) {
|
|
|
|
|
|
|
|
if (!empty($addr['mailto'])) {
|
|
|
|
|
|
|
|
$a_recipients[] = format_email($addr['mailto']);
|
|
|
|
|
|
|
|
$a_names[] = $addr['name'];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$from_idx = null;
|
|
|
|
|
|
|
|
$found_idx = null;
|
|
|
|
|
|
|
|
$default_identity = 0; // default identity is always first on the list
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Select identity
|
|
|
|
|
|
|
|
foreach ($MESSAGE->identities as $idx => $ident) {
|
|
|
|
|
|
|
|
// use From header
|
|
|
|
|
|
|
|
if (in_array($compose_mode, array(RCUBE_COMPOSE_DRAFT, RCUBE_COMPOSE_EDIT))) {
|
|
|
|
|
|
|
|
if ($MESSAGE->headers->from == $ident['ident']) {
|
|
|
|
|
|
|
|
$from_idx = $idx;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// reply to yourself
|
|
|
|
|
|
|
|
else if ($compose_mode == RCUBE_COMPOSE_REPLY && $MESSAGE->headers->from == $ident['ident']) {
|
|
|
|
|
|
|
|
$from_idx = $idx;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// use replied message recipients
|
|
|
|
|
|
|
|
else if (($found = array_search($ident['email_ascii'], $a_recipients)) !== false) {
|
|
|
|
|
|
|
|
if ($found_idx === null) {
|
|
|
|
|
|
|
|
$found_idx = $idx;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// match identity name
|
|
|
|
|
|
|
|
if ($a_names[$found] && $ident['name'] && $a_names[$found] == $ident['name']) {
|
|
|
|
|
|
|
|
$from_idx = $idx;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// If matching by name+address doesn't found any amtches, get first found address (identity)
|
|
|
|
|
|
|
|
if ($from_idx === null) {
|
|
|
|
|
|
|
|
$from_idx = $found_idx;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Try Return-Path
|
|
|
|
|
|
|
|
if ($from_idx === null && ($return_path = $MESSAGE->headers->others['return-path'])) {
|
|
|
|
|
|
|
|
foreach ($MESSAGE->identities as $idx => $ident) {
|
|
|
|
|
|
|
|
if (strpos($return_path, str_replace('@', '=', $ident['email_ascii']).'@') !== false) {
|
|
|
|
|
|
|
|
$from_idx = $idx;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Fallback using Delivered-To
|
|
|
|
|
|
|
|
if ($from_idx === null && ($delivered_to = $MESSAGE->headers->others['delivered-to'])) {
|
|
|
|
|
|
|
|
foreach ($MESSAGE->identities as $idx => $ident) {
|
|
|
|
|
|
|
|
if (in_array($ident['email_ascii'], $delivered_to)) {
|
|
|
|
|
|
|
|
$from_idx = $idx;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$ident = $MESSAGE->identities[$from_idx !== null ? $from_idx : $default_identity];
|
|
|
|
|
|
|
|
$from_id = $ident['identity_id'];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$MESSAGE->compose['from_email'] = $ident['email'];
|
|
|
|
$MESSAGE->compose['from_email'] = $ident['email'];
|
|
|
|
$MESSAGE->compose['from'] = $from_id;
|
|
|
|
$MESSAGE->compose['from'] = $ident['identity_id'];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Set other headers
|
|
|
|
// Set other headers
|
|
|
@ -472,6 +379,92 @@ $MESSAGE_BODY = rcmail_prepare_message_body();
|
|
|
|
|
|
|
|
|
|
|
|
/****** compose mode functions ********/
|
|
|
|
/****** compose mode functions ********/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function rcmail_identity_select($MESSAGE, $identities, $compose_mode)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
$a_recipients = array();
|
|
|
|
|
|
|
|
$a_names = array();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// extract all recipients of the reply-message
|
|
|
|
|
|
|
|
if (is_object($MESSAGE->headers) && in_array($compose_mode, array(RCUBE_COMPOSE_REPLY, RCUBE_COMPOSE_FORWARD))) {
|
|
|
|
|
|
|
|
$a_to = rcube_mime::decode_address_list($MESSAGE->headers->to, null, true, $MESSAGE->headers->charset);
|
|
|
|
|
|
|
|
foreach ($a_to as $addr) {
|
|
|
|
|
|
|
|
if (!empty($addr['mailto'])) {
|
|
|
|
|
|
|
|
$a_recipients[] = format_email($addr['mailto']);
|
|
|
|
|
|
|
|
$a_names[] = $addr['name'];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!empty($MESSAGE->headers->cc)) {
|
|
|
|
|
|
|
|
$a_cc = rcube_mime::decode_address_list($MESSAGE->headers->cc, null, true, $MESSAGE->headers->charset);
|
|
|
|
|
|
|
|
foreach ($a_cc as $addr) {
|
|
|
|
|
|
|
|
if (!empty($addr['mailto'])) {
|
|
|
|
|
|
|
|
$a_recipients[] = format_email($addr['mailto']);
|
|
|
|
|
|
|
|
$a_names[] = $addr['name'];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$from_idx = null;
|
|
|
|
|
|
|
|
$found_idx = null;
|
|
|
|
|
|
|
|
$default_identity = 0; // default identity is always first on the list
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Select identity
|
|
|
|
|
|
|
|
foreach ($identities as $idx => $ident) {
|
|
|
|
|
|
|
|
// use From header
|
|
|
|
|
|
|
|
if (in_array($compose_mode, array(RCUBE_COMPOSE_DRAFT, RCUBE_COMPOSE_EDIT))) {
|
|
|
|
|
|
|
|
if ($MESSAGE->headers->from == $ident['ident']) {
|
|
|
|
|
|
|
|
$from_idx = $idx;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// reply to yourself
|
|
|
|
|
|
|
|
else if ($compose_mode == RCUBE_COMPOSE_REPLY && $MESSAGE->headers->from == $ident['ident']) {
|
|
|
|
|
|
|
|
$from_idx = $idx;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// use replied message recipients
|
|
|
|
|
|
|
|
else if (($found = array_search($ident['email_ascii'], $a_recipients)) !== false) {
|
|
|
|
|
|
|
|
if ($found_idx === null) {
|
|
|
|
|
|
|
|
$found_idx = $idx;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// match identity name
|
|
|
|
|
|
|
|
if ($a_names[$found] && $ident['name'] && $a_names[$found] == $ident['name']) {
|
|
|
|
|
|
|
|
$from_idx = $idx;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// If matching by name+address doesn't found any amtches, get first found address (identity)
|
|
|
|
|
|
|
|
if ($from_idx === null) {
|
|
|
|
|
|
|
|
$from_idx = $found_idx;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Try Return-Path
|
|
|
|
|
|
|
|
if ($from_idx === null && ($return_path = $MESSAGE->headers->others['return-path'])) {
|
|
|
|
|
|
|
|
foreach ($identities as $idx => $ident) {
|
|
|
|
|
|
|
|
if (strpos($return_path, str_replace('@', '=', $ident['email_ascii']).'@') !== false) {
|
|
|
|
|
|
|
|
$from_idx = $idx;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Fallback using Delivered-To
|
|
|
|
|
|
|
|
if ($from_idx === null && ($delivered_to = $MESSAGE->headers->others['delivered-to'])) {
|
|
|
|
|
|
|
|
foreach ($identities as $idx => $ident) {
|
|
|
|
|
|
|
|
if (in_array($ident['email_ascii'], $delivered_to)) {
|
|
|
|
|
|
|
|
$from_idx = $idx;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return $identities[$from_idx !== null ? $from_idx : $default_identity];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function rcmail_compose_headers($attrib)
|
|
|
|
function rcmail_compose_headers($attrib)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
global $MESSAGE;
|
|
|
|
global $MESSAGE;
|
|
|
|