Как установить метаданные и отправить текстовый (.txt) файл в виде вложения без сохранения на сервере в laravel? - PullRequest
0 голосов
/ 17 сентября 2018

Я работаю над модулем для отправки сообщений чатов на электронную почту пользователя (она же стенограмма электронной почты ) с использованием laravel 5.6. Мне нужно сохранить все сообщения чата в текстовый файл и отправить этот файл в виде вложения на адрес электронной почты пользователя.

Я не хочу сохранять файл txt на моем сервере, так как многие люди будут использовать это приложение, и это увеличит использование хранилища на сервере, т. Е. Мне нужно сгенерировать файл txt в памяти.

Я могу заполнять чаты в обычном электронном письме без вложений, но это не решение проблемы, если сообщения чата увеличиваются, электронное письмо будет слишком длинным и кажется мне не профессиональным.

Это я уже пробовал: EmailTranscriptController.php

<?php

namespace App\Http\Controllers\Home;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Trade;
use App\Models\ChatMessage;
use Auth;
use Illuminate\Support\Facades\Mail;
use App\Mail\EmailTradeChatMessages;
use Validator;

class EmailTranscriptController extends Controller
{
    public function emailTradeTranscript($tradeId)
    {
        $userId = Auth::id();
        $userEmail = Auth::user()->email;
        $trade = Trade::findClosedTradeByIdByUserId($tradeId, $userId);
        if (is_null($trade)) {
            return response()->api(false, 'Trade not available', null);
        }

        $tradeStartTime = $trade->created_at;
        $tradeCloseTime = $trade->updated_at;


        $tradeChats = ChatMessage::getAllChatByTradeId($tradeId);



        Mail::to($userEmail)->queue(new EmailTradeChatMessages(
            $tradeChats,
            $tradeStartTime,
            $tradeCloseTime
        ));

        return response()->api(true, 'Email Sent Successfully', null);

    }
}

EmailTradeChatMessages.php

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class EmailTradeChatMessages extends Mailable
{
    use Queueable, SerializesModels;

    protected $chats;
    protected $tradeStartTime;
    protected $tradeCloseTime;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($chats, $tradeStartTime, $tradeCloseTime)
    {
        $this->chats = $chats;
        $this->tradeStartTime = $tradeStartTime;
        $this->tradeCloseTime = $tradeCloseTime;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->markdown('emails.trade_chat_transcript')->with([
            'chats' => $this->chats,
            'tradeStartTime' => $this->tradeStartTime,
            'tradeCloseTime' => $this->tradeCloseTime,
        ]);
    }
}

trade_chat_transcript.blade.php (dummy)

@component('mail::message')
    #Trade Started at: {{$tradeStartTime}}

    @php
        $count=0;
    @endphp
    @foreach($chats as $chat)
        {{++$count}}
    @endforeach

    #Trade Closed at: {{$tradeCloseTime}}
    Thanks,<br>
    {{ config('app.name') }}
@endcomponent

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

Обновление

Я нашел решение не хранить файл на самом сервере и прикрепить его с помощью метода attachData () следующим образом:

public function build()
    {
        $email= $this->markdown('emails.trade_chat_transcript')->with([
            'tradeId' => $this->tradeId,
            'filename' => $this->filename,
            'tradeStartTime' => $this->tradeStartTime,
            'tradeCloseTime' => $this->tradeCloseTime,
        ])
        ->attachData($this->message,$this->filename,[
            'mime'=>'text/plain'
            ]);


        return $email;
    }

Теперь мне нужно установить метаданные файла, который будет прикреплен к электронной почте, например. Автор и т. Д.

1 Ответ

0 голосов
/ 17 сентября 2018

Вам необходимо создать файл на сервере. При этом вы можете удалить его сразу после. Для этого есть метод:

return response()->download($pathToFile)->deleteFileAfterSend(true);
...