Yii2 Прикрепление файлов к email на лету

240
07 октября 2018, 20:50

Вообщем вопрос простой как в yii2 при использовании стандартного функционала прикрепить файл/файлы на лету, т.е. без загрузки на сервер? Прикладывать саму форму не буду она немного безобразна. Вот что в контроллере:

if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            $name = $model->name;
            $tel = $model->tel;
            $email = $model->email;
            $question = $model->question;
            $model->at_file = UploadedFile::getInstance($model, 'at_file');
            $at_file = $model->at_file;
            $model->sendMail(Yii::$app->params['email_to_send'], 'advice', 'Тестовое письмо', ['name' => $name, 'tel' => $tel, 'email' => $email, 'question' => $question, 'at_file' => $at_file]);
            Yii::$app->session->setFlash('form_to_send');
            return $this->refresh();
        }

Ну и вот функция отправки email:

public function sendMail($email, $view, $subject, $params = []) {
    Yii::$app->mailer->getView()->params['name'] = $params['name'];
    Yii::$app->mailer->getView()->params['tel'] = $params['tel'];
    Yii::$app->mailer->getView()->params['email'] = $params['email'];
    Yii::$app->mailer->getView()->params['question'] = $params['question'];
    $result = Yii::$app->mailer->compose([
        'html' => 'views/' . $view . '-html',
        'text' => 'views/' . $view . '-text',
    ], $params);
    foreach ($params['at_file'] as $file) {
        $content_file = file_get_contents($file);
        $result->attachContent($content_file, [
            'fileName' => $file->baseName . '.' . $file->extension,
            'contentType' => $file->type]);
    }
    $result->setTo([$email]);
    $result->setSubject($subject);
    $result->send();
    Yii::$app->mailer->getView()->params['name'] = null;
    Yii::$app->mailer->getView()->params['tel'] = null;
    Yii::$app->mailer->getView()->params['email'] = null;
    Yii::$app->mailer->getView()->params['question'] = null;
    return $result;
}

Задача усложнилась теперь они отправляются, но приходят с весом в 0 байт, ну пустые в буквальном смысле.

Answer 1

Вообщем вот такая функция отправляет несколько файлов с прикреплением на лету.

public function sendMail($email, $view, $subject, $params = []) {
    Yii::$app->mailer->getView()->params['name'] = $params['name'];
    Yii::$app->mailer->getView()->params['email'] = $params['email'];
    Yii::$app->mailer->getView()->params['question'] = $params['question'];
    $result = Yii::$app->mailer->compose([
        'html' => 'views/' . $view . '-html',
        'text' => 'views/' . $view . '-text',
    ], $params);
    foreach ($params['at_file'] as $file) {
        $content_file = file_get_contents($file->tempName);
        $result->attachContent($content_file, [
            'fileName' => $file->baseName . '.' . $file->extension,
            'contentType' => $file->type]);
    }
    $result->setTo([$email]);
    $result->setSubject($subject);
    $result->send();
    Yii::$app->mailer->getView()->params['name'] = null;
    Yii::$app->mailer->getView()->params['email'] = null;
    Yii::$app->mailer->getView()->params['question'] = null;
    return $result;
}
READ ALSO
Вывод php ошибок на сервере

Вывод php ошибок на сервере

Перенес свой проект на серверСервер: ubuntu 16

196
Вставить все значения $_POST в базу данных

Вставить все значения $_POST в базу данных

Сейчас в БД происходит запись так:

192