Php 通过AWS SES发送日历邀请-错误:重复标题';内容类型';

Php 通过AWS SES发送日历邀请-错误:重复标题';内容类型';,php,phpmailer,amazon-ses,Php,Phpmailer,Amazon Ses,我正在尝试自动生成日历邀请,并通过AWS简单电子邮件服务(SES)通过SMTP发送它们。发送是通过PHPMailer完成的,似乎可以与其他SMTP服务器(未经验证)协同工作,但不能与AWS协同工作 似乎通过SES发送时会触发Amazon调整内容标题。不知道如何进行,感谢任何帮助,因为我必须使用亚马逊作为发送地址 多谢各位 错误: SMTP ERROR: DATA END command failed: 554 Transaction failed: Duplicate header 'Conte

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

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

多谢各位

错误:

SMTP ERROR: DATA END command failed: 554 Transaction failed: Duplicate header 'Content-Type'.
代码:

编辑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部分的邮件不太可能普遍有效(有很多短版本:gmail和outlook都非常糟糕),因此设置邮件正文,然后在创建
$ical
字符串后添加ical部分:

$cal_mail->Body = 'Here is your calendar invitation';
$cal_mail->Ical = $ical;
这就是全部。所有的头和编码都会为您处理好


要进行调试,您确实需要
SMTPDebug=2
;1不是很有用。也不要直接设置
Mailer
;改为调用isSMTP()。

就停在那里。你试图破坏PHPMailer为你做的一切。如果您打算从头开始构建自己的消息,则不需要PHPMailer。PHPMailer内置了发送iCal附件和消息部分的支持,因此可以删除所有那些
addCustomHeader
调用。发送只包含ical部分的邮件不太可能普遍有效(有很多短版本: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、Outlook for iOS和Apple Mail上。请注意,下面的不适用于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;
值得指出的是,MS Outlook for Desktop没有正确显示日历邀请,直到我添加了下面的代码,将
.ics
附件附加到邮件中(尽管PHPMailer可能会自动执行此操作)


感谢您指出了这一点

经过大量的尝试和错误,并使其在台式机或移动设备上运行,我终于找到了
$ical
元素的正确组合,使接受/拒绝按钮同时出现在MS Outlook for Desktop、Outlook for iOS和Apple Mail上。请注意,下面的不适用于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;
值得指出的是,MS Outlook for Desktop没有正确显示日历邀请,直到我添加了下面的代码,将
.ics
附件附加到邮件中(尽管PHPMailer可能会自动执行此操作)


这一点的精确定位值得称赞

谢谢。现在将生成邀请和.ics附件,但outlook无法打开邀请。谷歌参考了兼容性问题,有什么建议吗?thanksOutlook对iCal格式非常挑剔。我建议您在尝试制作自己的iCal内容之前,先使用outlook生成的iCal内容进行测试。上面的
$iCal
不会触发outlook for desktop中的接受/拒绝按钮,但在iOS上运行良好。但是当查看outlook cal邀请的来源时,我看不到任何日历细节…?所以你明白我所说的挑剔是什么意思了!我基本上已经放弃了它,因为我认为它不可能同时在outlook、gmail和iOS上运行。只要ics附件是可见的,它就可以在任何地方使用。看看下面我发布的答案,它现在可以在MAC和PC上的Outlook桌面上使用,也可以在iOS和Android上的mobile上使用。谢谢。现在将生成邀请和.ics附件,但outlook无法打开邀请。谷歌参考了兼容性问题,有什么建议吗?thanksOutlook对iCal格式非常挑剔。我建议您在尝试制作自己的iCal内容之前,先使用outlook生成的iCal内容进行测试。上面的
$iCal
不会触发outlook for desktop中的接受/拒绝按钮,但在iOS上运行良好。但是当查看outlook cal邀请的来源时,我看不到任何日历细节…?所以你明白我所说的挑剔是什么意思了!我基本上已经放弃了它,因为我认为它不可能同时在outlook、gmail和iOS上运行。只要ics附件是可见的,它就可以在任何地方使用。看看下面我发布的答案,它现在可以在MAC和PC上的Outlook桌面上使用,也可以在iOS和Android上的mobile上使用。