用php mail函数发送outlook日历邮件的过程中,邮件内容丢失,这是什么原因呢?

解决方案 »

  1.   

    部分丢失,不知道怎么回事$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: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 的内容只有一部分
      

  2.   

    请求头加上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);?>
              
      

  3.   

    mail函数执行之前我看了看$msg还正常,发完之后看邮件内容就少了
      

  4.   

    是不是$msg里有一些字符导致解析不正确?
      

  5.   

    你把$msg换成很长的一串英文字符,没有任何特殊符号的那种,先把长度设成和$content一样多,如果可以发送成功,说明很有可能是一些特殊符号的问题。for($i=0;$i<strlen($content);$i++){
        $msg .= "a";
    }
      

  6.   

    那就是说发送的内容过多,给截断咯
    你的$msg多少字节阿?
      

  7.   

    我测试随便输入,1000字左右,就剩二三十的样子,我用outlook发不用这个程序发都能正常显示,我想应该是mail函数发送过程中出的问题
      

  8.   

    php发送邮件多用开源类库phpmailer,你试下用这个。
      

  9.   

    我先试试以上方法,谢谢
    另外我本地机不能测试,老是说SMTP server response: 530 5.7.0 Authentication required每次测试都拿到服务器上比较麻烦,这个问题怎么解决啊,前段时间没这个问题,自从公司服务器换了端口就不行了,把25换成别的了
      

  10.   

    php.ini里不是有端口设置么?换了端口后,你有改么?[mail function]
    ; For Win32 only.
    SMTP = localhost ;改成正确的邮件服务器地址
    smtp_port = 25   ;改成正确的端口,默认为25
      

  11.   

    都改了,我从phpinfo()里看到的对应的php.ini文件,应该没错啊不知道哪个地方的原因
      

  12.   

    晕,呵呵,测试半天还是特殊字符的问题啊?是不是邮件内容,也就报文内存在\r\n?
    邮件内容中最好不要出现\r\n换行符,具体查阅下rfc821协议.
    可以把$msg中的\r\n换成<br/>试试。
      

  13.   

    把换行符都去了,让它在邮件里显示的内容变成一段了,这样好像改变了原文的样子,换成 <br/>就不会改变了吧?另外,我发送邮件,发送到outlook2007没问题,发到outlook2003就有问题,源代码竟然出现在邮件内容里了,老板让解决这个问题,我没头绪,真要命了foolbirdflyfirst 您再给指点指点吧?!
      

  14.   

    foolbirdflyfirst 哪儿去了呢?还有其他高人吗?
      

  15.   

    1.$cal_msg里的内容,每一行后面加上一个\n作为分割,要不挤在一起,发出的就是一封普通outlook mail了,而不是outlook calendar mail
    $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估计就可以换行了。
      

  16.   

    哎呀,你可有反应了
    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
      

  17.   

    不是
    加个\n就能解决了的
    还是这样
    foolbirdflyfirst您再帮我想想办法行吗
      

  18.   

    这个就是因为你发送过去的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\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, "")) {
                 }
      

  19.   

    内容是
    =====
    hello
    world有效换了行。