Я работаю над модулем для отправки сообщений чатов на электронную почту пользователя (она же стенограмма электронной почты ) с использованием 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;
}
Теперь мне нужно установить метаданные файла, который будет прикреплен к электронной почте, например. Автор и т. Д.