发送过程邮件内容丢失 用php mail函数发送outlook日历邮件的过程中,邮件内容丢失,这是什么原因呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 部分丢失,不知道怎么回事$from='"=?utf-8?B?' . base64_encode($_SESSION['LoginNAME']) . '?="<' . $_SESSION['MailAddress'] . '>'; $subj =$tilte;// "my test subject"; $msg =$content;// "this is the email body"; $location=$address;// $starttime=$startDateTime; $endtime=$endDateTime; $header = 'To:' . $toname . "\r\n"; $header .= "From: " . $from . "\r\n" . "MIME-Version: 1.0\r\n" . "Content-Type: text/calendar;method=REQUEST"; //Various ways to creat a new, random UID $cal_uid = "{" . uniqid(mt_rand(), true) . "}"; $cal_uid = "{" . date('Ymd').'T'.date('His')."-".rand()."@mydomain.com}"; $cal_msg ="BEGIN:VCALENDARPRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//ENVERSION:2.0METHOD:REQUESTBEGIN:VEVENTORGANIZER:$mailAdd[MailAdd]DTSTART:" . $starttime . "DTEND:" . $endtime . "UID:" . $cal_uid . "LOCATION:" . $location . "TRANSP:OPAQUESEQUENCE:0DTSTAMP:20060309T045649ZCATEGORIES: MeetingDESCRIPTION:" . $msg . "SUMMARY:" . $subj . "PRIORITY:5X-MICROSOFT-CDO-IMPORTANCE:1CLASS:PUBLICBEGIN:VALARMTRIGGER:-PT3DACTION:DISPLAYDESCRIPTION:ReminderEND:VALARMBEGIN:VTIMEZONETZID:US/CentralEND:VTIMEZONEEND:VEVENTEND:VCALENDAR";if (mail("", $subj, $cal_msg, $header, "")) { }DESCRIPTION:" . $msg . " $msg 的内容只有一部分 请求头加上content-length试试 $header .= "From: " . $from . "\r\n" . "MIME-Version: 1.0\r\n" . "Content-Type: text/calendar;method=REQUEST\r\n". "Content-Length:".strlen($content);?> mail函数执行之前我看了看$msg还正常,发完之后看邮件内容就少了 是不是$msg里有一些字符导致解析不正确? 你把$msg换成很长的一串英文字符,没有任何特殊符号的那种,先把长度设成和$content一样多,如果可以发送成功,说明很有可能是一些特殊符号的问题。for($i=0;$i<strlen($content);$i++){ $msg .= "a";} 那就是说发送的内容过多,给截断咯你的$msg多少字节阿? 我测试随便输入,1000字左右,就剩二三十的样子,我用outlook发不用这个程序发都能正常显示,我想应该是mail函数发送过程中出的问题 php发送邮件多用开源类库phpmailer,你试下用这个。 我先试试以上方法,谢谢另外我本地机不能测试,老是说SMTP server response: 530 5.7.0 Authentication required每次测试都拿到服务器上比较麻烦,这个问题怎么解决啊,前段时间没这个问题,自从公司服务器换了端口就不行了,把25换成别的了 php.ini里不是有端口设置么?换了端口后,你有改么?[mail function]; For Win32 only.SMTP = localhost ;改成正确的邮件服务器地址smtp_port = 25 ;改成正确的端口,默认为25 都改了,我从phpinfo()里看到的对应的php.ini文件,应该没错啊不知道哪个地方的原因 晕,呵呵,测试半天还是特殊字符的问题啊?是不是邮件内容,也就报文内存在\r\n?邮件内容中最好不要出现\r\n换行符,具体查阅下rfc821协议.可以把$msg中的\r\n换成<br/>试试。 把换行符都去了,让它在邮件里显示的内容变成一段了,这样好像改变了原文的样子,换成 <br/>就不会改变了吧?另外,我发送邮件,发送到outlook2007没问题,发到outlook2003就有问题,源代码竟然出现在邮件内容里了,老板让解决这个问题,我没头绪,真要命了foolbirdflyfirst 您再给指点指点吧?! foolbirdflyfirst 哪儿去了呢?还有其他高人吗? 1.$cal_msg里的内容,每一行后面加上一个\n作为分割,要不挤在一起,发出的就是一封普通outlook mail了,而不是outlook calendar mail$cal_msg ="BEGIN:VCALENDAR\nPRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN\nVERSION:2.0\nMETHOD:REQUEST\nBEGIN:VEVENT\n.."2.$msg = preg_replace('/\r\n/','\n',$msg);//\r\n一定要替换掉,替换成\n估计就可以换行了。 哎呀,你可有反应了outlook2003收到的内容是这样的Return-Path: <[email protected]>Received: from mail.cyber-dreams.net (mail.f00-149.076.183.203.fs-user.net [203.183.76.149]) by mail.cyber-dreams.net (8.12.11.20060829/8.11.3) with ESMTP id n8M7AMXJ022171 for <[email protected]>; Tue, 22 Sep 2009 16:10:22 +0900Received: (from f00-eh7c@localhost) by mail.cyber-dreams.net (8.12.11.20060829/8.12.11/Submit) id n8M7AMjj022170; Tue, 22 Sep 2009 16:10:22 +0900Date: Tue, 22 Sep 2009 16:10:22 +0900Message-Id: <[email protected]>To: Subject: To: "=?utf-8?B?546L5pil6Zye?="<[email protected]>From: "=?utf-8?B?546L5pil6Zye?="<[email protected]>MIME-Version: 1.0Content-Type: text/calendar;method=REQUESTcharset='UTF-8'Content-Transfer-Encoding: 8bitBEGIN:VCALENDARPRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN VERSION:2.0 METHOD:REQUEST BEGIN:VEVENTORGANIZER:DTSTART:20090922T151022DTEND:20090922T161022UID:{[email protected]}LOCATION:TRANSP:OPAQUESEQUENCE:0DTSTAMP:20060309T045649ZCATEGORIES: MeetingDESCRIPTION:SUMMARY:PRIORITY:5X-MICROSOFT-CDO-IMPORTANCE:1CLASS:PUBLICBEGIN:VALARMTRIGGER:-PT3DACTION:DISPLAYDESCRIPTION:ReminderEND:VALARMBEGIN:VTIMEZONETZID:US/CentralEND:VTIMEZONEEND:VEVENTEND:VCALENDAR 不是加个\n就能解决了的还是这样foolbirdflyfirst您再帮我想想办法行吗 这个就是因为你发送过去的outlook日历邮件不符合outlook邮件的解析标准,它把你发的东西解析成一封普通邮件了。我本地测了下你的例子,是可以成功发送的。在本地搭建的winmail server,outlook2003具体代码原封不动如下,发送后outlook日历2009.09.23将多出一份会议记录$from='"=?utf-8?B?' . base64_encode($_SESSION['LoginNAME']) . '?="<' . $_SESSION['MailAddress'] . '>'; $subj =$tilte='jet';// "my test subject"; $msg =$content="hello \r\nworld!";// "this is the email body"; $location=$address;// $starttime="20090923T131415Z"; $endtime="20090923T151617Z"; $header = 'To:' . $toname . "\r\n"; $header .= "From: " . $from . "\r\n" . "MIME-Version: 1.0\r\n" . "Content-Type: text/calendar;method=REQUEST"; //Various ways to creat a new, random UID $cal_uid = "{" . uniqid(mt_rand(), true) . "}"; $cal_uid = "{" . date('Ymd').'T'.date('His')."-".rand()."@mydomain.com}"; $cal_msg ="BEGIN:VCALENDAR\nPRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN\nVERSION:2.0\nMETHOD:REQUEST\nBEGIN:VEVENT\nORGANIZER:$mailAdd[MailAdd]\nDTSTART:" . $starttime . "\nDTEND:" . $endtime . "\nUID:" . $cal_uid . "\nLOCATION:" . $location . "\nTRANSP:OPAQUE\nSEQUENCE:0\nDTSTAMP:20060309T045649Z\nCATEGORIES: Meeting\nDESCRIPTION:" . preg_replace('/\r\n/','\n',$msg) . "\nSUMMARY:" . $subj . "\nPRIORITY:5\nX-MICROSOFT-CDO-IMPORTANCE:1\nCLASS:PUBLIC\nBEGIN:VALARM\nTRIGGER:-PT3D\nACTION:DISPLAY\nDESCRIPTION:Reminder\nEND:VALARM\nBEGIN:VTIMEZONE\nTZID:US/Central\nEND:VTIMEZONE\nEND:VEVENT\nEND:VCALENDAR";//mail服务器为localhost,端口25if (mail("[email protected]", $subj, $cal_msg, $header, "")) { } 内容是=====helloworld有效换了行。 php数据库连接无结果 拿到了离职手续表,交上去就算正式离职了。郁闷,散分 PHP程序不显示内容,只显示框架和图片 PHP群,诚者加,不要潜水员 php define()定义的常量的有效期的问题。 今天正式加入单身的行列,大家来庆祝啊。 之前还可以运行的程序,现在不行了 如何获得单前的系统日期和时间? 如果PHP支持事件...... 哪位有一位php编程规范约定文档 php-devel-5.1.6-3.i386.rpm 安装需的依存关系 二维数组,行与行之间的计算,求函数
$subj =$tilte;// "my test subject";
$msg =$content;// "this is the email body";
$location=$address;//
$starttime=$startDateTime;
$endtime=$endDateTime;
$header = 'To:' . $toname . "\r\n"; $header .= "From: " . $from . "\r\n" .
"MIME-Version: 1.0\r\n" .
"Content-Type: text/calendar;method=REQUEST"; //Various ways to creat a new, random UID
$cal_uid = "{" . uniqid(mt_rand(), true) . "}";
$cal_uid = "{" . date('Ymd').'T'.date('His')."-".rand()."@mydomain.com}"; $cal_msg =
"BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
VERSION:2.0
METHOD:REQUEST
BEGIN:VEVENT
ORGANIZER:$mailAdd[MailAdd]
DTSTART:" . $starttime . "
DTEND:" . $endtime . "
UID:" . $cal_uid . "
LOCATION:" . $location . "
TRANSP:OPAQUE
SEQUENCE:0
DTSTAMP:20060309T045649Z
CATEGORIES: Meeting
DESCRIPTION:" . $msg . "
SUMMARY:" . $subj . "
PRIORITY:5
X-MICROSOFT-CDO-IMPORTANCE:1
CLASS:PUBLIC
BEGIN:VALARM
TRIGGER:-PT3D
ACTION:DISPLAY
DESCRIPTION:Reminder
END:VALARM
BEGIN:VTIMEZONE
TZID:US/Central
END:VTIMEZONE
END:VEVENT
END:VCALENDAR";
if (mail("", $subj, $cal_msg, $header, "")) {
}DESCRIPTION:" . $msg . " $msg 的内容只有一部分
$header .= "From: " . $from . "\r\n" .
"MIME-Version: 1.0\r\n" .
"Content-Type: text/calendar;method=REQUEST\r\n".
"Content-Length:".strlen($content);?>
$msg .= "a";
}
你的$msg多少字节阿?
另外我本地机不能测试,老是说SMTP server response: 530 5.7.0 Authentication required每次测试都拿到服务器上比较麻烦,这个问题怎么解决啊,前段时间没这个问题,自从公司服务器换了端口就不行了,把25换成别的了
; For Win32 only.
SMTP = localhost ;改成正确的邮件服务器地址
smtp_port = 25 ;改成正确的端口,默认为25
邮件内容中最好不要出现\r\n换行符,具体查阅下rfc821协议.
可以把$msg中的\r\n换成<br/>试试。
$cal_msg =
"BEGIN:VCALENDAR\n
PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN\n
VERSION:2.0\n
METHOD:REQUEST\n
BEGIN:VEVENT\n
..
"
2.$msg = preg_replace('/\r\n/','\n',$msg);//\r\n一定要替换掉,替换成\n估计就可以换行了。
outlook2003收到的内容是这样的Return-Path: <[email protected]>
Received: from mail.cyber-dreams.net (mail.f00-149.076.183.203.fs-user.net [203.183.76.149])
by mail.cyber-dreams.net (8.12.11.20060829/8.11.3) with ESMTP id n8M7AMXJ022171
for <[email protected]>; Tue, 22 Sep 2009 16:10:22 +0900
Received: (from f00-eh7c@localhost)
by mail.cyber-dreams.net (8.12.11.20060829/8.12.11/Submit) id n8M7AMjj022170;
Tue, 22 Sep 2009 16:10:22 +0900
Date: Tue, 22 Sep 2009 16:10:22 +0900
Message-Id: <[email protected]>
To:
Subject:
To: "=?utf-8?B?546L5pil6Zye?="<[email protected]>
From: "=?utf-8?B?546L5pil6Zye?="<[email protected]>
MIME-Version: 1.0
Content-Type: text/calendar;method=REQUESTcharset='UTF-8'
Content-Transfer-Encoding: 8bitBEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN VERSION:2.0 METHOD:REQUEST BEGIN:VEVENT
ORGANIZER:
DTSTART:20090922T151022
DTEND:20090922T161022
UID:{[email protected]}
LOCATION:
TRANSP:OPAQUE
SEQUENCE:0
DTSTAMP:20060309T045649Z
CATEGORIES: Meeting
DESCRIPTION:
SUMMARY:
PRIORITY:5
X-MICROSOFT-CDO-IMPORTANCE:1
CLASS:PUBLIC
BEGIN:VALARM
TRIGGER:-PT3D
ACTION:DISPLAY
DESCRIPTION:Reminder
END:VALARM
BEGIN:VTIMEZONE
TZID:US/Central
END:VTIMEZONE
END:VEVENT
END:VCALENDAR
加个\n就能解决了的
还是这样
foolbirdflyfirst您再帮我想想办法行吗
我本地测了下你的例子,是可以成功发送的。在本地搭建的winmail server,outlook2003
具体代码原封不动如下,发送后outlook日历2009.09.23将多出一份会议记录$from='"=?utf-8?B?' . base64_encode($_SESSION['LoginNAME']) . '?="<' . $_SESSION['MailAddress'] . '>';
$subj =$tilte='jet';// "my test subject";
$msg =$content="hello \r\nworld!";// "this is the email body";
$location=$address;//
$starttime="20090923T131415Z";
$endtime="20090923T151617Z";
$header = 'To:' . $toname . "\r\n";
$header .= "From: " . $from . "\r\n" .
"MIME-Version: 1.0\r\n" .
"Content-Type: text/calendar;method=REQUEST"; //Various ways to creat a new, random UID
$cal_uid = "{" . uniqid(mt_rand(), true) . "}";
$cal_uid = "{" . date('Ymd').'T'.date('His')."-".rand()."@mydomain.com}"; $cal_msg =
"BEGIN:VCALENDAR\n
PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN\n
VERSION:2.0\n
METHOD:REQUEST\n
BEGIN:VEVENT\n
ORGANIZER:$mailAdd[MailAdd]\n
DTSTART:" . $starttime . "\n
DTEND:" . $endtime . "\n
UID:" . $cal_uid . "\n
LOCATION:" . $location . "\n
TRANSP:OPAQUE\n
SEQUENCE:0\n
DTSTAMP:20060309T045649Z\n
CATEGORIES: Meeting\n
DESCRIPTION:" . preg_replace('/\r\n/','\n',$msg) . "\n
SUMMARY:" . $subj . "\n
PRIORITY:5\n
X-MICROSOFT-CDO-IMPORTANCE:1\n
CLASS:PUBLIC\n
BEGIN:VALARM\n
TRIGGER:-PT3D\n
ACTION:DISPLAY\n
DESCRIPTION:Reminder\n
END:VALARM\n
BEGIN:VTIMEZONE\n
TZID:US/Central\n
END:VTIMEZONE\n
END:VEVENT\n
END:VCALENDAR";
//mail服务器为localhost,端口25
if (mail("[email protected]", $subj, $cal_msg, $header, "")) {
}
=====
hello
world有效换了行。