用php实现ics文件描述中的Html

用php实现ics文件描述中的Html,php,html,icalendar,Php,Html,Icalendar,我正在编写一个脚本,其中包括访问邮件服务器、获取电子邮件、解析电子邮件中的信息、根据解析的信息创建事件(ics文件),然后将事件邀请与原始电子邮件一起作为ics文件的描述发送。我正在用php完成上面的全部工作。我被困在最后一步,即发送原始电子邮件正文(html)作为描述 我逐渐了解到ics文件字段描述不适合使用换行符(要发送多行描述,我必须使用\n)。因此,在提取电子邮件正文后,我删除了所有“\r\n”,并在字符串中获得了不带换行符的html代码 经过研究,我发现,要解析ics文件中的html,

我正在编写一个脚本,其中包括访问邮件服务器、获取电子邮件、解析电子邮件中的信息、根据解析的信息创建事件(ics文件),然后将事件邀请与原始电子邮件一起作为ics文件的描述发送。我正在用php完成上面的全部工作。我被困在最后一步,即发送原始电子邮件正文(html)作为描述

我逐渐了解到ics文件字段描述不适合使用换行符(要发送多行描述,我必须使用\n)。因此,在提取电子邮件正文后,我删除了所有“\r\n”,并在字符串中获得了不带换行符的html代码

经过研究,我发现,要解析ics文件中的html,Outlook使用类似于X-ALT-DESC的东西。因此,我将描述和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文件的代码):


然后我使用phpamiler()发送电子邮件

我认为问题在于电子邮件中的行具有最大长度,因此phpmailer或邮件传输程序会打断长行。为了避免这种情况,您可以使用base64编码:这样base64代码将被分成短行,这不会影响编码的字符串

如我所见,phpmailer不允许设置消息正文编码,但您可以将ICAL作为附件发送

$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)
{
    $line = trim($line);
    if(!empty($line))
        $new_lines[]=$line;
}

// it is enough to implode after foreach, when $new_lines is complete
$desc = implode($new_lines);

$message = "BEGIN:VCALENDAR
DESCRIPTION:".$desc."
END:VCALENDAR";

// Prepending headers to $message is useless, since phpmailer sets the headers itself.

$mail = new PHPMailer;

$mail->From = 'tzunghaor@example.com';
$mail->addAddress('joe@example.com', 'Joe User');

$mail->isHTML(false); 

$mail->Subject = 'ical';
$mail->Body    = 'ical';

$mail->addStringAttachment(
        $message, //attachment data
        'thing.ical', // attachment file name
        'base64', // encoding
        'text/calendar;charset=utf-8', // content type
        'inline' // content disposition
    );
$mail->send();

icalendar流不应包含超过75个字符的行。如果描述中包含此类行,则应使用中描述的折叠技术

然后看看您的代码,您的描述字段应该包含描述的纯文本版本(没有任何HTML标记)。

感谢您为我指明了正确的方向。这是用于折线的代码:

function abc($htmlMsg)
{
    $temp = str_replace(array("\r\n"),"\n",$htmlMsg);
    $lines = explode("\n",$temp);
    $new_lines =array();
    foreach($lines as $i => $line)
    {
        if(!empty($line))
        $new_lines[]=trim($line);
    }
    $desc = implode("\r\n ",$new_lines);
    return $desc;
}
在icalender文件中,我使用:

DESCRIPTION:".$desc."
X-ALT-DESC;FMTTYPE=text/html:".$desc."
文件中的其余参数与我的问题中的参数相同


请注意,以上内容仅在Outlook中测试。它作为一个干净的事件和适当的HTML格式化在描述中。

你能给我们展示一个最小的工作源代码吗?你应该考虑使用一个库来生成IcLeNARAR文件。@ Zunggor我已经添加了代码。这正是我所相信的问题。我可以用纯文本,没问题。然而,你能给我一个关于“折叠技术”的指南吗。我无法按照ietf网站上的措辞折叠线条。普通的应该是,aaaCRLF-abc,它会打印出aaa-abc,对不起,我在这里是个“noob”,不。aaaCRLF abc将展开为AABC。CRLF后面的空格表示新线是第一条线的延续,因此展开时应移除。当然,您可能有两行以上(例如“abcCRLF defCRLF ghi”)。
DESCRIPTION:".$desc."
X-ALT-DESC;FMTTYPE=text/html:".$desc."