извлекать тело из сырой электронной почты с регулярным выражением

--047d7b33d6decd251504bfe78895 Content-Type: multipart/alternative; boundary=047d7b33d6decd250d04bfe78893 --047d7b33d6decd250d04bfe78893 Content-Type: text/plain; charset=UTF-8 twest ini sebuah proiduct abru awdawdawdawdwa aw awdawdaw --047d7b33d6decd250d04bfe78893 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <div class=3D"gmail_quote">twest=C2=A0<div><br></div><div>ini sebuah proidu= ct abru</div><div><br></div><div>awdawdawdawdwa</div><div><br></div><div>aw= </div><div>awdawdaw</div> </div><br> --047d7b33d6decd250d04bfe78893-- 
  1. как я могу получить текст почты / plain и текст / html-контент с регулярным выражением?
  2. имеет ли электронное письмо только 1 контент? состоящий из текста / html и текста / plain

* heres фрагмент, что im в настоящее время делает это неправильно.

  $parts = explode('--', $this->rawemail); $this->headers = imap_rfc822_parse_headers($this->rawemail); # var_dump($parts); # Process the parts foreach ($parts as $part) { # Get Content text/plain if (preg_match('/Content-Type: text\/plain;/', $part)) { $body_parts = preg_split('/\n\n/', $part); # If Above the newline (Headers) if ($body_parts[0]) { # var_dump($body_parts[0]); } # If Below the newline (Data) if ($body_parts[1]) { var_dump($body_parts[1]); } } # Get Content text/html if (preg_match('/Content-Type: text\/html;/', $part)) { $body_parts = preg_split('/\n\n/', $part); # If Above the newline (Headers) if ($body_parts[0]) { # var_dump($body_parts[0]); } # If Below the newline (Data) if ($body_parts[1]) { var_dump($body_parts[1]); } } 

Related of "извлекать тело из сырой электронной почты с регулярным выражением"

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

Вашими правилами будут:

  • Если вы получаете двойной разрыв строки, тогда тело начинает – обычный текстовый тип (поскольку заголовков нет, чтобы указать, какой из них).
  • В противном случае, продолжайте, пока вы не получите бит «border =», а затем запишите границу и переместитесь в режим «искать границу».
  • Затем, когда вы найдете границу, перейдите в режим «Поиск типа контента или двойной новой строки» и найдите Content-Type (и обратите внимание на контент-тип) или двойную новую строку (заголовок закончил, тело следующего до следующей границы)
  • При чтении тела сообщения вы снова находитесь в режиме поиска в режиме «границы», чтобы повторить процесс.

Что-то, что я помню давно, так что следующее не может быть на 100% точным, но я напомню на всякий случай. Будьте осторожны с файлами с attachemnts, поскольку вы можете получить два «пограничных» маркера. Но одна граница имеет другую границу, поэтому, если вы будете следовать правилам выше (т.е. захватите первую границу и придерживайтесь ее), тогда вы должны быть в порядке. Но проверьте свой скрипт с некоторыми attachemnts 🙂


Изменить: дополнительную информацию, заданную в вопросе. В электронном письме может быть столько «тел», сколько пользователь хочет кодировать. Вы можете иметь простой и HTML, кодированную версию UTF и версию RTF или даже версию Morse Code (если клиент знал, как обрабатывать «Content-Type Morse / Code»!). Иногда вы не получаете простой текст, а только версии HTML (непослушные пользователи). Иногда HTML фактически приходит без объявления типа контента (которое может отображаться или не отображаться как HTML, в зависимости от клиента). Граница также отделяет вложения. Богатый тест – это получение от Outlook (хотя, если быть справедливым, оно обычно преобразуется в HTML). Так что нет, есть где-то между 0 и X телами.