toxa82
@toxa82

Каким способом можно раскодировать название файла в письме?

Пытаюсь получить прикрепленные файлы к письму. Обычно названия файлов или не кодируются или кодируются в виде:
public 'attribute' => string 'FILENAME' (length=8)
public 'value' => string '=?UTF-8?B?0LfQsNC60L7QvdGLLnR4dA==?=' (length=36)

Но также нашел письмо в котором имя файла в виде:
public 'value' => string 'UTF-8''%D0%9F%D1%80%D0%B0%D0%B7%D0%B4%D0%BD%D0%B8%D1%87%D0%BD' (length=61)

imap_mime_header_decode($value) в этом случае не помогает.
Я вижу что эту строку можно разбить по '' и применить urldecode, но боюсь что это может сломать названия файлов которые так не закодированы.

Полный дамп части письма полученное из imap_fetchbody():
object(stdClass)[56]
  public 'type' => int 3
  public 'encoding' => int 3
  public 'ifsubtype' => int 1
  public 'subtype' => string 'OCTET-STREAM' (length=12)
  public 'ifdescription' => int 0
  public 'ifid' => int 0
  public 'bytes' => int 55350
  public 'ifdisposition' => int 1
  public 'disposition' => string 'ATTACHMENT' (length=10)
  public 'ifdparameters' => int 1
  public 'dparameters' => 
    array (size=2)
      0 => 
        object(stdClass)[33]
          public 'attribute' => string 'FILENAME*0*' (length=11)
          public 'value' => string 'UTF-8''%D0%9F%D1%80%D0%B0%D0%B7%D0%B4%D0%BD%D0%B8%D1%87%D0%BD' (length=61)
      1 => 
        object(stdClass)[22]
          public 'attribute' => string 'FILENAME*1*' (length=11)
          public 'value' => string '%D0%BE%D0%B5%20%D0%BC%D0%B5%D0%BD%D1%8E%20-%20%E2%84%961.doc' (length=60)
  public 'ifparameters' => int 1
  public 'parameters' => 
    array (size=2)
      0 => 
        object(stdClass)[20]
          public 'attribute' => string 'NAME*0*' (length=7)
          public 'value' => string 'UTF-8''%D0%9F%D1%80%D0%B0%D0%B7%D0%B4%D0%BD%D0%B8%D1%87%D0%BD%D0' (length=64)
      1 => 
        object(stdClass)[53]
          public 'attribute' => string 'NAME*1*' (length=7)
          public 'value' => string '%BE%D0%B5%20%D0%BC%D0%B5%D0%BD%D1%8E%20-%20%E2%84%961.doc' (length=57)


Часть исходника письма:
--=_3318071e8a22163e63d59b7e832d6cf5
Content-Transfer-Encoding: base64
Content-Type: application/octet-stream;
name*0*=UTF-8''%D0%9F%D1%80%D0%B0%D0%B7%D0%B4%D0%BD%D0%B8%D1%87%D0%BD%D0;
name*1*=%BE%D0%B5%20%D0%BC%D0%B5%D0%BD%D1%8E%20-%20%E2%84%961.doc
Content-Disposition: attachment;
filename*0*=UTF-8''%D0%9F%D1%80%D0%B0%D0%B7%D0%B4%D0%BD%D0%B8%D1%87%D0%BD;
filename*1*=%D0%BE%D0%B5%20%D0%BC%D0%B5%D0%BD%D1%8E%20-%20%E2%84%961.doc

0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAASgAAAAAAAAAA
EAAATAAAAAEAAAD+////AAAAAEkAAAD/////////////////////////////////////////////
  • Вопрос задан
  • 977 просмотров
Решения вопроса 1
toxa82
@toxa82 Автор вопроса
Пока остановился на таком варианте:
if (preg_match('/(%[0-9a-f]{2})+/i', $sFileName)) {
    $sFileName = urldecode($sFileName);
}
if (strpos($sFileName, "''")) {
    $aStr = explode("''", $sFileName, 2);
    if (function_exists('mb_list_encodings')) {
        foreach (mb_list_encodings() as $encoding) {
            if (strcasecmp($aStr[0], $encoding) === 0) {
                $sFileName = $this->iconvCharset($aStr[1], $aStr[0]);
                break;
            }
        }
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Centrino
iconv_mime_decode($string,0,"UTF-8");
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы