Что такое код imap_mail_move


Содержание

imap_mail_move

imap_mail_move — Move specified messages to a mailbox

Описание

Moves mail messages specified by msglist to the specified mailbox.

Список параметров

Поток IMAP, полученный из imap_open() .

msglist is a range not just message numbers (as described in » RFC2060).

The mailbox name, see imap_open() for more information

options is a bitmask and may contain the single option:

  • CP_UID — the sequence numbers contain UIDS

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Примечания

imap_mail_move() will flag the original mail with a delete flag, to successfully delete it a call to to the imap_expunge() must be made.

Что такое код imap_mail_move

(PHP 3, PHP 4, PHP 5)

imap_mail_move — перемещает специфицированные сообщения в mailbox.

Описание

int imap_mail_move (int imap_stream, string msglist, string mbox [, int flags])

Перемещает сообщения, специфицированные в списке msglist , в специфицированный mailbox.
msglist это диапазон, а непросто номера сообщений (как описано в RFC2060 ).

Flags это битовая маска, которая может содержать одну опцию:


CP_UID — последовательность номеров содержит UIDS

Возвращает TRUE при успехе, FALSE при ошибке.


imap_mail_move

imap_mail_move — перемещает специфицированные сообщения в mailbox.

Описание

int imap_mail_move (int imap_stream, string msglist, string mbox [, int flags])

Перемещает сообщения, специфицированные в списке msglist, в специфицированный mailbox.
msglist
это диапазон, а не просто номера сообщений (как описано в RFC2060).

Flags это битовая маска, которая может содержать одну опцию:

CP_UID — последовательность номеров содержит UIDS

Возвращает TRUE при успехе, FALSE при ошибке.

Что такое IMAP и POP?

Примечание: Мы стараемся как можно оперативнее обеспечивать вас актуальными справочными материалами на вашем языке. Эта страница переведена автоматически, поэтому ее текст может содержать неточности и грамматические ошибки. Для нас важно, чтобы эта статья была вам полезна. Просим вас уделить пару секунд и сообщить, помогла ли она вам, с помощью кнопок внизу страницы. Для удобства также приводим ссылку на оригинал (на английском языке).

IMAP и POP — это два метода доступа к электронной почте. Рекомендуется использовать IMAP, если вам требуется проверять почту с нескольких разных устройств (например, телефона, ноутбука и планшета).

IMAP позволяет получать доступ к электронной почте везде, где вы находитесь, с любого устройства. При чтении сообщения электронной почты с помощью IMAP вы не скачиваете его и не сохраняете на компьютере; Вместо этого вы читаете его из службы электронной почты. В результате вы можете проверять электронную почту с различных устройств в любом месте мира: на телефоне, компьютере, компьютере друга.

IMAP скачивает сообщение, только когда вы его щелкаете, и вложения не скачиваются автоматически. Так вы сможете проверять сообщения гораздо быстрее, чем с помощью POP.

POP связывается с вашей службой электронной почты и скачивает из нее все новые сообщения. После скачивания на компьютер с Windows или Mac OS сообщения удаляются из почтовой службы. Это значит, что после скачивания почтового сообщения к нему можно обращаться только с того же компьютера. Если вы попытаетесь обратиться к сообщению с другого устройства, ранее скачанные сообщения будут недоступны.

Отправленная почта хранится локально на компьютере с Windows или Mac OS, а не на почтовом сервере.

Многие поставщики услуг Интернета предоставляют учетные записи электронной почты, которые используют POP.

Учетные записи веб-почты или почтовые приложения

Gmail, Outlook.com, Hotmail.com и iCloud — это веб-почта. Вход в учетную запись веб-почты выполняется в Интернете.

Если у вас есть компьютер с Windows или Mac OS, вы, вероятно, использовали программу, например Outlook, Apple Mail или Thunderbird, для управления электронной почтой. Outlook, Apple Mail и Thunderbird — это приложениядля работы с электронной почтой: программы, устанавливаемые на компьютере для управления электронной почтой. Они взаимодействуют с помощью службы электронной почты, например Gmail или Outlook.com, для получения и отправки электронной почты.

В почтовое приложение вы можете добавить любую учетную запись электронной почты, чтобы управлять ею оттуда. Например, вы можете добавить в приложение Outlook или Apple Mail учетные записи веб-почты (Gmail, Outlook.com, Hotmail.com, AOL и Yahoo) и почтовые учетные записи, предоставленные вашей организацией.

Добавление учетных записей веб-почты в почтовые приложения, такие как Outlook, Apple Mail, Thunderbird

Когда вы добавляете учетную запись электронной почты в почтовое приложение, оно пытается настроить доступ методом IMAP без вашего участия.

Если приложению электронной почты не удается добавить свою учетную запись электронной почты, обычно это связано с тем, что учетная запись электронной почты настроена для доступа по протоколу POP. В этом случае необходимо обратиться к поставщику услуг электронной почты и узнать имя сервера POP и SMTP, чтобы можно было ввести информацию в почтовое приложение. Как правило, эти сведения выглядят примерно так:


Сервер входящей почты (IMAP): IMAP. _лт_ имя службы>. com

Сервер входящей почты (POP): pop. имя службы>.com

Сервер исходящей почты (SMTP): smtp. имя службы>.com

Протокол IMAP, Mail ru: настройка почтовой программы

Большинство пользователей почтовых служб электронной почты вполне довольны стандартным веб-клиентом, который им предлагает поставщик услуг. Собственно, именно в таком виде данная почтовая служба используется чаще всего, но происходит это не из-за того, что он такой удобный, а из-за того, что люди просто не знают, где найти альтернативу и как настроить прием почты в сторонних программах. Если электронная почта является для вас рабочим инструментом, то вам наверняка не удастся обойтись без продвинутого почтового клиента, который заменил бы веб-интерфейс. В этом материале разберем, как создать ящик на домене Mail.ru и осуществить настройку почты Mail.ru (IMAP) для разных клиентских программ, включая Outlook и Apple Mail. Тут же разберем основные ошибки, которые возникают при работе с почтовым сервисом в целом и со сторонними почтовыми клиентами в частности.

Регистрация ящика

Зарегистрировать адрес электронной почты Mail.ru можно на официальном сайте сервиса.

При регистрации необходимо заполнить ряд обязательных полей с персональными данными:

  • Имя – можно указать любое, несмотря на требование ввести настоящее имя.
  • Фамилия – можно указать любую.
  • Почтовый ящик – необходимо указать никнейм, но почта предложит его сама.
  • Пароль – необходимо указать сложный пароль, используя специальные символы.

Существуют и другие поля, но их заполнять необязательно.

Протокол IMAP

Данный протокол является наиболее оптимальным и удобным для работы с электронной почтой и поддерживается всеми популярными почтовыми службами. К тому же хранение почты в облаке позитивно сказывается на безопасности и надежности (письма точно не пропадут и всегда будут доступны на разных устройствах).

Правильная настройка Mail.ru через протокол IMAP требует знания определенных данных для обеспечения доступа к ящику:

  • Адрес электронного ящика (имя ящика/email adress) – это полное название вашего ящика, сопровождающийся значком собачки @ и названием домена.
  • Далее следует обозначить сервер для входящей почты IMAP – в нашем случае imap.mail.ru.
  • Исходящая почта отправляется с сервера SMTP – в нашем случае устанавливается сервер smtp.mail.ru
  • Пароль – используемый в данный момент пароль (для доступа к ящику).
  • Затем следует ввести порт для IMAP-сервера (выбираем порт 993, а в качестве протокола шифрования SSL/TSL).
Илон Маск рекомендует:  Что такое код udm_open_stored

Outlook

Настройка Mail.ru (IMAP) для клиента от Microsoft варьируется в зависимости от того, какую именно версию вы используете. В версии 2020 года нужно:

  • Перейти к меню «Файл» в верхнем левом углу.
  • Далее пройти в подменю «Сведения».
  • Затем нажать пункт «Добавить учетную запись».
  • Будет предложено выбрать один из режимов настройки (ручной или автоматический), необходимо выбрать ручной и указать все данные, изложенные выше.
  • Имя пользователя, адрес почтового ящика, текущий пароль.
  • Далее нужно выбрать тип учетной записи IMAP и указать соответствующие серверы.
  • После следует открыть «Дополнительные настройки».
  • Выбрать подменю «Дополнительно» и внести порт 993 в поле IMAP-сервер.

Затем нужно лишь сохранить внесенные изменения, и почтовый ящик заработает.

The Bat!

Настройка Mail.ru (IMAP) в данном клиенте осуществляется с помощью встроенного интерфейса утилиты, предлагающее пошаговое введение данных.


Необходимо добавить новый ящик, чтобы это сделать, нужно:

  • В верхней панели интерфейса нажать на кнопку «Ящик» и выбрать подменю «Новый почтовый ящик».
  • Указать любое название, на ваш вкус, например «Рабочая почта».
  • На следующем экране настроек необходимо ввести полное имя, адрес электронного ящика и организацию.
  • На следующем экране настроек нужно указать данные сервера IMAP – imap.mail.ru.
  • На заключительном экране настроек необходимо ввести адрес своего электронного ящика и пароль для входа в него.

Для дальнейшей настройки необходимо перейти в «Свойства почтового ящика» и указать порт IMAP 993, а порт SMTP 465.

Apple Mail

Настройка Mail.ru (IMAP) в системе macOS осуществляется на уровне системных настроек, либо через встроенную программу «Почта».

Для настройки через приложение «Почта» необходимо проделать следующее:

  • Открыть само приложение «Почта».
  • В верхнем меню выбрать пункт «Файл».
  • Выбрать подменю «Добавить учетную запись».

Так же как и в случае с The Bat, в клиенте от Apple предлагается пошаговая настройка.

В первом окне будет предложено ввести основные данные для ящика:

  • Ваше имя (любое на выбор, оно не должно быть связано с почтовым ящиком).
  • Адрес e-mail (полный адрес с @ и доменом).
  • Пароль (использованный при регистрации на сайте mail.ru).

Дальнейшую настройку программа произведет автоматически, но могут возникнуть ошибки, и тогда программа предложит ввести дополнительные данные.

  • Тип сервера – следует выбрать IMAP.
  • Описание – название ящика (любое, на выбор пользователя).
  • Сервер, куда будет поступать входящая почта – imap.mail.ru.
  • Пароль – пароль, использованный при регистрации на сайте mail.ru.

Далее последует вторая страница ручной настройки.

  • Сервер, откуда будут отправляться ваши письма – нужно указать сервер smtp.mail.ru (внимание, необходимо также поставить пометку напротив опции «Использовать только этот сервер», а также напротив опции «Использовать аутентификацию»).
  • Имя пользователя – здесь нужно ввести полный адрес электронного ящика, вместе с @ и доменом.
  • Пароль – тот самый пароль, что был введен в предыдущем окне.

После проделанных операций программа предложит еще раз проверить все данные и создать новый ящик.

После того как новый ящик был добавлен в список ящиков программы, необходимо изменить порт в настройках. Для этого нужно:

  • Открыть настройки программы «Почта».
  • Выбрать подменю «Учетные записи».
  • В данном подменю необходимо найти пункт «Сервер исходящей почты» и в выпадающем меню выбрать подпункт «Изменить список SMTP-серверов».
  • Далее нужно поставить отметку напротив опции «Использовать произвольный порт» и ввести туда порт 465.
  • Далее необходимо поставить отметку напротив опции «Использовать SSL».


Mail для iOS

Настройка Mail.ru (IMAP) в iOS выполняется тем же методом, что и в macOS, через системные настройки. Для добавления нового ящика необходимо:

  • Пройти в «Настройки – Почта».
  • Открыть список учетных записей и нажать на кнопку «Добавить учетную запись».
  • В списке предложенных доменов выберите «Другое».
  • Далее необходимо указать основные пользовательские данные (имя, адрес электронного ящика, пароль).
  • Затем следует нажать на кнопку «Далее», и программа сама завершит настройку.

Указать сервер и порты придется вручную, для этого следует:

  • Нажать на название вновь созданного ящика.
  • Открыть настройки почтового ящика.
  • В пункте SMTP необходимо указать smtp.mail.ru.
  • В пункте IMAP необходимо указать imap.mail.ru.
  • В настройках SMTP необходимо поставить отметку напротив опции «Использовать SSL» и ввести порт 465.

Mail для Android

Для начала стоит определиться с тем, какой почтовый клиент установлен в системе. В данном руководстве изложена инструкция по настройке стандартного клиента для Android. Настройка Mail.ru (IMAP) осуществляется вручную. Для добавления нового ящика необходимо:

  • Открыть приложение «Электронная почта».
  • Ввести данные почтового ящика (полный адрес с @ с доменом и пароль, использовавшийся при регистрации).
  • Затем коснитесь клавиши «Вручную».

Выберите тип сервера IMAP.

Появится дополнительное меню, в нем понадобится ввести данные для сервера с входящей корреспонденцией:

  • Сервер IMAP – imap.mail.ru.
  • Протокол защиты – SSL/TSL.
  • Необходимо также изменить порт на значение 993 и нажать кнопку «Далее».

Появится дополнительное меню, где понадобится ввести данные сервера с исходящей почтой:

imap_mail_move not working

I have written a class to connect to my mailbox and move the spam to my junk folder. It doesn’t seem to be working though and I don’t know why. Here is what I have:

I get the same output each time saying deleted 115 messages. If i run it twice in quick succession then the output the second time should be deleted 0 messages. So basically it’s not moving them properly because they are not disappearing from the inbox into the junk. Anyone know why? It is getting all the messages and looping through them but it seems the move just isnt happening.

1 Answer 1

First of all I am wondering that you add the UIDs to your array, but you try to delete from the message sequence. You will need to add the options parameter (CP_UID) to your call of imap_mail_move. $result = imap_mail_move($this->mailbox, $id, ‘INBOX.Junk’, CP_UID); That might also be the reason why your expunge does not work, since it might not have moved any message anyway. What is the value of $result during your tries? Since you close your mailbox at the end, you could expunge on close by using imap_close($this->mailbox, CL_EXPUNGE) . Hope that helps, Stefan

Not the answer you’re looking for? Browse other questions tagged php email imap or ask your own question.

Hot Network Questions


Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2020 Stack Exchange Inc; user contributions licensed under cc by-sa 4.0 with attribution required. rev 2020.11.12.35412

Изменение настроек сервера исходящей почты в программе «Почта» на компьютере Mac

Вы можете настроить параметры почтового сервера SMTP, который используется для отправки сообщений, в соответствии с указаниями провайдера учетной записи электронной почты.

Чтобы изменить эти настройки в программе «Почта» на компьютере Mac, выберите пункт меню «Почта» > «Настройки», нажмите «Учетные записи», нажмите «Настройки сервера», нажмите всплывающее меню «Учетная запись сервера исходящей почты», затем выберите «Редактировать список SMTP-серверов».

Доступные серверы и учетные записи, использующие их.

Добавить или удалить сервер. Не удаляйте сервер, используемый учетной записью, если Вы не готовы сразу же выбрать или добавить другой сервер.

Настройки сервера

Описание сервера появляется в боковом меню Почты и в любом всплывающем меню, позволяющем выбрать сервер.

Ваше имя пользователя на почтовом сервере.

Ваш пароль на почтовом сервере.

Имя почтового сервера.

Настроить параметры подключения автоматически

Илон Маск рекомендует:  Возвращение по ссылке

Программа «Почта» будет автоматически управлять настройками учетной записи электронной почты в Почте, такими как номера портов и методы аутентификации.

Если снять этот флажок, Вы можете вручную указать следующие данные (их предоставит поставщик учетной записи электронной почты).

Порт (или Внутренний порт и Внешний порт), Использовать TLS/SSL. Номер порта для отправки почты и настройка использования TLS/SSL.

Аутентификация. Метод аутентификации. Настройка этого параметра возможна только для учетных записей POP и IMAP.

Дополнительно

Некоторые серверы SMTP требуют от компьютеров, которые к ним подключаются, предоставить сертификат, подтверждающий их подлинность.

Разрешить небезопасную аутентификацию

Если Ваша учетная запись не поддерживает защищенную аутентификацию, установите этот флажок, чтобы разрешить программе «Почта» использовать версию без шифрования Вашего имени пользователя и пароля при подключении к почтовому серверу.

IMAP: трудности перехода


Какие грабли зарыты в IMAP

Уже некоторое время IMAP работает в Почте Mail.Ru в полную силу, и я готов рассказать о том, с какими проблемами мы столкнулись при его запуске. Часть из них была связана с особенностями самого протокола и с его историей, другие были обусловлены спецификой взаимодействия IMAP с нашим хранилищем. Отдельная категория трудностей вызвана многообразием почтовых клиентов.

За подробностями — добро пожаловать под кат.

Нынешний запуск IMAP — наш второй подход к снаряду. В прошлый раз мы взяли сервер Dovecot и попробовали заточить его под себя. Результат нас не устроил: с нашими нагрузками и нашей инфраструктурой он сочетался плохо. В этот раз мы решили выбрать другой путь, и написали собственное решение.

IMAP мы запустили в мае, но анонсировали только в июне. Фактически, майская аудитория — это наши сотрудники и те пользователи, у которых клиенты автоматически определили наличие IMAP в нашей Почте и подключили к нему новые добавленные аккаунты.

Трудности, специфичные для протокола IMAP

1. Громоздкость самого протокола

Первая версия протокола IMAP появилась в 1986 году. В данный момент актуален стандарт IMAP версии 4rev1, который был обновлен в 2003 году. За такой долгий срок стандарт существенно разросся: его текущая версия насчитывает порядка 200 страниц.

Сейчас многие моменты, описанные в стандарте, устарели — в сегодняшних условиях они уже не являются необходимостью. Например, в протоколе предусмотрен возврат количества строк и MD5-суммы частей письма — функционал, который фактически не используется в современных клиентах.

Кроме того, существует множество опциональных расширений протокола. Некоторые из них, по сути, являются необходимыми для удобной работы с почтовым ящиком.

Чтобы побороть историческое наследие, нам пришлось реализовать несколько расширений. Одно из них — UID+: когда мы копируем или добавляем письмо, мы возвращаем ID нового письма, которое появилось на сервере в результате копирования или добавления. Это позволяет нам сэкономить на ресурсоемкой операции поиска, которую приходилось проводить клиенту, чтобы распознать, какое именно письмо было добавлено.

2. Отсутствие стандартного паттерна работы с сервером

IMAP предоставляет множество способов решить одну и ту же задачу и, как следствие, практически у всех клиентов паттерн работы различен. Также важно, что паттерны работы существенно отличаются от того, как работает веб-почта или POP3.

Более половины приходится на долю клиентов под устройства Apple: причина в том, что у них хорошо работает автоопределение IMAP. Outloook же, напротив, по умолчанию работает по POP3, и настраивать IMAP нужно руками.

Здесь можно выделить 2 основные категории: десктопные клиенты, которые сразу запрашивают информацию обо всех письмах в ящике или папке, и мобильные клиенты, которые изначально запрашивают информацию только о самых новых письмах. Далее нам оставалось изучить запросы, которые они делают, чтобы обновить состояние, как именно они вытягивают информацию о письмах.

Почему для нас это было необходимым шагом? При скромных нагрузках (например, если сервер обслуживает корпоративную почту небольшой компании) вопрос оптимальности стоит не так остро. Однако при наших объемах оптимальность становится критичной: следовательно, нам нужно было изучить паттерны работы всего зоопарка почтовых клиентов, обращающихся к хранилищу.

3. Количество одновременных сессий

По стандарту, минимальный таймаут сервера — 30 минут. Кроме того, один клиент может держать сразу несколько соединений к серверу (в протоколе не указано максимальное количество разрешенных соединений). Фактически, в нашем масштабе, это означает, что один сервер должен оптимально работать с десятками тысяч одновременных соединений. При работе в синхронном режиме такое количество соединений просто поглотило бы все ресурсы.

Для решения этой проблемы я написал библиотеку для асинхронной работы, построенную на базе edge-triggered epoll. Изначально я ставил перед собой задачу сделать библиотеку, при помощи которой можно было бы в будущем за пару дней написать свой асинхронный сервер для решения других задач, помимо IMAP; в результате практически весь код можно использовать для написания других сервисов.

4. Невозможность однозначно идентифицировать клиент

Наш сервер поддерживает расширение ID, которое позволяет нам идентифицировать примерно половину клиентов. К сожалению, другая половина об этом расширении не знает (из популярных можно назвать, например, Outlook).
Понимание того, с каким клиентом мы работаем, позволяет обойти его характерные баги, а также предсказать, каким будет паттерн работы в рамках данной сессии и, соответственно, оптимизировать работу. Для нас это критично, поэтому, если клиент не называет ID, мы стараемся идентифицировать его другими путями (в случае Outlook — по тегам).

5. Отсутствие команды перемещения сообщений

В клиентах перемещение реализовано через копирование+удаление. Нам, разумеется, хочется, чтобы при этом копия письма помещалась в нужную папку, а оригинал удалялся и не захламлял корзину. С другой стороны, иногда сам пользователь копирует письмо в новую папку, а затем удаляет оригинал: в этом случае удаленное письмо должно помещаться в корзину.
Чтобы различать эти два кейса, после копирования мы в этой же сессии помечаем письмо специальным внутренним флажком. Когда сам пользователь копирует письмо и удаляет оригинал, клиент, как правило, обновляет список писем. При обновлении флажок автоматически сбрасывается, а удаленное письмо оказывается в корзине. Если же письмо (в рамках перемещения) удаляет клиент, обновления не происходит, и письмо, помеченное флажком, удаляется окончательно.

Трудности, связанные с адаптацией текущего хранилища писем и индексов


1. Идентификация сообщений

Для работы по IMAP необходимо было поддержать два вида идентификаторов сообщений: порядковый номер, который может отличаться от сессии к сессии, а также уникальный номер, который сохраняется на все время жизни сообщения. Оба идентификатора должны удовлетворять довольно строгим критериям, которые не соответствовали схеме, используемой веб-почтой и POP3-сервером.

Наиболее рациональным оказывается держать в оперативной памяти весь набор порядковых номеров, их соответствие внутренним идентификаторам, а также IMAP ID. При открытии папки мы вытягиваем из хранилища список всех писем, наши внутренние идентификаторы, IMAP ID, флажки и размер сообщения — все то, что хочется отдавать без лишних запросов.

Обо всех изменениях порядкового номера в рамках одной сессии мы должны оповещать клиент. Согласно стандарту, последовательность IMAP ID должна соответствовать последовательности порядковых номеров. Порядковые номера мы получим, отсортировав список писем по уникальным номерам. Когда клиент выдает новую команду, мы заново открываем соединение с хранилищем, запрашиваем время последних изменений, которые были сделаны в ящике. Если изменений со времени последнего такого запроса не было, то мы просто возвращаем ответ на команду. В ином случае мы заново запрашиваем список сообщений в папке и сравниваем с аналогичным списком клиента. Далее мы либо возвращаем информацию об изменениях, либо, если протокол не позволяет этого сделать сразу, делаем у себя пометку о том, что письмо удалено, и ждем подходящего момента, чтобы сообщить об этом клиенту.

Из-за такой специфики — письма уже нет в ящике, но клиент об этом еще не узнал — клиент может запросить данные об уже удаленном письме. Более того, некоторые из них испытывали серьезные проблемы, если ответа на их запрос не поступало. Чтобы клиент не ломался, мы в ответ на подобные запросы возвращаем заглушки. Клиент получает нужную ему для нормальной работы информацию, а уже при следующем обновлении списка писем (оно, как правило, происходит сразу же) удаляет из него сообщение.

Илон Маск рекомендует:  clip в CSS
2. Необходимость оптимально возвращать информацию о MIME-структуре письма

Практически все клиенты запрашивают информацию о структуре письма. Часто в рамках первой сессии они запрашивают такую информацию сразу обо всех письмах в папке. Парсить письмо на каждый такой запрос было бы крайне неоптимально.
Вместо этого мы сделали кэш MIME-структур. Наличие кэша помогло нам побороть сразу несколько трудностей, связанных с особенностями IMAP — в частности, отсутствие стандартного паттерна работы с сервером: поскольку часть информации хранится в кэше, это помогает нивелировать нагрузку, связанную с разными паттернами работы клиентов.

Сейчас мы кэшируем до 50 сообщений. Почему не 2-3? Дело в том, что некоторые клиенты сначала запрашивают структуру письма, а потом тело, причем сразу для нескольких сообщений; максимальное число писем в такой «пачке» обычно составляет 50 штук.

3. Оптимальная отдача частей письма

Часто клиенты просят лишь текстовые части письма, которые могут находиться в конце самого сообщения. Для отображения сниппетов клиенты могут просить текстовые части сразу у 50-200 писем. Читать весь файл сообщения целиком (и обрабатывать 10 МБ письма для того, чтобы отдать 10 КБ текста) при этом не хочется; использовать индекс для определения позиции части внутри файла при каждом запросе также было бы накладно. В этой ситуации также спасает кэш структуры письма.
Преимущества такого подхода особенно наглядны тогда, когда клиент подгружает сниппеты для нескольких десятков писем: если бы мы не использовали кэш структуры, то для этого приходилось бы просмотреть много мегабайт и пожертвовать скоростью.

Для экономии места в наших хранилищах base64-части хранятся в декодированном виде внутри письма: при работе с веб-почтой это позволяет отдавать аттачи без лишнего перекодирования. Нужно было сделать схему отдачи частей с учетом этого перекодирования. Мы написали потоковое перекодирование на IMAP-сервере. Здесь также помог кэш — благодаря ему мы без перечитывания структуры можем понять, в каком виде (бинарном или нет) хранится тот или иной фрагмент.

4. Особенности работы некоторых клиентов

Некоторые клиенты не полностью соответствуют стандарту RFC: например, стандартные клиенты Android версий 2.2 — 2.3 не могут корректно отображать письма без возврата некоторых необязательных полей. Основная трудность заключалась в том, чтобы определить, какие именно поля каждый из таких клиентов считает для себя обязательными: приходилось решать это методом перебора.

Выше уже упоминалось о том, что у клиентов могут быть различные подходы к удалению писем: одни перемещают их в корзину, другие — удаляют сразу и безвозвратно. При этом некоторые клиенты не понимают стандартное расширение XLIST, которое мы поддерживаем, позволяющее определить, какая именно папка является корзиной. Вместо этого они используют в качестве корзины свою папку (так себя ведет, например, Sparrow).

Интересно ведет себя Outlook: по команде удаления письма не перемещаются в корзину, а помечаются как перечеркнутые, и затем удаляются позже. Выяснилось, что для пользователей это выглядит, как баг — многие просто не понимают, что делать дальше и как добиться того, чтобы клиент вел себя привычным образом и письма оказались в корзине.

В условиях такого разнообразия нам также было необходимо эмпирически понять, как ведет себя каждый из клиентов, и подстроиться под эти варианты — причем таким образом, чтобы пользователь мог быть уверен: независимо от того, в каком клиенте он работает, почта отреагирует на его действия привычно и предсказуемо (в данном случае — удаленное письмо окажется к корзине). Решали мы это, пробуя различные ответы через тестовый прокси-сервер и отслеживая реакцию клиента на каждый из вариантов.

То, что мы вынесли для себя: IMAP — достаточно «развесистая» штука, с множеством исторических особенностей, нажитых за 26 лет, которые умножаются на разнообразие почтовых клиентов. При наших нагрузках это выливается в то, что брать готовое решение и пытаться заточить его под себя нерационально: в лучшем случае объем работы будет таким же, как при самостоятельной разработке решения. Этим путем мы и пошли :)

imap_mail_move

imap_mail_move — перемещает специфицированные сообщения в mailbox.

Описание

int imap_mail_move (int imap_stream, string msglist, string mbox [, int flags])

Перемещает сообщения, специфицированные в списке msglist , в специфицированный mailbox.
msglist это диапазон, а не просто номера сообщений (как описано в RFC2060).

Flags это битовая маска, которая может содержать одну опцию:



CP_UID — последовательность номеров содержит UIDS

Возвращает TRUE при успехе, FALSE при ошибке.

PHP imap_mail_move: какой правильный идентификатор из imap_header использовать?

Итак, вот дамп imap_header .

stdClass Object ([date] => вт, 11 июня 2013 19:12:28 -0700 [Date] => вт, 11 июн 2013 19:12:28 -0700 [subject] => Аккаунт на форуме darnhippies.org заблокирован [Subject] => Аккаунт на форуме darnhippies.org заблокирован [message_id] => [toaddress] => webmaster@example.com [to] => Array ([0] => Объект stdClass ([mailbox] => webmaster [host] => example.com)

Я пытался переместить, используя $header->Msgno в качестве идентификатора сообщения, я полагаю, поскольку ни одно сообщение не было перемещено, что это неправильный идентификатор.

Поэтому я использую (в этом примере) $header->message_id в качестве идентификатора сообщения для перемещения?

Я также попытался использовать полное имя входящей почты, включая адрес сервера, просто потому, что.

Я получаю следующие ошибки в 90% случаев .

Ошибка: массив ([0] => ошибка протокола IMAP: ошибка в команде IMAP. COPY: недействительный набор сообщений. [1] => ошибка в команде IMAP. COPY: неправильный набор сообщений).

Итак, как мне найти правильный идентификатор сообщения?

Я знаю, что могу передать список идентификаторов через запятую, я просто сначала пытаюсь переместить одно сообщение.

Джон, тебе следует использовать UID сообщения, чтобы убедиться, что ты ссылаешься на правильный адрес электронной почты. Msgno — это порядковый номер, который изменяется при добавлении и удалении электронных писем из почтового ящика. Вы получаете UID сообщения в php (используя библиотеку php imap) с помощью:

результирующий $ uid уникален в почтовом ящике навсегда.

Когда вы используете UID для перемещения / чтения / любого сообщения, вам необходимо добавить параметр к параметрам, передаваемым в соответствующую функцию, чтобы указать, что вы используете UID, а не msgno, например:

$body = imap_fetchbody(*stream handle*, $uid, *mime-type*, FT_UID);

FT_UID — это константа, которая сообщает библиотеке imap, что вторым параметром является UID не msgno .

Документация php.net довольно хорошая, когда дело доходит до библиотеки imap, и ее стоит прочитать.

Между прочим, message_id должен быть уникальным для всех электронных писем во всем мире, если отправитель встречает соответствующие RFC

В IMAP каждое сообщение имеет два идентификатора: порядковый номер сообщения (который я предполагаю, что в PHP — msgNo) и уникальный идентификатор (UID). Порядковый номер сообщения может изменяться при добавлении и удалении сообщений из почтового ящика, но UID является постоянным в течение всего срока жизни сообщения *.

Используемая вами строка — это «Message-Id» из заголовка Message-Id из электронного письма, которое нельзя использовать для перемещения сообщений (например, оно не обязательно уникально). Если у вас есть UID, вы можете использовать imap_mail_move с флагом модификатора UID для перемещения сообщения.

(Я не знаком с PHP API, но, возможно, вы можете передать флаг модификатора UID в message_header, чтобы получить там и UID в вашем наборе результатов.)

*: Пока не изменяется UIDVALIDITY папки, чего не следует делать на серверах с хорошим поведением, если папка не удалена и не воссоздана с тем же именем.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL