diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index 9bf68c78..63bfe11e 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -747,10 +747,12 @@ class calendar extends rcube_plugin $organizer = $attendee; else if ($attendee['email'] && in_array(strtolower($attendee['email']), $emails)) { $old['attendees'][$i]['status'] = 'DECLINED'; + $reply_sender = $attendee['email']; } } $itip = $this->load_itip(); + $itip->set_sender_email($reply_sender); if ($organizer && $itip->send_itip_message($old, 'REPLY', $organizer, 'itipsubjectdeclined', 'itipmailbodydeclined')) $this->rc->output->command('display_message', $this->gettext(array('name' => 'sentresponseto', 'vars' => array('mailto' => $organizer['name'] ? $organizer['name'] : $organizer['email']))), 'confirmation'); else @@ -1953,6 +1955,7 @@ class calendar extends rcube_plugin } else if ($attendee['email'] && in_array(strtolower($attendee['email']), $emails)) { $event['attendees'][$i]['status'] = strtoupper($status); + $reply_sender = $attendee['email']; } } } @@ -2037,6 +2040,7 @@ class calendar extends rcube_plugin // send iTip reply if ($this->ical->method == 'REQUEST' && $organizer && !in_array(strtolower($organizer['email']), $emails) && !$error_msg) { $itip = $this->load_itip(); + $itip->set_sender_email($reply_sender); if ($itip->send_itip_message($event, 'REPLY', $organizer, 'itipsubject' . $status, 'itipmailbody' . $status)) $this->rc->output->command('display_message', $this->gettext(array('name' => 'sentresponseto', 'vars' => array('mailto' => $organizer['name'] ? $organizer['name'] : $organizer['email']))), 'confirmation'); else diff --git a/plugins/calendar/lib/calendar_itip.php b/plugins/calendar/lib/calendar_itip.php index 30fb8128..51a1c92b 100644 --- a/plugins/calendar/lib/calendar_itip.php +++ b/plugins/calendar/lib/calendar_itip.php @@ -40,6 +40,12 @@ class calendar_itip $this->cal->add_hook('smtp_connect', array($this, 'smtp_connect_hook')); } + function set_sender_email($email) + { + if (!empty($email)) + $this->sender['email'] = $email; + } + /** * Send an iTip mail message * @@ -135,8 +141,27 @@ class calendar_itip public function compose_itip_message($event, $method) { $from = rcube_idn_to_ascii($this->sender['email']); + $from_utf = rcube_idn_to_utf8($from); $sender = format_email_recipient($from, $this->sender['name']); + // truncate list attendees down to the recipient of the iTip Reply. + // constraints for a METHOD:REPLY according to RFC 5546 + if ($method == 'REPLY') { + $replying_attendee = null; $reply_attendees = array(); + foreach ($event['attendees'] as $attendee) { + if ($attendee['role'] == 'ORGANIZER') { + $reply_attendees[] = $attendee; + } + else if (strcasecmp($attedee['email'], $from) == 0 || strcasecmp($attendee['email'], $from_utf) == 0) { + $replying_attendee = $attendee; + } + } + if ($replying_attendee) { + $reply_attendees[] = $replying_attendee; + $event['attendees'] = $reply_attendees; + } + } + // compose multipart message using PEAR:Mail_Mime $message = new Mail_mime("\r\n"); $message->setParam('text_encoding', 'quoted-printable');