Как заставить .ics работать в Outlook (Laravel mailer)? - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь заставить Outlook распознавать файл .ics моего письма как правильное приглашение.Приглашение календаря .ics отлично работает в Gmail, но не в Outlook.Из прочтения других сообщений Stackoverflow я думаю, что я не правильно установил «MIME» и т. Д., Но я не могу понять, как это сделать (я новичок в электронной почте).

Вот фрагмент моего базового кода.

Mail::send($data['view'], $data['data'], function($message) use ($data)  {
                $message->from($from_email,$f_n)->to($to_email)->subject($data['subject']);
                $message->attachData($data['ical'], 'invite.ics');
});

Я пробовал такой код:

$message->setContentType("text/calendar;method=REQUEST;name=\"invite.ics\"");
$disp->addParameterizedHeader(
                    'Content-Disposition', 'x'
                );
                $disp = $message->getHeaders()->get('Content-Disposition');
                $disp->setValue('attachment');
                $disp->setParameter('filename', 'invite.ics');

и

$message->setBody($data['ical'], 'text/calendar; charset="utf-8"; method=REQUEST');

Нопока не повезло.Я использую Laravel 5.5.

Чтобы поддержать идею, что проблема не связана с самим файлом .ics, я попытался использовать стандартное сгенерированное приглашение Календаря Google .ics, которое работает сOutlook при отправке по электронной почте из Календаря Google, но не при отправке его по почте Mail :: send

Заранее благодарим за любые советы!

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Я только что узнал, что вы можете добавить параметры MIME в функцию attachData (согласно https://laravel.com/docs/5.7/mail#attachments) - это работает как для Outlook, так и для Gmail. Yay:)

$message->attachData($data['ical'], 'invite.ics', [
                    'mime' => 'text/calendar;charset=UTF-8;method=REQUEST',
                ]);
0 голосов
/ 05 декабря 2018

То, что я в итоге сделал для приложения Laravel 4 , расширяет почтовую программу и затем заменяет MailServiceProvider на мое собственное, добавляя дополнительный метод invite:

public function invite($view, array $data, $callback)
{
    // First we need to parse the view, which could either be a string or an array
    // containing both an HTML and plain text versions of the view which should
    // be used when sending an e-mail. We will extract both of them out here.
    list($view, $plain) = $this->parseView($view);

    $data['message'] = $message = $this->createMessage();

    $ts = \Carbon\Carbon::now();

    $filename = "invite.ics";
    $meeting_duration = (60 * 60); // 5 minutes
    $meetingstamp = $ts->getTimeStamp();
    $dtstart = gmdate('Ymd\THis\Z', $meetingstamp);
    $dtend =  gmdate('Ymd\THis\Z', $meetingstamp + $meeting_duration);
    $todaystamp = gmdate('Ymd\THis\Z');
    $uid = date('Ymd').'T'.date('His').'-'.rand();
    $description = $data['event']['description'];
    $location = $data['event']['location'];

    $organizer = "Organizer name:" . $data['event']['organizername'];
    $organizerEmail = 'noreply@email.com';

    //Including additional headers
    $typemime = $message->getHeaders()->get("MIME-version");
    $typemime->setValue("1.0");
    $type = $message->getHeaders()->get("Content-Type");
    $type->setValue("text/calendar");
    $type->setParameters(array(
        "name" => "calendar.ics",
        "method" => "REQUEST",
        "charset" => "iso-8859-1"
    ));

    $typetrans = $message->getHeaders()->get("Content-Transfer-Encoding");
    $typetrans->setValue("7bit");
    $message->getHeaders()->addTextHeader("X-Mailer", "Microsoft Office Outlook 12.0");

    //vCalendar parameters
    $vcal = "BEGIN:VCALENDAR\r\n";
    $vcal .= "VERSION:2.0\r\n";
    $vcal .= "PRODID:-//yourdomain.com//OrgCalendarWebTool//EN\r\n";
    $vcal .= "METHOD:REQUEST\r\n";
    $vcal .= "BEGIN:VEVENT\r\n";
    $vcal .= "ORGANIZER;CN=\"$organizer"."\":mailto:$organizerEmail\r\n";
    $vcal .= "UID:".$uid;
    $vcal .= "DTSTAMP:".date('Ymd').'T'.date('His')."\r\n";
    $vcal .= "DTSTART:$dtstart\r\n";
    $vcal .= "DTEND:$dtend\r\n"; 
    $vcal .= "LOCATION:$location\r\n";
    $vcal .= "SUMMARY:$description\r\n";
    $vcal .= "DESCRIPTION:$description \r\n";
    $vcal .= "BEGIN:VALARM\r\n";
    $vcal .= "TRIGGER:-PT15M\r\n";
    $vcal .= "ACTION:DISPLAY\r\n";
    $vcal .= "DESCRIPTION:Reminder\r\n";
    $vcal .= "END:VALARM\r\n";
    $vcal .= "END:VEVENT\r\n";
    $vcal .= "END:VCALENDAR\r\n";

    //Adding the parameters (This part Im not sure how to do it)
    $message->addPart($vcal, 'text/calendar; method=REQUEST', 'iso-8859-1');

    $this->callMessageBuilder($callback, $message);

    // Once we have retrieved the view content for the e-mail we will set the body
    // of this message using the HTML type, which will provide a simple wrapper
    // to creating view based emails that are able to receive arrays of data.
    $this->addContent($message, $view, $plain, $data);

    $message = $message->getSwiftMessage();

    return $this->sendSwiftMessage($message);
}

Использование стало намного проще:

// send a calendar invite
Mail::invite(...
// send a regular email
Mail::send(...

Laravel 5 добавил некоторые новые функции, такие как почтовые сообщения, поэтому я бы посоветовал заглянуть в источник, чтобы точно определить, что вам может понадобиться,

Mailer Источник: https://github.com/laravel/framework/blob/5.5/src/Illuminate/Mail/Mailer.php

Не могу вспомнить, где я нашел синтаксис для параметров vCalendar.Если я найду его, я добавлю его сюда.

...