Fix: AWS SES Mailer (#365)

As reported on issue #357, the aws ses configuration was not able to
store because of the missing `ses` service config. Additionally was
added a `AWS Region` field to be used by the `ses`.

closes #357
This commit is contained in:
Fabio Ribeiro
2025-05-02 11:16:31 +02:00
committed by GitHub
parent 14bfaff30b
commit 8a9392e400
11 changed files with 63 additions and 4 deletions

View File

@@ -58,6 +58,7 @@ class MailConfigurationController extends Controller
'mail_mailgun_secret' => config('services.mailgun.secret'), 'mail_mailgun_secret' => config('services.mailgun.secret'),
'mail_ses_key' => config('services.ses.key'), 'mail_ses_key' => config('services.ses.key'),
'mail_ses_secret' => config('services.ses.secret'), 'mail_ses_secret' => config('services.ses.secret'),
'mail_ses_region' => config('services.ses.region'),
]; ];
return response()->json($MailData); return response()->json($MailData);

View File

@@ -296,6 +296,7 @@ class EnvironmentManager
'MAIL_FROM_NAME' => $request->get('from_name'), 'MAIL_FROM_NAME' => $request->get('from_name'),
'SES_KEY' => $request->get('mail_ses_key'), 'SES_KEY' => $request->get('mail_ses_key'),
'SES_SECRET' => $request->get('mail_ses_secret'), 'SES_SECRET' => $request->get('mail_ses_secret'),
'SES_REGION' => $request->get('mail_ses_region'),
]; ];
break; break;

View File

@@ -48,4 +48,10 @@ return [
'auth_token' => env('CRON_JOB_AUTH_TOKEN', 0), 'auth_token' => env('CRON_JOB_AUTH_TOKEN', 0),
], ],
'ses' => [
'key' => env('SES_KEY'),
'secret' => env('SES_SECRET'),
'region' => env('SES_REGION', 'us-east-1'),
],
]; ];

View File

@@ -893,6 +893,7 @@
"mailgun_endpoint": "Mailgun Endpoint", "mailgun_endpoint": "Mailgun Endpoint",
"ses_secret": "SES Secret", "ses_secret": "SES Secret",
"ses_key": "SES Key", "ses_key": "SES Key",
"ses_region": "AWS Region",
"password": "Mail Password", "password": "Mail Password",
"username": "Mail Username", "username": "Mail Username",
"mail_config": "Mail Configuration", "mail_config": "Mail Configuration",
@@ -1281,7 +1282,7 @@
"title": "Update App", "title": "Update App",
"description": "You can easily update InvoiceShelf by checking for a new update by clicking the button below", "description": "You can easily update InvoiceShelf by checking for a new update by clicking the button below",
"check_update": "Check for updates", "check_update": "Check for updates",
"insider_consent" : "Opt-in for Insider releases. Recommended for testing purposes only.", "insider_consent": "Opt-in for Insider releases. Recommended for testing purposes only.",
"avail_update": "New Update available", "avail_update": "New Update available",
"next_version": "Next version", "next_version": "Next version",
"requirements": "Requirements", "requirements": "Requirements",
@@ -1469,9 +1470,9 @@
"failed": "Domain verification failed. Please enter valid domain name.", "failed": "Domain verification failed. Please enter valid domain name.",
"verify_and_continue": "Verify And Continue", "verify_and_continue": "Verify And Continue",
"notes": { "notes": {
"notes" : "Notes:", "notes": "Notes:",
"not_contain" : "App domain should not contain", "not_contain": "App domain should not contain",
"or" : "or", "or": "or",
"in_front": "in front of the domain.", "in_front": "in front of the domain.",
"if_you": "If you're accessing the website on a different port, please mention the port. For example:" "if_you": "If you're accessing the website on a different port, please mention the port. For example:"
} }

View File

@@ -893,6 +893,7 @@
"mailgun_endpoint": "Mailgun endpoint", "mailgun_endpoint": "Mailgun endpoint",
"ses_secret": "Secreto SES", "ses_secret": "Secreto SES",
"ses_key": "Clave SES", "ses_key": "Clave SES",
"ses_region": "Región de AWS",
"password": "Contraseña de correo", "password": "Contraseña de correo",
"username": "Nombre de usuario de correo", "username": "Nombre de usuario de correo",
"mail_config": "Configuración de correo", "mail_config": "Configuración de correo",

View File

@@ -571,6 +571,7 @@
"mailgun_endpoint": "Mailgun Endpoint", "mailgun_endpoint": "Mailgun Endpoint",
"ses_secret": "SES Segredo", "ses_secret": "SES Segredo",
"ses_key": "SES Chave", "ses_key": "SES Chave",
"ses_region": "Região AWS",
"password": "Senha do Email", "password": "Senha do Email",
"username": "Nome de Usuário do Email", "username": "Nome de Usuário do Email",
"mail_config": "Configuração de Email", "mail_config": "Configuração de Email",

View File

@@ -1484,6 +1484,7 @@
"mailgun_endpoint": "Endpoint do Mailgun", "mailgun_endpoint": "Endpoint do Mailgun",
"ses_secret": "Senha do SES", "ses_secret": "Senha do SES",
"ses_key": "Chave SES", "ses_key": "Chave SES",
"ses_region": "Região AWS",
"password": "Senha do email", "password": "Senha do email",
"username": "Nome do Usuário do email", "username": "Nome do Usuário do email",
"mail_config": "Configuração de email", "mail_config": "Configuração de email",

View File

@@ -893,6 +893,7 @@
"mailgun_endpoint": "Mailgun Endpoint", "mailgun_endpoint": "Mailgun Endpoint",
"ses_secret": "SES Secret", "ses_secret": "SES Secret",
"ses_key": "SES Key", "ses_key": "SES Key",
"ses_region": "AWS Region",
"password": "Mail Password", "password": "Mail Password",
"username": "Mail Username", "username": "Mail Username",
"mail_config": "Mail Configuration", "mail_config": "Mail Configuration",

View File

@@ -37,6 +37,7 @@ export const useMailDriverStore = (useWindow = false) => {
mail_port: null, mail_port: null,
mail_ses_key: '', mail_ses_key: '',
mail_ses_secret: '', mail_ses_secret: '',
mail_ses_region: '',
mail_encryption: 'tls', mail_encryption: 'tls',
from_mail: '', from_mail: '',
from_name: '', from_name: '',

View File

@@ -167,6 +167,25 @@
</template> </template>
</BaseInput> </BaseInput>
</BaseInputGroup> </BaseInputGroup>
<BaseInputGroup
:label="$t('settings.mail.ses_region')"
:content-loading="isFetchingInitialData"
:error="
v$.sesConfig.mail_ses_region.$error &&
v$.sesConfig.mail_ses_region.$errors[0].$message
"
required
>
<BaseInput
v-model.trim="mailDriverStore.sesConfig.mail_ses_region"
:content-loading="isFetchingInitialData"
type="text"
name="mail_ses_region"
:invalid="v$.sesConfig.mail_ses_region.$error"
@input="v$.sesConfig.mail_ses_region.$touch()"
/>
</BaseInputGroup>
</div> </div>
<BaseButton <BaseButton
@@ -237,6 +256,9 @@ const rules = computed(() => {
mail_ses_secret: { mail_ses_secret: {
required: helpers.withMessage(t('validation.required'), required), required: helpers.withMessage(t('validation.required'), required),
}, },
mail_ses_region: {
required: helpers.withMessage(t('validation.required'), required),
},
mail_encryption: { mail_encryption: {
required: helpers.withMessage(t('validation.required'), required), required: helpers.withMessage(t('validation.required'), required),
}, },

View File

@@ -161,6 +161,26 @@
</template> </template>
</BaseInput> </BaseInput>
</BaseInputGroup> </BaseInputGroup>
<BaseInputGroup
:label="$t('settings.mail.ses_region')"
:content-loading="isFetchingInitialData"
:error="
v$.sesConfig.mail_ses_region.$error &&
v$.sesConfig.mail_ses_region.$errors[0].$message
"
required
>
<BaseInput
v-model.trim="mailDriverStore.sesConfig.mail_ses_region"
:content-loading="isFetchingInitialData"
type="text"
name="mail_ses_region"
:invalid="v$.sesConfig.mail_ses_region.$error"
@input="v$.sesConfig.mail_ses_region.$touch()"
/>
</BaseInputGroup>
</BaseInputGrid> </BaseInputGrid>
<div class="flex my-10"> <div class="flex my-10">
@@ -238,6 +258,9 @@ const rules = computed(() => {
mail_ses_secret: { mail_ses_secret: {
required: helpers.withMessage(t('validation.required'), required), required: helpers.withMessage(t('validation.required'), required),
}, },
mail_ses_region: {
required: helpers.withMessage(t('validation.required'), required),
},
mail_encryption: { mail_encryption: {
required: helpers.withMessage(t('validation.required'), required), required: helpers.withMessage(t('validation.required'), required),
}, },