【问题标题】:PHP IMAP Receive Attachment from Microsoft Exchange ServerPHP IMAP 从 Microsoft Exchange Server 接收附件
【发布时间】:2015-01-14 09:12:18
【问题描述】:

您好,我的客户要求我使用 PHP 创建一个网站,他可以使用该网站阅读/回复他所有帐户中的所有电子邮件。现在他在 Microsoft Exchange Server 上有一个公司帐户,我正在使用 PHP imap_open 从邮件服务器获取电子邮件,我能够从 Gmail 帐户获取电子邮件附件,但我无法从 Microsoft Exchange 服务器帐户检索附件。没有产生错误,所以我不确定出了什么问题。我是否需要编写某种特殊代码才能从 Microsoft Exchange 服务器电子邮件帐户中检索附件?

在尝试发送电子邮件时,类似的问题仍然存在,我可以使用 Gmail SMTP 详细信息从 PHP 系统发送电子邮件,但不能使用 Microsoft Exchange 服务器

我仍在研究中,但我将不胜感激,如果您能指出我正确的方向,我将能够理解我的代码有什么问题。我不太了解 Microsoft Exchange 服务器是什么,也不知道它与 Gmail 等其他电子邮件提供商有何不同,因此如果您能指出正确的方向,我将不胜感激。

附件检索代码适用于 Gmail 帐户

【问题讨论】:

    标签: php outlook exchange-server imap


    【解决方案1】:

    关于outlook服务器的SMTP邮件发送问题。我有同样的问题,问题出在端口号上。

    使用Port:587 而不是Port:25 或任何其他选项...我一直使用此端口从Outlook 发送,每次都成功。

    对于 IMAP 附件问题,解决方案隐藏在区分大小写中...

    如果我们查看函数object imap_fetchstructure ( resource $imap_stream , int $msg_number),它通常负责获取附件。

    我们从 Gmail 和其他方面获得什么:

    标准类对象 ( [类型] => 1 [编码] => 0 [ifsubtype] => 1 [子类型] => 混合 [如果描述] => 0 [ifid] => 0 [如果性格] => 0 [ifd 参数] => 0 [if参数] => 1 [参数] => 数组 ( [0] => 标准类对象 ( [attribute] => BOUNDARY // 注意这里... [值] => b1_04114a96a39b7789f88fdabc7feadc61 ) ) [部分] => 数组 ( [0] => 标准类对象 ( [类型] => 0 [编码] => 1 [ifsubtype] => 1 [子类型] => HTML [如果描述] => 0 [ifid] => 0 [行] => 20 [字节] => 597 [如果性格] => 0 [ifd 参数] => 0 [if参数] => 1 [参数] => 数组 ( [0] => 标准类对象 ( [属性] => CHARSET // 注意这里... [值] => iso-8859-1 ) ) ) [1] => 标准类对象 ( [类型] => 5 [编码] => 3 [ifsubtype] => 1 [子类型] => JPEG [如果描述] => 0 [ifid] => 0 [字节] => 266988 [如果处置] => 1 [处置] => 附件 // 注意这里... [ifd 参数] => 1 [dparameters] => 数组 ( [0] => 标准类对象 ( [attribute] => FILENAME // 注意这里... [值] => oIROo0jJDb-15.jpg ) ) [if参数] => 1 [参数] => 数组 ( [0] => 标准类对象 ( [attribute] => NAME // 注意这里... [值] => oIROo0jJDb-15.jpg ) ) ) ) )

    我们从 OUTLOOK 中得到什么:

    1 [编码] => 0 [ifsubtype] => 1 [子类型] => 混合 [如果描述] => 0 [ifid] => 0 [如果性格] => 0 [ifd 参数] => 0 [if参数] => 1 [参数] => 数组 ( [0] => 标准类对象 ( [属性] => 边界 [值] => b1_df2cd0669f50efc788d5aecfdded4957 ) ) [部分] => 数组 ( [0] => 标准类对象 ( [类型] => 0 [编码] => 1 [ifsubtype] => 1 [子类型] => HTML [如果描述] => 0 [ifid] => 0 [行] => 23 [字节] => 729 [如果性格] => 0 [ifd 参数] => 0 [if参数] => 1 [参数] => 数组 ( [0] => 标准类对象 ( [attribute] => charset // 注意这里... [值] => iso-8859-1 ) ) ) [1] => 标准类对象 ( [类型] => 5 [编码] => 3 [ifsubtype] => 1 [子类型] => JPEG [如果描述] => 0 [ifid] => 0 [字节] => 266988 [如果处置] => 1 [处置] => 附件 // 注意这里... [ifd 参数] => 1 [dparameters] => 数组 ( [0] => 标准类对象 ( [属性] => 文件名 // 注意这里... [值] => cqLaQAZSei-15.jpg ) ) [if参数] => 1 [参数] => 数组 ( [0] => 标准类对象 ( [attribute] => name // 注意这里... [值] => cqLaQAZSei-15.jpg ) ) ) ) ) ?>

    所以现在,通常为了在某处获取附件,我们使用 if 语句来检查电子邮件的该部分是否有任何附件。对于这种情况,我会参考 PHP IMAP Library Part 1PHP IMAP Library Part 2... 获取附件功能在教程的第 2 部分中。

    获取附件函数:

    函数 getAttachments($imap, $mailNum, $part, $partNum) {
        $附件 = 数组();
    
        if (isset($part->parts)) {
            foreach ($part->parts as $key => $subpart) {
                if($partNum != "") {
                    $newPartNum = $partNum 。 “。” . ($key + 1);
                }
                别的 {
                    $newPartNum = ($key+1);
                }
                $result = getAttachments($imap, $mailNum, $subpart,
                    $新零件号);
                如果(计数($结果)!= 0){
                     array_push($attachments, $result);
                 }
            }
        }
        否则 if (isset($part->disposition)) {
            if ($part->disposition == "ATTACHMENT") { // 注意这里...
                $partStruct = imap_bodystruct($imap, $mailNum,
                    $partNum);
                $attachmentDetails = 数组(
                    “名称” => $part->dparameters[0]->值,
                    "partNum" => $partNum,
                    "enc" => $partStruct->编码
                );
                返回 $attachmentDetails;
            }
        }
    
        返回$附件;
    }

    注意else if 语句中的if 语句您可以看到它与大写ATTACHMENT 比较,但Outlook 结果没有大写ATTACHMENT 他们有attachment。因此,我建议不要使用该行:strtoupper($part->disposition) == 'ATTACHMENT'...

    这样我们的附件就可以工作了……

    所以最终的函数应该是:

    函数 getAttachments($imap, $mailNum, $part, $partNum) {
        $附件 = 数组();
    
        if (isset($part->parts)) {
            foreach ($part->parts as $key => $subpart) {
                if($partNum != "") {
                    $newPartNum = $partNum 。 “。” . ($key + 1);
                }
                别的 {
                    $newPartNum = ($key+1);
                }
                $result = getAttachments($imap, $mailNum, $subpart,
                    $新零件号);
                如果(计数($结果)!= 0){
                     array_push($attachments, $result);
                 }
            }
        }
        否则 if (isset($part->disposition)) {
            if (strtoupper($part->disposition) == "附件") {
                $partStruct = imap_bodystruct($imap, $mailNum,
                    $partNum);
                $attachmentDetails = 数组(
                    “名称” => $part->dparameters[0]->值,
                    "partNum" => $partNum,
                    "enc" => $partStruct->编码
                );
                返回 $attachmentDetails;
            }
        }
    
        返回$附件;
    }

    我希望这能解决问题...因为它对我有用...

    谢谢...

    【讨论】:

    • 非常感谢您的解决方案,非常感谢它解决了我的问题
    猜你喜欢
    • 2018-12-05
    • 2011-08-02
    • 2012-04-05
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 2012-08-27
    相关资源
    最近更新 更多