diff --git a/app/Http/Requests/MailSenderRequest.php b/app/Http/Requests/MailSenderRequest.php
index 44e64a2f..2b2936ba 100644
--- a/app/Http/Requests/MailSenderRequest.php
+++ b/app/Http/Requests/MailSenderRequest.php
@@ -70,7 +70,13 @@ class MailSenderRequest extends FormRequest
public function getMailSenderPayload()
{
- return collect($this->validated())
+ $data = $this->validated();
+
+ if ($data['settings']['encryption'] == 'none') {
+ $data['settings']['encryption'] = '';
+ }
+
+ return collect($data)
->merge([
'company_id' => $this->header('company'),
])
diff --git a/app/Http/Requests/SendEstimatesRequest.php b/app/Http/Requests/SendEstimatesRequest.php
index d7826486..6ece4a5f 100644
--- a/app/Http/Requests/SendEstimatesRequest.php
+++ b/app/Http/Requests/SendEstimatesRequest.php
@@ -30,7 +30,7 @@ class SendEstimatesRequest extends FormRequest
'body' => [
'required',
],
- 'from' => [
+ 'mail_sender_id' => [
'required',
],
'to' => [
diff --git a/app/Http/Requests/SendInvoiceRequest.php b/app/Http/Requests/SendInvoiceRequest.php
index 077e8047..c1dc5dc0 100644
--- a/app/Http/Requests/SendInvoiceRequest.php
+++ b/app/Http/Requests/SendInvoiceRequest.php
@@ -30,7 +30,7 @@ class SendInvoiceRequest extends FormRequest
'subject' => [
'required',
],
- 'from' => [
+ 'mail_sender_id' => [
'required',
],
'to' => [
diff --git a/app/Http/Requests/SendPaymentRequest.php b/app/Http/Requests/SendPaymentRequest.php
index 87745b94..70fd4600 100644
--- a/app/Http/Requests/SendPaymentRequest.php
+++ b/app/Http/Requests/SendPaymentRequest.php
@@ -30,7 +30,7 @@ class SendPaymentRequest extends FormRequest
'body' => [
'required',
],
- 'from' => [
+ 'mail_sender_id' => [
'required',
],
'to' => [
diff --git a/app/Mail/SendEstimateMail.php b/app/Mail/SendEstimateMail.php
index 70121e00..664f09bd 100644
--- a/app/Mail/SendEstimateMail.php
+++ b/app/Mail/SendEstimateMail.php
@@ -34,7 +34,7 @@ class SendEstimateMail extends Mailable
public function build()
{
$log = EmailLog::create([
- 'from' => $this->data['from'],
+ 'from' => $this->data['from_address'],
'to' => $this->data['to'],
'subject' => $this->data['subject'],
'body' => $this->data['body'],
@@ -47,9 +47,10 @@ class SendEstimateMail extends Mailable
$this->data['url'] = route('estimate', ['email_log' => $log->token]);
- $mailContent = $this->from($this->data['from'], config('mail.from.name'))
- ->subject($this->data['subject'])
- ->markdown('emails.send.estimate', ['data', $this->data]);
+ $mailContent = $this->from($this->data['from_address'], $this->data['from_name'])
+ ->subject($this->data['subject'])
+ ->markdown("emails.send.estimate", ['data', $this->data]);
+
if ($this->data['attach']['data']) {
$mailContent->attachData(
diff --git a/app/Mail/SendInvoiceMail.php b/app/Mail/SendInvoiceMail.php
index 81d76fa7..b48c3508 100644
--- a/app/Mail/SendInvoiceMail.php
+++ b/app/Mail/SendInvoiceMail.php
@@ -34,7 +34,7 @@ class SendInvoiceMail extends Mailable
public function build()
{
$log = EmailLog::create([
- 'from' => $this->data['from'],
+ 'from' => $this->data['from_address'],
'to' => $this->data['to'],
'subject' => $this->data['subject'],
'body' => $this->data['body'],
@@ -47,9 +47,9 @@ class SendInvoiceMail extends Mailable
$this->data['url'] = route('invoice', ['email_log' => $log->token]);
- $mailContent = $this->from($this->data['from'], config('mail.from.name'))
+ $mailContent = $this->from($this->data['from_address'], $this->data['from_name'])
->subject($this->data['subject'])
- ->markdown('emails.send.invoice', ['data', $this->data]);
+ ->markdown("emails.send.invoice", ['data', $this->data]);
if ($this->data['attach']['data']) {
$mailContent->attachData(
diff --git a/app/Mail/SendPaymentMail.php b/app/Mail/SendPaymentMail.php
index 4d52547f..81b50413 100644
--- a/app/Mail/SendPaymentMail.php
+++ b/app/Mail/SendPaymentMail.php
@@ -34,7 +34,7 @@ class SendPaymentMail extends Mailable
public function build()
{
$log = EmailLog::create([
- 'from' => $this->data['from'],
+ 'from' => $this->data['from_address'],
'to' => $this->data['to'],
'subject' => $this->data['subject'],
'body' => $this->data['body'],
@@ -47,9 +47,9 @@ class SendPaymentMail extends Mailable
$this->data['url'] = route('payment', ['email_log' => $log->token]);
- $mailContent = $this->from($this->data['from'], config('mail.from.name'))
- ->subject($this->data['subject'])
- ->markdown('emails.send.payment', ['data', $this->data]);
+ $mailContent = $this->from($this->data['from_address'], $this->data['from_name'])
+ ->subject($this->data['subject'])
+ ->markdown("emails.send.payment", ['data', $this->data]);
if ($this->data['attach']['data']) {
$mailContent->attachData(
diff --git a/app/Models/Estimate.php b/app/Models/Estimate.php
index 5b7c3b8f..2e0356b4 100644
--- a/app/Models/Estimate.php
+++ b/app/Models/Estimate.php
@@ -5,10 +5,10 @@ namespace Crater\Models;
use App;
use Barryvdh\DomPDF\Facade as PDF;
use Carbon\Carbon;
-use Crater\Mail\SendEstimateMail;
use Crater\Services\SerialNumberFormatter;
use Crater\Traits\GeneratesPdfTrait;
use Crater\Traits\HasCustomFieldsTrait;
+use Crater\Traits\MailTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
@@ -20,6 +20,7 @@ use Vinkla\Hashids\Facades\Hashids;
class Estimate extends Model implements HasMedia
{
use HasFactory;
+ use MailTrait;
use InteractsWithMedia;
use GeneratesPdfTrait;
use HasCustomFieldsTrait;
@@ -363,7 +364,7 @@ class Estimate extends Model implements HasMedia
$this->save();
}
- \Mail::to($data['to'])->send(new SendEstimateMail($data));
+ $this->setMail('estimate', $data);
return [
'success' => true,
diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php
index 39cd3165..4618bc4b 100644
--- a/app/Models/Invoice.php
+++ b/app/Models/Invoice.php
@@ -9,6 +9,7 @@ use Crater\Mail\SendInvoiceMail;
use Crater\Services\SerialNumberFormatter;
use Crater\Traits\GeneratesPdfTrait;
use Crater\Traits\HasCustomFieldsTrait;
+use Crater\Traits\MailTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
@@ -21,6 +22,7 @@ use Vinkla\Hashids\Facades\Hashids;
class Invoice extends Model implements HasMedia
{
use HasFactory;
+ use MailTrait;
use InteractsWithMedia;
use GeneratesPdfTrait;
use HasCustomFieldsTrait;
@@ -464,7 +466,7 @@ class Invoice extends Model implements HasMedia
{
$data = $this->sendInvoiceData($data);
- \Mail::to($data['to'])->send(new SendInvoiceMail($data));
+ $this->setMail('invoice', $data);
if ($this->status == Invoice::STATUS_DRAFT) {
$this->status = Invoice::STATUS_SENT;
diff --git a/app/Models/Payment.php b/app/Models/Payment.php
index 83a17441..84b60c36 100644
--- a/app/Models/Payment.php
+++ b/app/Models/Payment.php
@@ -5,10 +5,10 @@ namespace Crater\Models;
use Barryvdh\DomPDF\Facade as PDF;
use Carbon\Carbon;
use Crater\Jobs\GeneratePaymentPdfJob;
-use Crater\Mail\SendPaymentMail;
use Crater\Services\SerialNumberFormatter;
use Crater\Traits\GeneratesPdfTrait;
use Crater\Traits\HasCustomFieldsTrait;
+use Crater\Traits\MailTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Spatie\MediaLibrary\HasMedia;
@@ -18,6 +18,7 @@ use Vinkla\Hashids\Facades\Hashids;
class Payment extends Model implements HasMedia
{
use HasFactory;
+ use MailTrait;
use InteractsWithMedia;
use GeneratesPdfTrait;
use HasCustomFieldsTrait;
@@ -135,7 +136,7 @@ class Payment extends Model implements HasMedia
{
$data = $this->sendPaymentData($data);
- \Mail::to($data['to'])->send(new SendPaymentMail($data));
+ $this->setMail('payment', $data);
return [
'success' => true,
diff --git a/app/Space/EnvironmentManager.php b/app/Space/EnvironmentManager.php
index 7ba57dcb..a1600fec 100755
--- a/app/Space/EnvironmentManager.php
+++ b/app/Space/EnvironmentManager.php
@@ -223,204 +223,6 @@ class EnvironmentManager
return false;
}
- /**
- * Save the mail content to the .env file.
- *
- * @param Request $request
- * @return array
- */
- public function saveMailVariables(MailEnvironmentRequest $request)
- {
- $mailData = $this->getMailData($request);
-
- try {
- file_put_contents($this->envPath, str_replace(
- $mailData['old_mail_data'],
- $mailData['new_mail_data'],
- file_get_contents($this->envPath)
- ));
-
- if ($mailData['extra_old_mail_data']) {
- file_put_contents($this->envPath, str_replace(
- $mailData['extra_old_mail_data'],
- $mailData['extra_mail_data'],
- file_get_contents($this->envPath)
- ));
- } else {
- file_put_contents(
- $this->envPath,
- "\n".$mailData['extra_mail_data'],
- FILE_APPEND
- );
- }
- } catch (Exception $e) {
- return [
- 'error' => 'mail_variables_save_error',
- ];
- }
-
- return [
- 'success' => 'mail_variables_save_successfully',
- ];
- }
-
- private function getMailData($request)
- {
- $mailFromCredential = "";
- $extraMailData = "";
- $extraOldMailData = "";
- $oldMailData = "";
- $newMailData = "";
-
- if (env('MAIL_FROM_ADDRESS') !== null && env('MAIL_FROM_NAME') !== null) {
- $mailFromCredential =
- 'MAIL_FROM_ADDRESS='.config('mail.from.address')."\n".
- 'MAIL_FROM_NAME="'.config('mail.from.name')."\"\n\n";
- }
-
- switch ($request->mail_driver) {
- case 'smtp':
-
- $oldMailData =
- 'MAIL_DRIVER='.config('mail.driver')."\n".
- 'MAIL_HOST='.config('mail.host')."\n".
- 'MAIL_PORT='.config('mail.port')."\n".
- 'MAIL_USERNAME='.config('mail.username')."\n".
- 'MAIL_PASSWORD='.config('mail.password')."\n".
- 'MAIL_ENCRYPTION='.config('mail.encryption')."\n\n".
- $mailFromCredential;
-
- $newMailData =
- 'MAIL_DRIVER='.$request->mail_driver."\n".
- 'MAIL_HOST='.$request->mail_host."\n".
- 'MAIL_PORT='.$request->mail_port."\n".
- 'MAIL_USERNAME='.$request->mail_username."\n".
- 'MAIL_PASSWORD='.$request->mail_password."\n".
- 'MAIL_ENCRYPTION='.$request->mail_encryption."\n\n".
- 'MAIL_FROM_ADDRESS='.$request->from_mail."\n".
- 'MAIL_FROM_NAME="'.$request->from_name."\"\n\n";
-
- break;
-
- case 'mailgun':
- $oldMailData =
- 'MAIL_DRIVER='.config('mail.driver')."\n".
- 'MAIL_HOST='.config('mail.host')."\n".
- 'MAIL_PORT='.config('mail.port')."\n".
- 'MAIL_USERNAME='.config('mail.username')."\n".
- 'MAIL_PASSWORD='.config('mail.password')."\n".
- 'MAIL_ENCRYPTION='.config('mail.encryption')."\n\n".
- $mailFromCredential;
-
- $newMailData =
- 'MAIL_DRIVER='.$request->mail_driver."\n".
- 'MAIL_HOST='.$request->mail_host."\n".
- 'MAIL_PORT='.$request->mail_port."\n".
- 'MAIL_USERNAME='.config('mail.username')."\n".
- 'MAIL_PASSWORD='.config('mail.password')."\n".
- 'MAIL_ENCRYPTION='.$request->mail_encryption."\n\n".
- 'MAIL_FROM_ADDRESS='.$request->from_mail."\n".
- 'MAIL_FROM_NAME="'.$request->from_name."\"\n\n";
-
- $extraMailData =
- 'MAILGUN_DOMAIN='.$request->mail_mailgun_domain."\n".
- 'MAILGUN_SECRET='.$request->mail_mailgun_secret."\n".
- 'MAILGUN_ENDPOINT='.$request->mail_mailgun_endpoint."\n";
-
- if (env('MAILGUN_DOMAIN') !== null && env('MAILGUN_SECRET') !== null && env('MAILGUN_ENDPOINT') !== null) {
- $extraOldMailData =
- 'MAILGUN_DOMAIN='.config('services.mailgun.domain')."\n".
- 'MAILGUN_SECRET='.config('services.mailgun.secret')."\n".
- 'MAILGUN_ENDPOINT='.config('services.mailgun.endpoint')."\n";
- }
-
- break;
-
- case 'ses':
- $oldMailData =
- 'MAIL_DRIVER='.config('mail.driver')."\n".
- 'MAIL_HOST='.config('mail.host')."\n".
- 'MAIL_PORT='.config('mail.port')."\n".
- 'MAIL_USERNAME='.config('mail.username')."\n".
- 'MAIL_PASSWORD='.config('mail.password')."\n".
- 'MAIL_ENCRYPTION='.config('mail.encryption')."\n\n".
- $mailFromCredential;
-
- $newMailData =
- 'MAIL_DRIVER='.$request->mail_driver."\n".
- 'MAIL_HOST='.$request->mail_host."\n".
- 'MAIL_PORT='.$request->mail_port."\n".
- 'MAIL_USERNAME='.config('mail.username')."\n".
- 'MAIL_PASSWORD='.config('mail.password')."\n".
- 'MAIL_ENCRYPTION='.$request->mail_encryption."\n\n".
- 'MAIL_FROM_ADDRESS='.$request->from_mail."\n".
- 'MAIL_FROM_NAME="'.$request->from_name."\"\n\n";
-
- $extraMailData =
- 'SES_KEY='.$request->mail_ses_key."\n".
- 'SES_SECRET='.$request->mail_ses_secret."\n";
-
- if (env('SES_KEY') !== null && env('SES_SECRET') !== null) {
- $extraOldMailData =
- 'SES_KEY='.config('services.ses.key')."\n".
- 'SES_SECRET='.config('services.ses.secret')."\n";
- }
-
- break;
-
- case 'mail':
- $oldMailData =
- 'MAIL_DRIVER='.config('mail.driver')."\n".
- 'MAIL_HOST='.config('mail.host')."\n".
- 'MAIL_PORT='.config('mail.port')."\n".
- 'MAIL_USERNAME='.config('mail.username')."\n".
- 'MAIL_PASSWORD='.config('mail.password')."\n".
- 'MAIL_ENCRYPTION='.config('mail.encryption')."\n\n".
- $mailFromCredential;
-
- $newMailData =
- 'MAIL_DRIVER='.$request->mail_driver."\n".
- 'MAIL_HOST='.config('mail.host')."\n".
- 'MAIL_PORT='.config('mail.port')."\n".
- 'MAIL_USERNAME='.config('mail.username')."\n".
- 'MAIL_PASSWORD='.config('mail.password')."\n".
- 'MAIL_ENCRYPTION='.config('mail.encryption')."\n\n".
- 'MAIL_FROM_ADDRESS='.$request->from_mail."\n".
- 'MAIL_FROM_NAME="'.$request->from_name."\"\n\n";
-
- break;
-
- case 'sendmail':
- $oldMailData =
- 'MAIL_DRIVER='.config('mail.driver')."\n".
- 'MAIL_HOST='.config('mail.host')."\n".
- 'MAIL_PORT='.config('mail.port')."\n".
- 'MAIL_USERNAME='.config('mail.username')."\n".
- 'MAIL_PASSWORD='.config('mail.password')."\n".
- 'MAIL_ENCRYPTION='.config('mail.encryption')."\n\n".
- $mailFromCredential;
-
- $newMailData =
- 'MAIL_DRIVER='.$request->mail_driver."\n".
- 'MAIL_HOST='.config('mail.host')."\n".
- 'MAIL_PORT='.config('mail.port')."\n".
- 'MAIL_USERNAME='.config('mail.username')."\n".
- 'MAIL_PASSWORD='.config('mail.password')."\n".
- 'MAIL_ENCRYPTION='.config('mail.encryption')."\n\n".
- 'MAIL_FROM_ADDRESS='.$request->from_mail."\n".
- 'MAIL_FROM_NAME="'.$request->from_name."\"\n\n";
-
- break;
- }
-
- return [
- 'old_mail_data' => $oldMailData,
- 'new_mail_data' => $newMailData,
- 'extra_mail_data' => $extraMailData,
- 'extra_old_mail_data' => $extraOldMailData,
- ];
- }
-
/**
* Save the disk content to the .env file.
*
diff --git a/app/Traits/MailTrait.php b/app/Traits/MailTrait.php
new file mode 100644
index 00000000..54ca6062
--- /dev/null
+++ b/app/Traits/MailTrait.php
@@ -0,0 +1,62 @@
+from_address;
+ $data['from_name'] = $mailSender->from_name;
+
+ switch ($model) {
+ case 'invoice':
+ $mail = new SendInvoiceMail($data);
+
+ break;
+
+ case 'estimate':
+ $mail = new SendEstimateMail($data);
+
+ break;
+
+ case 'payment':
+ $mail = new SendPaymentMail($data);
+
+ break;
+ }
+
+ if ($mailSender->bcc && $mailSender->cc) {
+ \Mail::to($data['to'])
+ ->bcc(explode(',', $mailSender->bcc))
+ ->cc(explode(',', $mailSender->cc))
+ ->send($mail);
+ }
+
+ if ($mailSender->bcc && $mailSender->cc == null) {
+ \Mail::to($data['to'])
+ ->bcc(explode(',', $mailSender->bcc))
+ ->send($mail);
+ }
+
+ if ($mailSender->bcc == null && $mailSender->cc) {
+ \Mail::to($data['to'])
+ ->cc(explode(',', $mailSender->cc))
+ ->send($mail);
+ }
+
+ if ($mailSender->bcc == null && $mailSender->cc == null) {
+ \Mail::to($data['to'])
+ ->send($mail);
+ }
+
+ return true;
+ }
+}
diff --git a/resources/scripts/admin/components/FeedbackAlert.vue b/resources/scripts/admin/components/FeedbackAlert.vue
new file mode 100644
index 00000000..2c1b14cf
--- /dev/null
+++ b/resources/scripts/admin/components/FeedbackAlert.vue
@@ -0,0 +1,123 @@
+
+
+ {{ description }}
+ {{ title }}
+
+