@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Fix inbound mail handling for messages with no HTML body part

Summary:
See D18776. See <https://discourse.phabricator-community.org/t/cant-create-maniphest-tasks-by-email/754/2>.

The change in D18776 to improve handling of non-utf8 HTML parts broke handling of mail with //no// HTML parts. Partly, this is because MimeMailParser has a "traditional" PHP-style API where the return type is an exciting surprise.

Test Plan:
- Sent a text-only message in `Mail.app`.
- Used "Show Raw" to copy it to `mail.txt`, verifying that the raw message contains ONLY a text body.
- Ran `cat mail.txt | ./scripts/mail/mail_handler.php --trace --process-duplicates`.
- Before patch: error about bad `idx()` on a non-array.
- After patch: clean mail processing.
- Did the same with a message with both HTML and text bodies to make sure I didn't break anything.

Ideally we'd probably get test coverage on this, but it's been touched roughly once a year since 2013 so it'll probably hold.

Reviewers: amckinley, alexmv

Reviewed By: amckinley, alexmv

Differential Revision: https://secure.phabricator.com/D18778

+12 -8
+12 -8
scripts/mail/mail_handler.php
··· 38 38 $content = array(); 39 39 foreach (array('text', 'html') as $part) { 40 40 $part_body = $parser->getMessageBody($part); 41 - $part_headers = $parser->getMessageBodyHeaders($part); 42 - $content_type = idx($part_headers, 'content-type'); 43 - if ( 44 - !phutil_is_utf8($part_body) && 45 - (preg_match('/charset="(.*?)"/', $content_type, $matches) || 46 - preg_match('/charset=(\S+)/', $content_type, $matches)) 47 - ) { 48 - $part_body = phutil_utf8_convert($part_body, 'UTF-8', $matches[1]); 41 + 42 + if (strlen($part_body) && !phutil_is_utf8($part_body)) { 43 + $part_headers = $parser->getMessageBodyHeaders($part); 44 + if (!is_array($part_headers)) { 45 + $part_headers = array(); 46 + } 47 + $content_type = idx($part_headers, 'content-type'); 48 + if (preg_match('/charset="(.*?)"/', $content_type, $matches) || 49 + preg_match('/charset=(\S+)/', $content_type, $matches)) { 50 + $part_body = phutil_utf8_convert($part_body, 'UTF-8', $matches[1]); 51 + } 49 52 } 53 + 50 54 $content[$part] = $part_body; 51 55 } 52 56