Как правильно прикреплять файлы из формы в письмо?

#
Как правильно прикреплять файлы из формы в письмо?
Здравствуйте! Задача такая: есть форма, при отправке она создаёт информационный элемент с заявкой. В форме есть поле Файл, который необходимо прикреплять к письму, а также создавать в информационной системе для заявок допсвойство с отправленным файлом. Я сделал и всё работает, но мне кажется, что наворотил "г..нокода". Есть ли более эффективные решения и все ли я возможности системы использовал здесь именно для отправки файла?

Моя логика такая: раз у информационного элемента есть путь то, чтобы не создавать новых папок, файл для почты нужно кинуть по этому пути. Сразу две задачи и решается — и у свойства есть значение и в почте файл есть.


if (Core_Array::getPost('submit_form')) {
    
    ...
    // код для других перменных
    ...

    // переменные эмейлов
    $aFrom = array_map('trim', explode(',', EMAIL_TO));
    $admin_mail_to = Core_Array::get(Core_Page::instance()->libParams, 'admin_mail_to');
    $from_email = Core_Array::get(Core_Page::instance()->libParams, 'from_email');

    // начальная инициализация отправки почты
    $mail_var = Core_Mail::instance()
        ->to($admin_mail_to)
        ->from($from_email)
        ->header('Reply-To', Core_Valid::email($from_email)? $from_email: $aFrom[0])->contentType('text/plain');

    // подключаемся к системе
    $oInformationsystem_Item = Core_Entity::factory('Informationsystem_Item');
    $oInformationsystem_Item->informationsystem_id = 17;
    $oInformationsystem_Item->informationsystem_group_id = 0;
    $oInformationsystem_Item->active = true;
    $oInformationsystem_Item->path = '';    

    ...
    // код наполнения переменной subject
    ...

    $oInformationsystem_Item->name = strlen($subject) > 0 ? $subject : 'Без данных';
    $oInformationsystem_Item->siteuser_id = $siteuser_id;

    ...
    // код наполнения переменной content
    ...

    $oInformationsystem_Item->text = $content;
    $oInformationsystem->add($oInformationsystem_Item);

    ...
    // Цикл для обработку $_POST
    ...

    ...
    // код наполнения переменной message
    ...

    // Цикл для обработку $_FILES
    foreach($_FILES as $key => $value) {
        $oFile = Core_Array::getFiles($key);
        $form_path = $oInformationsystem_Item->getItemPath();
        
        // Копируем файл по пути информационного элемента
        Core_File::copy($oFile['tmp_name'], $form_path.$oFile['name'], 0644);
        
        // крепим файл к письму
        $mail_var
            ->attach(array(
                'filepath' => $form_path.$oFile['name'],
                'filename' => $oFile['name'],
            ));
        // Подключаемся к созданному заранее свойству
        $oProperty = Core_Entity::factory('Property', 103);
        // Создаём значение и указываем путь
        $oPropertyValue = $oProperty->createNewValue($oInformationsystem_Item->id);
        $oPropertyValue
        ->setHref($oInformationsystem_Item->getItemHref())
        ->setDir($oInformationsystem_Item->getItemPath());
        $oPropertyValue->file = $oFile['name'];
        
        $oPropertyValue->save();
    }

    ...
    // много другого кода
    ...

    $mail_var
        ->subject($subject)
        ->message($message)
        ->send();

}
Ускорение сайтов / Любые работы по сайту / Обращайтесь в nivaks-studio.ru
Модератор
#
Re: Как правильно прикреплять файлы из формы в письмо?
В общем не плохо, несколько замечаний:
1.
$oInformationsystem_Item->active = true;

неверно, т.к. active - числовое значение, варианты 0 или 1.

2.
     // Цикл для обработку $_FILES
    foreach($_FILES as $key => $value) {
        $oFile = Core_Array::getFiles($key);

у вас уже цикл по $_FILES, значение у вас в $value (аналогично значение $oFile), и почему название $oFile, если это массив?

3.
        // Копируем файл по пути информационного элемента
        Core_File::copy($oFile['tmp_name'], $form_path.$oFile['name'], 0644);

для перемещения загруженного с формы файла лучше использовать не Core_File::copy, а Core_File::moveUploadedFile

4. $oFile['name'] нельзя напрямую использовать в пути, нужно применять Core_File::filenameCorrection($oFile['name'])
#
Re: Как правильно прикреплять файлы из формы в письмо?
hostcms писал(а):
неверно, т.к. active - числовое значение, варианты 0 или 1.


Спасибо, изменил

hostcms писал(а):
у вас уже цикл по $_FILES, значение у вас в $value (аналогично значение $oFile), и почему название $oFile, если это массив?


Понял, получается oFile тут можно вообще убрать. А название такое, потому что предполагался изначально только один файл. В любом случае его уже там нет.


foreach($_FILES as $key => $value) {
  $file_path = $oInformationsystem_Item->getItemPath();
  Core_File::moveUploadedFile($value['tmp_name'], $file_path.$value['name'], 0644);
  
  $mail_var
    ->attach(array(
      'filepath' => $file_path.$value['name'],
      'filename' => $value['name'],
    ));
  
  $oProperty = Core_Entity::factory('Property', 103);
  $oPropertyValue = $oProperty->createNewValue($oInformationsystem_Item->id);
  $oPropertyValue
    ->setHref($oInformationsystem_Item->getItemHref())
    ->setDir($oInformationsystem_Item->getItemPath());
    $oPropertyValue->file = Core_File::filenameCorrection($value['name']);
    $oPropertyValue->save();
}


hostcms писал(а):
для перемещения загруженного с формы файла лучше использовать не Core_File::copy, а Core_File::moveUploadedFile


потому что copy где-то оставляет исходник, а move просто переносит?

hostcms писал(а):
$oFile['name'] нельзя напрямую использовать в пути, нужно применять Core_File::filenameCorrection($oFile['name'])


Понял вас.
Ускорение сайтов / Любые работы по сайту / Обращайтесь в nivaks-studio.ru
Модератор
#
Re: Как правильно прикреплять файлы из формы в письмо?
nikolajgromkov писал(а):
потому что copy где-то оставляет исходник, а move просто переносит?

Потому что это метод ожидает именно загруженный файл, в нем идет проверка is_uploaded_file(), если ему подсунуть некий другой файл, то он выдаст исключение и остановит работу. Для работы с загруженными файлами необходимо использовать именно его.
Модератор
#
Re: Как правильно прикреплять файлы из формы в письмо?
$oProperty = Core_Entity::factory('Property', 103); можно вынести за цикл. И $value['name'] вы не везде обработали.

$oProperty = Core_Entity::factory('Property', 103);
$file_path = $oInformationsystem_Item->getItemPath();

foreach($_FILES as $key => $value) {
  $file_name = Core_File::filenameCorrection($value['name']);
  
  Core_File::moveUploadedFile($value['tmp_name'], $file_path . $file_name, 0644);
  
  $mail_var
    ->attach(array(
      'filepath' => $file_path . $file_name,
      'filename' => $file_name,
    ));

  $oPropertyValue = $oProperty->createNewValue($oInformationsystem_Item->id);
  $oPropertyValue
    ->setHref($oInformationsystem_Item->getItemHref())
    ->setDir($oInformationsystem_Item->getItemPath());
    $oPropertyValue->file = $file_name;
    $oPropertyValue->save();
}
#
Re: Как правильно прикреплять файлы из формы в письмо?
пытаюсь провернуть похожее в форме в макете, три поля для файлов, одно из них multiple
из-за него получается ошибка
Предупреждение: is_file() expects parameter 1 to be a valid path, array given в файле /home/l/levelup22/yaretno.ru/public_html/modules/core/mail.php (строка 502)


.....
      $oCore_Mail_Driver = Core_Mail::instance()
                  ->to($to)
                  ->from($from)
                  ->subject($subject)
                  ->message(trim($text))
            ->contentType('text/plain')
                  ->header('X-HostCMS-Reason', 'Alert')
                ->header('Precedence', 'bulk');

               
   foreach($_FILES as $key => $value) {
        $aFileInfo = Core_Array::getFiles($key);
                  
                  if (is_array($aFileInfo) && isset($aFileInfo['name']) && $aFileInfo['size'] > 0)
                  {

                     // Код для аттача:
                     $oCore_Mail_Driver
                        ->attach(array( 'filepath' => $aFileInfo['tmp_name'],
                                                'filename' => $aFileInfo['name'] ));
                  }
    }
     $oCore_Mail_Driver->send();
....
Email: golden-puma@yandex.ru; Skype: golden_puma; Telegram: @GoldenPuma; Сайт: https://goldenpuma.ru
#
Re: Как правильно прикреплять файлы из формы в письмо?
foreach($_FILES as $key => $value) {
   $aAttachments = Core_Array::getFiles($key, array());
   if (is_array($aAttachments) && isset($aAttachments['name']))
   {
      $iCount = count($aAttachments['name']);

      for ($i = 0; $i < $iCount; $i++)
      {
         $aFile = array(
            'name' => $aAttachments['name'][$i],
            'tmp_name' => $aAttachments['tmp_name'][$i],
            'size' => $aAttachments['size'][$i]
         );

         if(intval($aFile['size']) > 0)
         {
            $oCore_Mail_Driver->attach(array(
               'filepath' => $aFile['tmp_name'],
               'filename' => $aFile['name'],
               'Content-ID' => '123456',
               // attachment or inline
               'Content-Disposition' => 'attachment',
               'Content-Type' => 'application/octet-stream'
            ));
         }
      }
   }
}
HostDev.pw - модули для HostCMS, Telegram: @hostdev
Авторизация