【发布时间】:2015-04-28 11:54:40
【问题描述】:
我想从我的 Laravel 应用程序发送日历邀请。我希望这些邀请在 Outlook 中显示接受/拒绝/建议新时间/也许按钮,但由于某种原因我无法让它们显示
我需要这个,因为我想实现这个:
我的代码:
$icalendar = IcalendarUtil::genEvent(
array('Me', 'me@example.com'),
new DateTime(),
null,
array(
'example@example.com' => 'John Doe'
),
'Test subject',
'Test location',
'Test Description',
true,
true
);
Mail::send('nada', array(), function($message) use($icalendar)
{
$message->from('example@example.com', 'John Doe');
$message->to('me@example.com')->subject('Test Calendar Event');
$attachment = Swift_Attachment::newInstance($icalendar, 'event.ics', 'text/calendar');
$attachment->getHeaders()->addTextHeader('Content-Type', 'text/calendar');
$attachment->getHeaders()->addTextHeader('Content-Transfer-Encoding', '7bit');
$attachment->getHeaders()->addTextHeader('X-Mailer', 'Microsoft Office Outlook 12.0');
$attachment->getHeaders()->addTextHeader('method', 'REQUEST');
$attachment->getHeaders()->addTextHeader('charset', 'iso-8859-1');
$message->attachAttachment($attachment);
});
$message->attachAttachment($attachment);
是我添加到 Illuminate\Mail\Message.php 的函数,用于添加使用 newInstance 创建的 Swift_Attachment。代码:
public function attachAttachment($attachment)
{
$this->prepAttachment($attachment);
}
IcalendarUtil 类是由Arun Poudel 提供给我的:
<?php
/**
* iCalendar util
*/
class IcalendarUtil
{
/**
* Generates a iCalendar event.
*
* @param array $organizer
* @param DateTime $from_date
* @param DateTime $to_date
* @param array $attendees
* @param string $subject
* @param string $location
* @param string $description
* @param bool $all_day_event
* @param bool $rsvp
* @return string
* @static
* @throws cbmException
*/
static public function genEvent(array $organizer, DateTime $from_date, DateTime $to_date = null, array $attendees = null, $subject = null, $location = null, $description = null, $all_day_event = false, $rsvp = true)
{
if (!$all_day_event && $to_date === null)
{
throw new Exception('to_date is required when the event is not an all day event');
}
$organizer_name = $organizer[0];
$ical = "BEGIN:VCALENDAR\r\n";
$ical .= "VERSION:2.0\r\n";
$ical .= "PRODID:-//Microsoft Corporation//Outlook 14.0 MIMEDIR//EN\r\n";
$ical .= "METHOD:REQUEST\r\n";
$ical .= "X-MS-OLK-FORCEINSPECTOROPEN:TRUE\r\n";
$ical .= "BEGIN:VTIMEZONE\r\n";
$ical .= sprintf("TZID:%s\r\n", date('T'));
$ical .= "BEGIN:STANDARD\r\n";
$ical .= "DTSTART:16010101T000000\r\n";
$ical .= "TZOFFSETFROM:+0545\r\n";
$ical .= "TZOFFSETTO:+0545\r\n";
$ical .= "END:STANDARD\r\n";
$ical .= "END:VTIMEZONE\r\n";
$ical .= "BEGIN:VEVENT\r\n";
$ical .= sprintf("UID:%s\r\n", rand());
$ical .= sprintf("ORGANIZER;CN=\"%s\":MAILTO:%s\r\n", $organizer_name, $organizer[1]);
foreach ($attendees as $email => $name)
{
$ical .= sprintf("ATTENDEE;");
if ($name !== null)
{
$ical .= sprintf("CN=\"%s\";", $name);
}
if($rsvp)
{
$ical .= sprintf("RSVP=TRUE:");
}
$ical .= sprintf("mailto:%s;\r\n", $email);
}
$ical .= sprintf("LOCATION:%s\r\n", $location);
$ical .= sprintf("DTSTAMP:%s\r\n", self::getDateTimeInUTCFormat());
$ical .= "CLASS:PUBLIC\r\n";
$ical .= sprintf("DTSTART:%s\r\n", self::getDateTimeInUTCFormat($from_date));
if (!$all_day_event)
{
$ical .= sprintf("DTEND:%s\r\n", self::getDateTimeInUTCFormat($to_date));
}
$ical .= sprintf("SUMMARY:%s\r\n", $subject);
$ical .= "TRANSP:OPAQUE\r\n";
$ical .= "X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE\r\n";
$ical .= "X-MICROSOFT-CDO-IMPORTANCE:1\r\n";
$ical .= "X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY\r\n";
$ical .= "X-MICROSOFT-DISALLOW-COUNTER:FALSE\r\n";
$ical .= "X-MS-OLK-APPTLASTSEQUENCE:1\r\n";
$ical .= "X-MS-OLK-AUTOSTARTCHECK:FALSE\r\n";
$ical .= "X-MS-OLK-CONFTYPE:0\r\n";
$ical .= sprintf("X-MS-OLK-SENDER;CN=\"%s\":MAILTO:%s\r\n", $organizer_name, $organizer[1]);
$ical .= sprintf("X-ALT-DESC;FMTTYPE=text/html:%s\r\n", "<p>" . preg_replace('/\R/', "</p><p>", $description) . "</p>");
$ical .= sprintf("X-MS-OLK-CONFTYPE:0\r\n");
$ical .= "BEGIN:VALARM\r\n";
$ical .= "TRIGGER:-PT15M\r\n";
$ical .= "ACTION:DISPLAY\r\n";
$ical .= "DESCRIPTION:Reminder\r\n";
$ical .= "END:VALARM\r\n";
$ical .= "END:VEVENT\r\n";
$ical .= "END:VCALENDAR";
return $ical;
}
static protected function getDateTimeInUTCFormat(DateTime $date = null)
{
if ($date === null)
{
$date = new DateTime();
}
$date->setTimezone(new DateTimeZone('UTC'));
return $date->format('Ymd\THis\Z');
}
}
电子邮件仅显示为带有 .ics 附件的电子邮件。我究竟做错了什么?为什么没有显示回复按钮?
【问题讨论】:
-
在这里查看纯php实现:exchangecore.com/blog/sending-outlookemail-calendar-events-php,您可以按照这种方法在消息末尾附加日历。
-
我在这里专门谈论 Laravel。我已经在我的帖子中链接到一个工作示例,但我需要它与 Laravel 的 Mail 类一起使用。
-
是的,这就是为什么我没有把它作为答案,您可以按照这种方法准备附件,然后您可以将其附加到 laravel 电子邮件中。但是,在您的情况下,arun 的答案似乎更方便。
-
我提供的第二个答案运气好吗?
标签: php email laravel swiftmailer