微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过AWS SES发送日历邀请-错误:标题“ Content-Type”重复

如何解决通过AWS SES发送日历邀请-错误:标题“ Content-Type”重复

我正在尝试自动生成日历邀请,并通过AWS简单电子邮件服务(SES)通过SMTP发送它们。发送是通过PHPMailer完成的,并且似乎可以与其他SMTP服务器(未经验证)一起使用,但不适用于AWS。

似乎通过SES发送时会触发Amazon调整内容标头。不知道如何进行,感谢任何帮助,因为我必须使用亚马逊作为发送地址。

谢谢

错误

SMTP ERROR: DATA END command Failed: 554 Transaction Failed: Duplicate header 'Content-Type'.

代码

// PHPMailer Parameters
$cal_mail = new PHPMailer(true);
//$mail->isSMTP();                                                    // Send using SMTP
$cal_mail->SMTPDebug  = 1;                                              // Enable verbose debug output
$cal_mail->SMTPAuth   = $smtp_auth;                                     // Enable SMTP authentication
$cal_mail->SMTPSecure = 'tls';
$cal_mail->Host       = $smtp_host;                                     // Set the SMTP server to send through
$cal_mail->Port       = $smtp_port;
$cal_mail->SMTPKeepAlive = true;
$cal_mail->Mailer = "smtp";
$cal_mail->Username   = $smtp_username;                                 // SMTP username
$cal_mail->Password   = $smtp_password;                                 // SMTP password
$cal_mail->AddAddress($to_email,$name);                                // Add a recipient
$cal_mail->SetFrom($from_email,$from_name);
$cal_mail->AddReplyTo($to_email,$to_name);


$cal_mail->isHTML(false);                                               // calendar must be FALSE
$cal_mail->ContentType = 'text/calendar';
$cal_mail->Subject = "Outlook Event";
$cal_mail->addCustomHeader('MIME-version',"1.0");
$cal_mail->addCustomHeader('Content-type',"text/calendar; method=REQUEST; charset=UTF-8");
$cal_mail->addCustomHeader('Content-transfer-encoding',"7bit");
$cal_mail->addCustomHeader('X-Mailer',"Microsoft Office Outlook 12.0");
$cal_mail->addCustomHeader("Content-class: urn:content-classes:calendarmessage");

// Create Calendar Body
$ical = "BEGIN:VCALENDAR\r\n";
$ical .= "VERSION:2.0\r\n";
$ical .= "PRODID:-//BPNSolutions//SalesDept//EN\r\n";
$ical .= "METHOD:REQUEST\r\n";
$ical .= "BEGIN:VEVENT\r\n";
$ical .= "ORGANIZER;SENT-BY=\"MAILTO:noreply@mail.com\":MAILTO:noreply@mail.com\r\n";
$ical .= "ATTENDEE;CN=" . $to_email . ";ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE:MAILTO:" . $to_email . "\r\n";
$ical .= "UID:" . strtoupper(md5($event_id)) . "-bpn-solutions.com\r\n";
$ical .= "SEQUENCE:" . $sequence . "\r\n";
$ical .= "STATUS:" . $status . "\r\n";
$ical .= "DTSTAMP;TZID=Etc/UTC:" . date('Ymd') . 'T' . date('His') . "\r\n";
$ical .= "DTSTART:" . $start . "T" . $start_time . "\r\n";
$ical .= "DTEND:" . $end . "T" . $end_time . "\r\n";
$ical .= "LOCATION:" . $venue . "\r\n";
$ical .= "SUMMARY:" . $summary . "\r\n";
$ical .= "DESCRIPTION:" . $event['description'] . "\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\r\n";

编辑1: 以下代码成功生成了带有.ics附件的电子邮件,但是MS Outlook for Desktop无法打开/读取附件,并且在预览电子邮件时分别不会触发任何接受/拒绝按钮。不过,相同的附件在Outlook / Apple Mail for iOS上确实可以很好地工作。

// Create Calendar Body
$ical = "BEGIN:VCALENDAR\r\n";
$ical .= "VERSION:2.0\r\n";
$ical .= "PRODID:-//Company//SalesDept//EN\r\n";
$ical .= "METHOD:REQUEST\r\n";
$ical .= "NAME: Test1\r\n";
$ical .= "X-WR-CALNAME:Test Calendar\r\n";
$ical .= "BEGIN:VEVENT\r\n";
$ical .= "ORGANIZER;CN=\"Company Name:mailto:noreply@domain.com\r\n";
$ical .= "ATTENDEE;CN=" . $to_email . ";ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE:MAILTO:" . $to_email . "\r\n";
$ical .= "UID:" . md5(uniqid(mt_rand(),true)) . "domain.com\r\n";
$ical .= "SEQUENCE:" . $sequence . "\r\n";
$ical .= "STATUS:" . $status . "\r\n";
$ical .= "DTSTART:" . $start . "T" . $start_time . "Z\r\n";
$ical .= "DTEND:" . $end . "T" . $end_time . "Z\r\n";
$ical .= "DTSTAMP:" . date('Ymd') . 'T' . date('His') . "Z\r\n";
$ical .= "LOCATION:" . $venue . "\r\n";
$ical .= "SUMMARY:" . $summary . "\r\n";
$ical .= "DESCRIPTION:Some descriptive text here.\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\r\n";

$cal_mail->ContentType = 'text/calendar';
$cal_mail->Subject = $summary;
$cal_mail->Body = "This is the body text which is meant to be shown in the email body";
$cal_mail->AltBody = $ical;
$cal_mail->Ical = $ical;

解决方法

在那停。您正在尝试破坏PHPMailer为您所做的所有事情。如果您要尝试从头开始构建自己的消息,则不需要PHPMailer。 PHPMailer具有发送iCal附件和消息部分的内置支持,因此请删除所有这些addCustomHeader调用。发送仅包含ical部分的消息不太可能在全球范围内正常工作(discussion related to the problems in various ical clients的版本很多-简短版本:gmail和Outlook都非常糟糕),因此设置消息正文,然后添加创建您的$ical字符串后,您的iCal部分:

$cal_mail->Body = 'Here is your calendar invitation';
$cal_mail->Ical = $ical;

仅此而已。所有的标头和编码都会为您服务。

要调试,您真的想拥有SMTPDebug = 2; 1不是很有用。也不要直接设置Mailer;请致电isSMTP()

,

经过大量的试验和错误并使其在台式机或移动设备上均可使用,我终于设法找到$ical元素的正确组合,以使“接受/拒绝”按钮同时出现在两个MS Outlook for Desktop上, iOS和Apple Mail的Outlook。请注意,以下不适用于Gmail

// Create Calendar Body
$ical = "BEGIN:VCALENDAR\r\n";
$ical .= "VERSION:2.0\r\n";
$ical .= "PRODID:-//CompanyName//SalesDept//EN\r\n";
$ical .= "METHOD:REQUEST\r\n";
$ical .= "NAME: Test1\r\n";
$ical .= "X-WR-CALNAME:Test Cal\r\n";
$ical .= "BEGIN:VEVENT\r\n";
$ical .= "ORGANIZER;CN=" . $from_name . ":mailto:" . $from_email . "\r\n";
$ical .= "ATTENDEE;CN=" . $to_email . ";ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE:MAILTO:" . $to_email . "\r\n";
$ical .= "UID:" . md5(uniqid(mt_rand(),true)) . "mydomain.com\r\n";
$ical .= "SEQUENCE:" . $sequence . "\r\n";
$ical .= "STATUS:" . $status . "\r\n";
$ical .= "DTSTART:" . $start . "T" . $start_time . "Z\r\n";
$ical .= "DTEND:" . $end . "T" . $end_time . "Z\r\n";
$ical .= "DTSTAMP:" . date('Ymd') . 'T' . date('His') . "Z\r\n";
$ical .= "LOCATION:" . $venue . "\r\n";
$ical .= "SUMMARY:" . $summary . "\r\n";
$ical .= "DESCRIPTION:Some descriptive text here.\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\r\n";

$cal_mail->ContentType = 'text/calendar';
$cal_mail->Subject = $summary;
$cal_mail->Body = "This is the body text";
$cal_mail->AltBody = $ical;
$cal_mail->AddStringAttachment("$ical","attachment.ics","base64","text/calendar; charset=utf-8; method=REQUEST");
$cal_mail->Ical = $ical;

值得指出的是,直到我添加下面的代码并将.ics附件附加到邮件上之后,MS Outlook for Desktop才正确显示日历邀请(即使PHPMailer应该自动这样做)。

Frank Van Der Oort指出这一点here

表示敬意

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。