Страница 1 из 1

Отправка почты с вложением

Добавлено: 2018.09.19, 16:27
Kven
Здравствуйте! Прошу помощи, функция описанная ниже формирует pdf документ, возможно ли описать функцию так, чтобы была отправка письма и данный формируемый документ налету прикреплялся к письму. Вопрос в том, как правильно описать функцию отправки письма с подобным вложением?

Код: Выделить всё

public function actionMail($id)
{
    $model = $this->findModel($id);
    $this->layout = 'pdf';
    Yii::$app->response->format = \yii\web\Response::FORMAT_RAW;
    $headers = Yii::$app->response->headers;
    $headers->add('Content-Type', 'application/pdf');
    $content = $this->renderPartial('_forma', ['model'=>$model]);
    $pdf = new Pdf([
        'mode' => Pdf::MODE_UTF8,
        'format' => Pdf::FORMAT_A4, 
        'orientation' => Pdf::ORIENT_LANDSCAPE, 
        'destination' => Pdf::DEST_BROWSER, 
        'content' => $content,  
        'cssFile' => '@vendor/kartik-v/yii2-mpdf/assets/kv-mpdf-bootstrap.min.css',
        'cssInline' => '.kv-heading-1{font-size:18px}', 
        'options' => ['title' => 'Krajee Report Title'],
    ]);
    return $pdf->render(); 
}

Re: Отправка почты с вложением

Добавлено: 2018.09.19, 16:35
lenbord

Код: Выделить всё

/**
     * Send user order message.
     *
     * @static
     * @param \frontend\modules\product\models\Order $order Order model.
     * @return bool
     */
    public static function sendUserOrderLetter(Order $order)
    {
        $template = EmailTemplate::findTemplateUserOrder();

        if (!$template) {
            return false;
        }

        $text = $template->getTextWithReplacedPlaceholdersUserOrder($order);

        $mailer = Yii::$app->mailer;

        $content = Yii::$app->view->renderFile('@app/modules/product/views/order/generate-pdf.php', ['modelOrder' => $order]);

        $pdf = new Pdf([
            'mode' => Pdf::MODE_UTF8,
            'format' => Pdf::FORMAT_A4,
            'cssFile' => Yii::getAlias('@frontend/web/css/pdf.css'),
            'destination' => Pdf::DEST_BROWSER,
            'content' => $content,
            'options' => ['title' => 'Order Report'],
        ]);

        $api = $pdf->getApi();
        $api->SetFooter(Yii::$app->view->renderFile('@app/modules/product/views/order/pdf-footer.php'));

        $fileName = md5(time()) . '.pdf';
        $filePath = Yii::getAlias('@frontend/runtime/' . $fileName);

        $attachment =  $pdf->output($content, $filePath, Pdf::DEST_FILE);

        $result =  $mailer->compose()
            ->setFrom([$mailer->transport->getUsername() => $template->from])
            ->setTo($order->orderShippingInformation->email)
            ->setHtmlBody($text)
            ->setSubject($template->subject)
            ->attach($filePath)
            ->send();

        unlink($filePath);

        return $result;

    }
вот как я это делал, думаю сможешь понять что к чему))

Re: Отправка почты с вложением

Добавлено: 2018.09.20, 09:36
Kven
Я не так давно работаю с YII2, попробовал воспользоваться Вашей функцией, но скорее всего я ее как-то неправильно изменил под свои нужды.
Ошибка

Код: Выделить всё

fopen(/upload/documents/rctp/pdf/4cb22cfa360ff00f1065aa86c6c64305.pdf): failed to open stream: No such file or directory
Контроллер

Код: Выделить всё

public function actionPdf($id)
{
    $model = $this->findModel($id);
    // $content = Yii::$app->view->renderFile('@app/modules/product/views/order/generate-pdf.php', ['modelOrder' => $order]);
    $content = Yii::$app->view->renderFile('@app/views/order/_forma.php', ['model'=>$model]);

    $pdf = new Pdf([
        'mode' => Pdf::MODE_UTF8,
        'format' => Pdf::FORMAT_A4,
        'cssFile' => '@vendor/kartik-v/yii2-mpdf/assets/kv-mpdf-bootstrap.css',
        'orientation' => Pdf::ORIENT_LANDSCAPE, 
        'destination' => Pdf::DEST_BROWSER,
        'content' => $content,
        'options' => ['title' => 'Портал'],
    ]);

    $fileName = md5(time()) . '.pdf';
    $filePath = Yii::getAlias('@web/upload/documents/rctp/pdf/' . $fileName);

    $attachment =  $pdf->output($content, $filePath, Pdf::DEST_FILE);

    $result =  Yii::$app->mailer->compose()
        ->setFrom('*****@mail.ru')
        ->setTo($model->email)
        ->setHtmlBody($text)
        ->setSubject('Портал')
        ->attach($filePath)
        ->send();

    unlink($filePath);

    return $result;
}

Re: Отправка почты с вложением

Добавлено: 2018.09.20, 12:58
andku83

Код: Выделить всё

    $filePath = Yii::getAlias('@web/upload/documents/rctp/pdf/' . $fileName);
заменить на:

Код: Выделить всё

    $filePath = Yii::getAlias('@app/web/upload/documents/rctp/pdf/' . $fileName);
если не будет работать уточните какое приложение (basic/advanced)

Re: Отправка почты с вложением

Добавлено: 2018.09.20, 13:55
urichalex
Перед тем, как что-то записывать в папку, надо проверить, есть ли эта папка. И, если нет, создать, или выбрать другую

Re: Отправка почты с вложением

Добавлено: 2018.09.20, 14:18
Kven
Спасибо большое, все помогло!
Ошибка была в этом:

Код: Выделить всё

'@web/upload/documents/rctp/pdf/'
Надо было как и написали

Код: Выделить всё

'@app/web/upload/documents/rctp/pdf/'

Re: Отправка почты с вложением

Добавлено: 2018.09.20, 14:39
someweb
А если не в папке web, а в какой нибудь public_html на шаред хостинге?

Код: Выделить всё

'@webroot/upload/documents/rctp/pdf/'

Re: Отправка почты с вложением

Добавлено: 2018.09.20, 16:23
andku83

Код: Выделить всё

'@webroot'
будет правильнее (сразу не вспомнил этого алиаса).
А вот насчет того где на хостинге это лежит - то это не имеет значения: '@webroot' == '@app/web' в 99% случаях.
А если продолжать тему хостингов, то файлы могут лежать и на поддомене, тогда там уже будут свои алиасы.