首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有php的ics文件描述中的Html

带有php的ics文件描述中的Html
EN

Stack Overflow用户
提问于 2015-08-13 08:01:16
回答 3查看 7.3K关注 0票数 6

我正在编写一个脚本,涉及到邮件服务器、获取电子邮件、从电子邮件中解析信息、从解析的信息中创建一个事件( ics文件),然后将事件邀请连同原始电子邮件一起发送,作为ics文件的描述。我在php中做了以上所有的工作。我被困在最后一步,即发送原始电子邮件正文(Html)作为描述。

我已经了解到ics文件字段描述不适应行中断(要发送多行描述,我必须使用\n).So在提取电子邮件正文后,我删除所有的"\r\n“,并得到一个没有换行的字符串中的html代码。

经过研究,我发现为了解析ics文件中的html,Outlook使用类似于X的东西。所以,我将描述和X都保留为带有html代码的字符串。但是,发送电子邮件会导致Outlook忽略大多数html,并在最后结束标记,而我只收到原始电子邮件的一小部分。

为了找出问题,我向gmail发送了相同的邮件,然后下载了ics file.Upon检查,我注意到gmail不会以任何方式改变DESC,但是会自动添加某些换行。我观察到outlook会在第一行中断后忽略html,并在开始时添加自己的标记来完成html以及它自己的Microsoft内容。

我不知道这个问题是否在php (添加换行)中,或者在X中,对于html代码的长度(例如,在n个代码之后,添加了一个自动行中断或其他什么),ics文件是否有限制。谢谢你的任何帮助,我想透露,我没有和经验的php之前,开始使用这个脚本。

用于提取消息(HTML)并将其放入没有换行符的字符串的代码:

代码语言:javascript
运行
复制
$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文件的代码)中:

代码语言:javascript
运行
复制
$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()发送电子邮件。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-19 18:45:22

感谢arnaudq在右边指导我,direction.This是用于行折叠的代码:

代码语言:javascript
运行
复制
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文件中:

代码语言:javascript
运行
复制
DESCRIPTION:".$desc."
X-ALT-DESC;FMTTYPE=text/html:".$desc."

icalender文件中的其余参数与我问题中的参数相同。

请注意,上面的测试仅在Outlook中进行。它显示为一个干净的事件和适当的HTML格式的描述。

票数 3
EN

Stack Overflow用户

发布于 2015-08-17 08:33:36

您的icalendar流不应包含超过75个字符的行。如果您的描述包含这样的行,则应使用https://www.rfc-editor.org/rfc/rfc5545#section-3.1中描述的折叠技术。

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

票数 1
EN

Stack Overflow用户

发布于 2015-08-14 11:13:08

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

正如我所看到的,phpmailer不允许设置消息体编码,但是您可以将ICAL作为附件发送。

代码语言:javascript
运行
复制
$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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31982680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档