PHP: How to determine email attachment's MIME type?

拈花ヽ惹草 提交于 2019-12-07 10:53:26

This is a little bit of a complicated case. When the content-type is multipart/mixed that means that there are several pieces of the email. One or more of these might be an attachment (in addition to possibly including an html region or plain text).

When the content-type is multipart/mixed, a boundary is also given. You can use this regex to determine if you are dealing with a multipart email:

$contentType = $this->GetHeader('content-type');
$regex = '%multipart.*?boundary\s*=\s*"?(\w+)?"?%is';
$matches = array();

if (preg_match($regex, $contentType, $matches)) {
    $this->isMultiPart = true;
    $this->boundary = $matches[1];
} else {
    $this->isMultiPart = false;
}

(note that this sample is part of a larger class dealing with email messages)

If your message is a multipart email, the next step is to separate all of the parts. You can do this like so:

$parts = explode("--$this->boundary", $this->fullBody);

The boundary always will start with -- per the email standards. Then the only thing left to do is to parse each of the individual parts.
You probably already have code to do that. Each part will have the same headers that you mentioned in your question: content-type and content-transfer-encoding.
There might be other part headers as well, and you will want to remove them (they will all start with the prefix content if I remember correctly).
Then make sure that if the part is base64 encoded that you account for that (you can check the content-transfer-encoding header to determine this.
The mime-type of the individual attachment will be stored in the part's content-type header just like in the case of a single part message.

One note - this assumes that you are dealing with the raw source of the message. To do this, you can use getRawHeader and getRawContent.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!