Ни для кого не секрет что через функцию WordPress «wp_mail» легко можно отправлять файлы. Для этого необходимо передать в параметр функции массив с абсолютными путями к файлам которые в момент отправки будут прикреплены к письму.
Первая проблема с которой можно столкнуться при отправке файлов таким способом — это до адресата будут доходить вложения у которым нет имени файла, в случае если имя файла написано на русском языке.
Например, вы приложили файл который называется «Тёркин Василий.pdf«, получателю будет доставлено письмо с вложением «.pdf«.
Проблема кроется в стороннем классе «PHPMailer» который WordPress использует для отправки сообщений функция — «addAttachment»
Пример вызова в функции wp_mail:
1 2 3 4 5 6 7 8 9 10 11 |
if ( ! empty( $attachments ) ) { foreach ( $attachments as $attachment ) { try { $phpmailer->addAttachment( $attachment ); } catch ( phpmailerException $e ) { continue; } } } |
Пример функции PHPMailer::addAttachment
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment') { try { if (!@is_file($path)) { throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE); } // If a MIME type is not specified, try to work it out from the file name if ($type == '') { $type = self::filenameToType($path); } $filename = basename($path); if ($name == '') { $name = $filename; } $this->attachment[] = array( 0 => $path, 1 => $filename, 2 => $name, 3 => $encoding, 4 => $type, 5 => false, // isStringAttachment 6 => $disposition, 7 => 0 ); } catch (phpmailerException $exc) { $this->setError($exc->getMessage()); $this->edebug($exc->getMessage()); if ($this->exceptions) { throw $exc; } return false; } return true; } |
Проблема кроется в строчке «$filename = basename($path);»
Здесь функция php «basename» — Возвращает последний компонент имени из указанного пути и как раз она по умолчанию обрезает кирилицу из наименования файлов.
Есть аналог функции в WordPress — «wp_basename», которая справляется с русскими наименованиями файлов, но так как PHPMailer это сторонняя библиотека которую использует ядро WordPress, в ней нет возможности указать использование «wp_basename» по этому простым решением проблемы с кирилицей в именах файлов будет указать локаль перед вызовом функции wp_mail
Пример и решение:
1 2 3 4 5 |
setlocale(LC_CTYPE, 'ru_RU.utf8'); wp_mail($multiple_to_recipients, $params['subject'], $params['message'], $headers, $params['files']); |
В нашем случае указание setlocale(LC_CTYPE, ‘ru_RU.utf8’); — перед отправкой письма с файлами будет решеним проблемы с обрезанием имён файлов.
PS: Ни в коем случае не нужно править файлы ядра WordPress если для того не предусмотренно фильтров-хуков!