Здравствуйте, мой клиент попросил меня создать сайт с использованием PHP, с помощью которого он может читать / отвечать на все свои электронные письма со всех своих учетных записей. Теперь у него есть корпоративная учетная запись на сервере Microsoft Exchange, я использую PHP imap_open для получения электронной почты с почтовых серверов, я могу получать вложения электронной почты из учетной записи Gmail, но не могу получить вложения из учетных записей сервера Microsoft Exchange. Ошибка не генерируется, поэтому я не уверен, что не так. Нужно ли мне писать какой-то специальный код для получения вложений из учетных записей электронной почты сервера Microsoft Exchange?
Также аналогичная проблема сохраняется при попытке отправить электронную почту, я могу отправлять электронную почту из системы PHP, используя данные GTP SMTP, но не с сервера Microsoft Exchange
Я все еще занимаюсь исследованиями, но небольшая помощь будет высоко ценится, возможно, если вы просто укажете мне правильное направление, я смогу понять, что не так с моим кодом. Я мало знаю о том, что такое сервер Microsoft Exchange или чем он отличается от других поставщиков электронной почты, таких как Gmail, поэтому я был бы очень признателен, если бы вы просто указали мне правильное направление.
Код поиска вложения работает нормально для учетных записей Gmail
Относительно проблемы отправки почты SMTP для сервера Outlook. У меня была такая же проблема, проблема с номером порта.
использование Port:587
вместо Port:25
или любые другие варианты … Я отправлял из Outlook с этим портом, и каждый раз я успешен.
И для проблемы прикрепления IMAP решение скрыто в чувствительности к регистру …
Если мы посмотрим на функцию object imap_fetchstructure ( resource $imap_stream , int $msg_number)
который обычно отвечает за получение вложений.
Что мы получаем за Gmail и другие:
stdClass Object ( [тип] => 1 [кодировка] => 0 [ifsubtype] => 1 [subtype] => MIXED [ifdescription] => 0 [ifid] => 0 [ifdisposition] => 0 [ifdparameters] => 0 [ifparameters] => 1 [параметры] => массив ( [0] => stdClass Object ( [attribute] => BOUNDARY // Обратите внимание ... [значение] => b1_04114a96a39b7789f88fdabc7feadc61 ) ) [parts] => Массив ( [0] => stdClass Object ( [тип] => 0 [кодировка] => 1 [ifsubtype] => 1 [subtype] => HTML [ifdescription] => 0 [ifid] => 0 [линии] => 20 [байтов] => 597 [ifdisposition] => 0 [ifdparameters] => 0 [ifparameters] => 1 [параметры] => массив ( [0] => stdClass Object ( [attribute] => CHARSET // Обратите внимание ... [значение] => iso-8859-1 ) ) ) [1] => объект stdClass ( [тип] => 5 [кодировка] => 3 [ifsubtype] => 1 [subtype] => JPEG [ifdescription] => 0 [ifid] => 0 [bytes] => 266988 [ifdisposition] => 1 [disposition] => ATTACHMENT // Обратите внимание, здесь ... [ifdparameters] => 1 [dparameters] => Массив ( [0] => stdClass Object ( [attribute] => FILENAME // Обратите внимание ... [значение] => oIROo0jJDb-15.jpg ) ) [ifparameters] => 1 [параметры] => массив ( [0] => stdClass Object ( [attribute] => NAME // Обратите внимание ... [значение] => oIROo0jJDb-15.jpg ) ) ) ) )
Что мы получаем за OUTLOOK:
1 [кодировка] => 0 [ifsubtype] => 1 [subtype] => MIXED [ifdescription] => 0 [ifid] => 0 [ifdisposition] => 0 [ifdparameters] => 0 [ifparameters] => 1 [параметры] => массив ( [0] => stdClass Object ( [атрибут] => граница [value] => b1_df2cd0669f50efc788d5aecfdded4957 ) ) [parts] => Массив ( [0] => stdClass Object ( [тип] => 0 [кодировка] => 1 [ifsubtype] => 1 [subtype] => HTML [ifdescription] => 0 [ifid] => 0 [линии] => 23 [байтов] => 729 [ifdisposition] => 0 [ifdparameters] => 0 [ifparameters] => 1 [параметры] => массив ( [0] => stdClass Object ( [attribute] => charset // Обратите внимание ... [значение] => iso-8859-1 ) ) ) [1] => объект stdClass ( [тип] => 5 [кодировка] => 3 [ifsubtype] => 1 [subtype] => JPEG [ifdescription] => 0 [ifid] => 0 [bytes] => 266988 [ifdisposition] => 1 [disposition] => attachment // Обратите внимание, здесь ... [ifdparameters] => 1 [dparameters] => Массив ( [0] => stdClass Object ( [attribute] => filename // Обратите внимание, здесь ... [value] => cqLaQAZSei-15.jpg ) ) [ifparameters] => 1 [параметры] => массив ( [0] => stdClass Object ( [attribute] => name // Обратите внимание ... [value] => cqLaQAZSei-15.jpg ) ) ) ) ) ?>
Так что теперь, обычно для извлечения вложений где-то, мы используем оператор if для проверки, есть ли в этой части письма какие-либо вложения. В этом контексте я бы сослался на Библиотека PHP IMAP, часть 1 А также Библиотека PHP IMAP, часть 2… Функция Fetching Attachment содержится во второй части учебного пособия.
Получить функцию вложения:
функция getAttachments ($ imap, $ mailNum, $ part, $ partNum) { $ attachments = array (); if (isset ($ part-> parts)) { foreach ($ part-> parts as $ key => $ subpart) { if ($ partNum! = "") { $ newPartNum = $ partNum. "" , ($ ключ + 1); } еще { $ newPartNum = ($ key + 1); } $ result = getAttachments ($ imap, $ mailNum, $ subpart, $ NewPartNum); if (count ($ result)! = 0) { array_push ($ attachments, $ result); } } } else if (isset ($ part-> disposition)) { if ($ part-> disposition == "ATTACHMENT") {// Заметьте здесь ... $ partStruct = imap_bodystruct ($ imap, $ mailNum, $ PartNum); $ attachmentDetails = array ( "name" => $ part-> dparameters [0] -> value, "partNum" => $ partNum, "enc" => $ partStruct-> encoding ); вернуть $ attachmentDetails; } } вернуть $ вложения; }
Обратите внимание на if
заявление внутри else if
Заявление Вы можете увидеть это по сравнению с капиталом ATTACHMENT
но результат Outlook не имеет капитала ATTACHMENT
у них есть attachment
, Поэтому вместо этой строки я рекомендую использовать: strtoupper($part->disposition) == 'ATTACHMENT'
…
Таким образом, у нас работает приложение …
Итак, последняя функция должна быть:
функция getAttachments ($ imap, $ mailNum, $ part, $ partNum) { $ attachments = array (); if (isset ($ part-> parts)) { foreach ($ part-> parts as $ key => $ subpart) { if ($ partNum! = "") { $ newPartNum = $ partNum. "" , ($ ключ + 1); } еще { $ newPartNum = ($ key + 1); } $ result = getAttachments ($ imap, $ mailNum, $ subpart, $ NewPartNum); if (count ($ result)! = 0) { array_push ($ attachments, $ result); } } } else if (isset ($ part-> disposition)) { if (strtoupper ($ part-> disposition) == "ATTACHMENT") { $ partStruct = imap_bodystruct ($ imap, $ mailNum, $ PartNum); $ attachmentDetails = array ( "name" => $ part-> dparameters [0] -> value, "partNum" => $ partNum, "enc" => $ partStruct-> encoding ); вернуть $ attachmentDetails; } } вернуть $ вложения; }
Я надеюсь, что это решит проблему … Потому что это сделал для меня …
Спасибо…
Других решений пока нет …