【发布时间】:2019-03-15 14:42:31
【问题描述】:
我正在编写一个脚本,该脚本涉及到达邮件服务器、获取电子邮件、从电子邮件中解析信息、从解析的信息中创建一个事件(ics 文件),然后将事件邀请与原始电子邮件一起作为 ics 文件的描述发送。我正在用 php.ini 完成以上所有工作。我被困在最后一步,即发送原始电子邮件正文(html)作为描述。
我了解到 ics 文件字段说明不适合换行(要发送多行说明,我必须使用 \n)。因此,在提取电子邮件正文后,我删除了所有“\r\n”和我得到一个没有换行符的字符串中的 html 代码。
经过研究,我发现要解析 ics 文件中的 html,Outlook 使用 X-ALT-DESC 之类的东西。所以,我将DESCRIPTION 和 X-ALT-DESC 作为带有 html 代码的字符串。但是发送电子邮件会导致 Outlook 忽略大部分 html,并在最后结束自己的标签,我只收到原始电子邮件的一小部分。
为了找到问题,我将相同的邮件发送到 gmail,然后下载了 ics 文件。经过检查,我发现 gmail 不会以任何方式更改 DESC,但会自动添加某些换行符。而且我观察到 Outlook 在第一个换行符之后会忽略 html,并在开头添加自己的标签来完成 html 以及它自己的 Microsoft Exchange 内容。
我不知道问题是在 php 中(用于添加换行符)还是 如果 ics 文件在 X-ALT-DESC 中存在关于 html 代码长度的限制(即在 n 代码量之后添加自动换行符或其他内容)。 感谢您提供的任何帮助,我希望在开始使用此脚本之前披露我在 php 方面没有经验。
用于提取消息 (HTML) 并将其放入不带换行符的字符串中的代码:
$infoxo = quoted_printable_decode(imap_fetchbody($imap,$email_id,"1"));
emailyy = str_replace(array("\r\n"),"\n",$infoxo);
$lines = explode("\n",$emailyy);
$new_lines =array();
foreach($lines as $i => $line)
{
if(!empty($line))
$new_lines[]=trim($line);
$emailzz = implode($new_lines);
}
$desc = $emailzz;
在另一个函数中(ICS 文件代码):
$headers = 'Content-Type:text/calendar; Content-Disposition: inline;
charset=utf-8;\r\n';
$headers .= "Content-Type: /text/plain;charset=\"utf-8\"\r\n";
$message = "BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//BLAH/BLAH
METHOD:REQUEST
BEGIN:VEVENT
UID:" . md5(uniqid(mt_rand(), true)) . "example.com
DTSTAMP:" . gmdate('Ymd').'T'. gmdate('His') . "Z
DTSTART:".$start1."00Z
DTEND:".$end1."00Z
DESCRIPTION:".$desc."
SUMMARY:".$subject."
ORGANIZER;CN=".$organizer.":mailto:".$organizer_email."
LOCATION:".$location."
X-ALT-DESC;FMTTYPE=text/html:".$desc."
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-
ACTION;RSVP=TRUE;CN".$participant_name_1.";X-NUM-GUESTS=0:MAILTO:".$participant_email_1."
END:VEVENT
END:VCALENDAR";
$headers .= $message;
然后我使用 phpamiler() 发送电子邮件
【问题讨论】:
-
你能给我们展示一个最小的工作源代码吗?
-
您应该考虑使用库来生成 iCalendar 文件。
-
@tzunghaor 我已经添加了代码。