Как отправить файл на указанный мейл через formit?

Пользователь указывать имейл в форме и ему на эту почту приходит файл.

Как это можно сделать? В инете везде инструкции только если пользователи сами добавляют файлы.

использую связь formit + ajaxform.
UDAV
05 июня 2017, 15:39
modx.pro
5
5 579
0

Комментарии: 21

Андрей
06 июня 2017, 20:38
3
+1
Я на одном проекте так делал, просто хук написал который отправляет письмо и файл.

Создаете сниппет, например hookSendFile и указываете его в параметре &hooks=`hookSendFile` при вызове формы, при этом стандартный хук email не нужен
$fields = $hook->getValues(); //поля из формы

$message = $modx->getChunk('чанк_с_письмом', $fields);
 
$modx->getService('mail', 'mail.modPHPMailer');
$modx->mail->set(modMail::MAIL_BODY, $message);
$modx->mail->set(modMail::MAIL_FROM, $modx->getOption('emailsender'));
$modx->mail->set(modMail::MAIL_FROM_NAME, $modx->getOption('site_name'));
$modx->mail->set(modMail::MAIL_SUBJECT, 'Тема письма');
$modx->mail->address('to', $fields['email']);
$modx->mail->address('reply-to', $modx->getOption('emailsender'));
$modx->mail->attach($modx->getOption('base_path').'путь/к/файлу');
$modx->mail->setHTML(true);

if (!$modx->mail->send()) {
  $modx->log(modX::LOG_LEVEL_ERROR,'An error occurred while trying to send the email: '.$modx->mail->mailer->ErrorInfo);
}

$modx->mail->reset();

return true;
    UDAV
    06 июня 2017, 21:29
    0
    Спасибо большое, но что то не выходит…

    [[!AjaxForm?
    &snippet=`FormIt`
    &form=`tpl.AjaxForm.price`
    &emailTpl=`tpl.email.price`
    &hooks=`hookSendFile`
    &emailSubject=`Прайс-лист`
    &emailTo=`site@site.ru`
    &emailFrom=`site@site.ru`
    &emailFromName=`site.ru`
    &validate=`email:required`
    &validationErrorMessage=`В форме содержатся ошибки!`
    &successMessage=`Сообщение успешно отправлено`
    ]]

    форма

    <form action="[[~[[*id]]]]" method="post" enctype="multipart/form-data">
      <input type="text" name="email">
      <button type="submit" name="button">Скачать</button>
    </form>

    В шаблоне письма просто текст, «спасибо за запрос» и все.

    Ничего не присылает.

    Файл лежит в корне сайта, поэтому просто указал название файла… в логах нет ошибок.
      Андрей
      06 июня 2017, 21:39
      0
      Возможно с путем к файлу что-то не так, раз само письмо приходит.
        UDAV
        06 июня 2017, 21:44
        0
        не не… письмо вообще не приходит… оно приходит если указать хук email
          Андрей
          06 июня 2017, 21:51
          0
          А в журнале ошибок Modx есть что-то?
            UDAV
            06 июня 2017, 21:58
            0
            неа… может быть сервер рубит на корню такие письма? что не хватает какого-то заголовка или еще что то?
              Андрей
              06 июня 2017, 22:05
              0
              Надо на сайте смотреть тогда, почему не работает.

              Тут надо имя чанка еще указать, т.к. то, что в вызове сниппета указано не подцепляется.
              $message = $modx->getChunk('чанк_с_письмом', $fields);
              т.е. будет
              $message = $modx->getChunk('tpl.email.price', $fields);
                UDAV
                06 июня 2017, 22:09
                0
                это да, видел, указал конечно… ладно, попробую на другом сервере.
                  Андрей
                  06 июня 2017, 22:18
                  0
                  Если установлен плагин Console, то можно этот код там выполнить, только закомментировать переменную $fields и указать сообщение и почту.

                  Письмо должно придти, а если будет ошибка то сразу покажет.

                  У себя сейчас проверил все работает.
                    UDAV
                    07 июня 2017, 07:55
                    0
                    Вроде все заработало, спасибо. Ночью все тестовые письма пришли… Странно что с такой задержкой, но пришли!
      Андрей
      14 декабря 2017, 08:39
      0
      письмо приходит, но файл не прикладывается. наверное, потому что имя файла в переменной из другого сниппета не передается. как его можно передать? я просто писал имя переменной из сниппета где оно создается
      $modx->mail->attach($modx->getOption('base_path').'assets/pdf/'.$file_name.'.pdf');
        Андрей
        14 декабря 2017, 09:06
        0
        Можете показать как вы вызываете сниппет и как отправка происходит?

        Вообще если в сниппет передан параметр file_name, то должна появиться переменная $file_name.

        Можно конечно получить забрать значение из сниппета так:
        $file_name = $modx->getOption('file_name', $scriptProperties);
        
        // или так
        
        $file_name = $scriptProperties['file_name'];
          Андрей
          14 декабря 2017, 18:00
          1
          0
          [[!FormIt?
          &pdfTpl=`tpl.PDF`
          &hooks=`pdf, SendFilePDF, redirect`
          &author=`Автор PDF`
          &title=`Заголовок PDF`
          &emailTpl=`sentEmailTpl`
          &emailSubject=`Заявка на подключение`
          &validate=`contact_name:required:minLength=^2^,
          contact_email:email:required,
          contact_message:required`
          &store=`1`
          &redirectTo=`20`
          ]]
          сниппет pdf
          <?php
          $pdo = $modx->getService('pdoFetch'); 
          $pdfTpl = $modx->getOption('pdfTpl', $formit->config, '', true);
          $author = $modx->getOption('author', $formit->config, 'Автор', true);
          $title = $modx->getOption('title', $formit->config, 'Заголовок PDF', true);
          $content = $pdo->getChunk($pdfTpl, $fields);
          $config = array();
          $config = array_merge($config, $fields, array(
              'content' => $content,
              'author' => $author,
              'title' => $title,
          ));
          // формируем ссылку на PDF
          $hook->setValue('pdf_link', $modx->runSnippet('PdfCreate', $config)); 
          return true;
          и сниппет PdfCreate
          <?php
          $date = date('Y-m-d_H-i-s', time()) . '_' .rand(1, 100);
          
          $corePath = $modx->getOption('pdfresource.core_path', null, $modx->getOption('core_path') . 'components/pdfresource/');
          $pdfresource = $modx->getService('pdfresource', 'PDFResource', $corePath . 'model/pdfresource/', array(
              'core_path' => $corePath
          ));
          
          $content = $modx->getOption('content', $scriptProperties, '', true);
          $title = $modx->getOption('title', $scriptProperties, '', true);
          $author = $modx->getOption('author', $scriptProperties, '', true);
          
          $aliasPath = MODX_ASSETS_PATH . 'pdf/';
          $site_url = $modx->getOption('site_url');
          
          // настройки PDFResource (подробнее почитать здесь: http://jako.github.io/PDFResource/usage/)
          $pdfresource->initPDF(array(
              'mode' => 'utf-8',
              'format' => 'A4',
              'defaultFontSize' => intval(8),
              'defaultFont' => '',
              'mgl' => intval(10),    // margin left
              'mgr' => intval(10),    // margin right
              'mgt' => intval(7),     // margin top
              'mgb' => intval(7),     // margin bottom
              'mgh' => intval(10),    // margin header
              'mgf' => intval(10),    // margin footer
              'orientation' => 'P',   // ориентация PDF
              'customFonts' => '[]',
          ));
          
          $pdfresource->pdf->SetTitle($title);
          $pdfresource->pdf->SetAuthor($author);
          $pdfresource->pdf->SetCreator($modx->getOption('site_url'));
          
          $pdfresource->pdf->WriteHTML($content, 2);
          
          $file_name = $date;
          $pdfresource->pdf->Output($aliasPath . $file_name . '.pdf', 'F');
          return $site_url . ltrim($modx->getOption('assets_url'), '/') . 'pdf/' .$file_name. '.pdf';
          в который и генерит имя файла в переменной $file_name по сути равной дате, но вот как эту переменную передать в другой сниппет я не могу понять, просто указание имени не помогает
            Андрей
            14 декабря 2017, 18:24
            +1
            Попробуйте в форму добавить скрытое поле (возможно не обязательно)
            <input type="hidden" name="pdf_link">

            В сниппете SendFilePDF, который отправляет письмо с файлом, будет доступно поле pdf_link
            $fields = $hook->getValues();
            $file = $fields['pdf_link'];

            Т.е. получается, что вы в сниппете pdf генерируете файл и записываете в поле pdf_link, а в сниппете SendFilePDF уже получаете значение со ссылкой.

            Либо просто объедините pdf и SendFilePDF в один сниппет.

            Попробуйте еще в чанке с письмом вывести [[+pdf_link]]
              Андрей
              14 декабря 2017, 19:09
              0
              да, объединить сниппеты оказалось самым простым выходом из ситуации))
              спасибо!
                Fedor
                05 января 2019, 02:52
                0
                Андрей здравствуйте, возникла такая же проблема что не приходит файл… не поделитесь объединенным снипетом?
                  Андрей
                  05 января 2019, 16:27
                  3
                  0
                  ох, давно это было… я может что-то еще там менял.
                  вот рабочий итог
                  [[!FormIt?
                              &pdfTpl=`tpl.PDF1`
                              &hooks=`formit2file, SendFilePDF, redirect`
                              &author=`www.ru`
                              &title=`Заявка`
                              &emailTpl=`sentEmailTpl`
                              &validate=`contact_email:required`
                              &store=`1`
                              &redirectTo=`108`
                              ]]
                  formit2file
                  <?php
                  // initialize output;
                  $output = true;
                  $counter = 1;
                   
                  // valid extensions
                  $ext_array = array('jpg', 'png', 'gif', 'JPG', 'zip', 'rar', '7z', 'rar5');
                   
                  // create unique path for this form submission
                  $uploadpath = 'assets/pdf/';
                   
                  // get full path to unique folder
                  $target_path = $modx->config['base_path'] . $uploadpath;
                   
                  // get uploaded file names:
                  $submittedfiles = array_keys($_FILES);
                   
                  // loop through files
                  foreach ($submittedfiles as $sf) {
                   
                      // Get Filename and make sure its good.
                      $filename = basename( $_FILES[$sf]['name'] );
                   
                      // Get file's extension
                      $ext = pathinfo($filename, PATHINFO_EXTENSION);
                      $ext = mb_strtolower($ext); // case insensitive
                   
                      // is the file name empty (no file uploaded)
                      if($filename != '') {
                           
                          // is this the right type of file?
                          if(in_array($ext, $ext_array)) {
                       
                              // clean up file name and make unique
                              $filename = $counter . '.' . $ext; 
                              $filename = str_replace(' ', '_', $filename); // spaces to underscores
                              $filename = date("G-i-s_") . $filename; // add date & time
                               
                              // full path to new file
                              $myTarget = $target_path . $filename;
                               
                              // create directory to move file into if it doesn't exist
                              mkdir($target_path, 0755, true);
                               
                              // is the file moved to the proper folder successfully?
                              if(move_uploaded_file($_FILES[$sf]['tmp_name'], $myTarget)) {
                                  // set a new placeholder with the new full path (if you need it in subsequent hooks)
                                  $myFile = $uploadpath . $filename;
                                  $hook->setValue($sf,$myFile);
                                  // set the permissions on the file
                                  if (!chmod($myTarget, 0644)) { /*some debug function*/ }
                                   
                              } else {
                                  // File not uploaded
                                  $errorMsg = 'There was a problem uploading the file.';
                                  $hook->addError($sf, $errorMsg);
                                  $output = false; // generate submission error
                              }
                           
                          } else {
                              // File type not allowed
                              $errorMsg = 'Type of file not allowed.';
                              $hook->addError($sf, $errorMsg);
                              $output = false; // generate submission error
                          }
                       
                      // if no file, don't error, but return blank
                      } else {
                          $hook->setValue($sf, '');
                      }
                  $counter = $counter + 1;
                  }
                  return $output;
                  SendFilePDF
                  <?php
                  $fields = $hook->getValues(); //поля из формы
                  $NF = $fields['filesToUpload'];//получаем имя и путь загруженного файла
                  $fields['filesToUpload'] = str_replace('assets/pdf/','',$fields['filesToUpload']);
                  $mail_z = $fields['contact_email'];
                  $message = $modx->getChunk('sentEmailTpl', $fields);
                  
                  //формируем PDF
                  $pdo = $modx->getService('pdoFetch'); 
                  $pdfTpl = $modx->getOption('pdfTpl', $formit->config, '', true);
                  $content = $pdo->getChunk($pdfTpl, $fields);
                  
                  $config = array();
                  $config = array_merge($config, $fields, array(
                      'content' => $content,
                      'author' => $author,
                      'title' => $title,
                  ));
                  // формируем ссылку на PDF
                  $result = $modx->runSnippet('PdfCreate', $config);
                   
                  $modx->getService('mail', 'mail.modPHPMailer');
                  $modx->mail->set(modMail::MAIL_BODY, $message);
                  $modx->mail->set(modMail::MAIL_FROM, $modx->getOption('emailsender'));
                  $modx->mail->set(modMail::MAIL_FROM_NAME, $modx->getOption('site_name'));
                  $modx->mail->set(modMail::MAIL_SUBJECT, 'Поступила заявка');
                  $modx->mail->address('to', 'xxx@gmail.com');
                  $modx->mail->address('to', 'xxx@mail.ru');
                  $modx->mail->address('to', $mail_z);
                  $modx->mail->address('reply-to', $modx->getOption('emailsender'));
                  $modx->mail->attach($modx->getOption('base_path').'assets/pdf/'.$result.'.pdf');
                  $modx->mail->attach($modx->getOption('base_path').$NF);
                  $modx->mail->setHTML(true);
                  
                  if (!$modx->mail->send()) {
                    $modx->log(modX::LOG_LEVEL_ERROR,'An error occurred while trying to send the email: '.$modx->mail->mailer->ErrorInfo);
                  }
                  
                  $modx->mail->reset();
                  
                  return true;
                  PdfCreate
                  <?php
                  $date = date('Y-m-d_H-i-s', time()) . '_' .rand(1, 100);
                  
                  $corePath = $modx->getOption('pdfresource.core_path', null, $modx->getOption('core_path') . 'components/pdfresource/');
                  $pdfresource = $modx->getService('pdfresource', 'PDFResource', $corePath . 'model/pdfresource/', array(
                      'core_path' => $corePath
                  ));
                  
                  $content = $modx->getOption('content', $scriptProperties, '', true);
                  $title = $modx->getOption('title', $scriptProperties, '', true);
                  $author = $modx->getOption('author', $scriptProperties, '', true);
                  
                  $aliasPath = MODX_ASSETS_PATH . 'pdf/';
                  $site_url = $modx->getOption('site_url');
                  
                  // настройки PDFResource (подробнее почитать здесь: http://jako.github.io/PDFResource/usage/)
                  $pdfresource->initPDF(array(
                      'mode' => 'utf-8',
                      'format' => 'A4',
                      'defaultFontSize' => intval(13),
                      'defaultFont' => '',
                      'mgl' => intval(30),    // margin left
                      'mgr' => intval(10),    // margin right
                      'mgt' => intval(30),     // margin top
                      'mgb' => intval(10),     // margin bottom
                      'mgh' => intval(10),    // margin header
                      'mgf' => intval(10),    // margin footer
                      'orientation' => 'P',   // ориентация PDF
                      'customFonts' => '[]',
                  ));
                  
                  $pdfresource->pdf->SetTitle($title);
                  $pdfresource->pdf->SetAuthor($author);
                  $pdfresource->pdf->SetCreator($modx->getOption('site_url'));
                  
                  $pdfresource->pdf->WriteHTML($content, 2);
                  
                  $file_name = $date;
                  $pdfresource->pdf->Output($aliasPath . $file_name . '.pdf', 'F');
                  
                  return $file_name;
                    Илья Александрович
                    27 июня 2020, 23:24
                    0
                    Воспользовался Вашим методом, всё работает.
                    Но мне нужно улучшить, что бы в письмо на емайл и сам файл пдф можно было вставить ссылку на файл для скачивания и возможность показывать ссылку после отправки формы в сообщении типо: Спасибо, вот ваш файл для скачивания.
                    Можете в этом помочь? Или есть кто это реализовал у себя? Подскажите как =)
        Андрей
        16 декабря 2017, 12:20
        0
        Еще вопрос возник — а как с этим хуком пользователю приложить файл?
        добавляю в форму
        <div>
          <label for="files">Прикрепить файлы</label>
          <input type="file" name="filesToUpload" id="filesToUpload" value="[[!+fi.filesToUpload]]" />
        </div>
        в чанке указываю
        Прикрепленный файл: [[+filesToUpload]]
        но в письме в итоге так и приходит [[+filesToUpload]]
        Если с тем же чанком использую стандартный сниппет FormIt email то файл нормально прикладывается.
          Андрей
          16 декабря 2017, 14:36
          0
          решил сохранять этот файл на сервер, а потом по аналогии его прикреплять к письму.
          Андрей
          17 декабря 2017, 17:18
          0
          а какие ограничение по размеру отправляемого файла здесь?
          upload_max_filesize:12М, но даже 8М с чем-то не пролазит, а более мелкий размер, до 1мегабайта — легко.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          21