@@ -83,13 +88,18 @@ export default class MailPage extends Page {
]
})}
- {Object.keys(this.driverFields[this.values.mail_driver()]).length > 0 && FieldSet.component({
+ {Object.keys(fields).length > 0 && FieldSet.component({
label: app.translator.trans(`core.admin.email.${this.values.mail_driver()}_heading`),
className: 'MailPage-MailSettings',
children: [
+ fields.filter(field => this.fieldsRequired.includes(field) && !this.values[field]()).length > 0 && Alert.component({
+ children: app.translator.trans('core.admin.email.incomplete_configuration_text'),
+ dismissible: false,
+ }),
+
- {Object.keys(this.driverFields[this.values.mail_driver()]).map(field => [
- ,
+ {Object.keys(fields).map(field => [
+ ,
this.renderField(field),
])}
@@ -115,7 +125,7 @@ export default class MailPage extends Page {
const prop = this.values[name];
if (typeof field === 'string') {
- return
;
+ return
;
} else {
return
;
}
diff --git a/framework/core/src/Api/Serializer/MailDriverSerializer.php b/framework/core/src/Api/Serializer/MailDriverSerializer.php
index 03a23dcfe..6b0b81824 100644
--- a/framework/core/src/Api/Serializer/MailDriverSerializer.php
+++ b/framework/core/src/Api/Serializer/MailDriverSerializer.php
@@ -47,6 +47,7 @@ class MailDriverSerializer extends AbstractSerializer
return [
'fields' => $settings,
+ 'fieldsRequired' => $driver['driver']->requiredFields(),
];
}
diff --git a/framework/core/src/Mail/DriverInterface.php b/framework/core/src/Mail/DriverInterface.php
index d4c2f18e6..c1802d552 100644
--- a/framework/core/src/Mail/DriverInterface.php
+++ b/framework/core/src/Mail/DriverInterface.php
@@ -31,6 +31,11 @@ interface DriverInterface
*/
public function availableSettings(): array;
+ /**
+ * Provide a list of required settings for this driver.
+ */
+ public function requiredFields(): array;
+
/**
* Build a mail transport based on Flarum's current settings.
*/
diff --git a/framework/core/src/Mail/LogDriver.php b/framework/core/src/Mail/LogDriver.php
index afa2025b2..137b57951 100644
--- a/framework/core/src/Mail/LogDriver.php
+++ b/framework/core/src/Mail/LogDriver.php
@@ -31,6 +31,11 @@ class LogDriver implements DriverInterface
return [];
}
+ public function requiredFields(): array
+ {
+ return [];
+ }
+
public function buildTransport(SettingsRepositoryInterface $settings): Swift_Transport
{
return new LogTransport($this->logger);
diff --git a/framework/core/src/Mail/MailServiceProvider.php b/framework/core/src/Mail/MailServiceProvider.php
index c8ca8f0e0..1e492b49c 100644
--- a/framework/core/src/Mail/MailServiceProvider.php
+++ b/framework/core/src/Mail/MailServiceProvider.php
@@ -33,7 +33,15 @@ class MailServiceProvider extends AbstractServiceProvider
$settings = $this->app->make(SettingsRepositoryInterface::class);
$drivers = $this->app->make('mail.supported_drivers');
- return $this->app->make($drivers[$settings->get('mail_driver')]);
+ $driver = $this->app->make($drivers[$settings->get('mail_driver')]);
+
+ // check that all required fields have been filled
+ $settings = $this->app->make(SettingsRepositoryInterface::class);
+ $valid = $driver && array_reduce($driver->requiredFields(), function ($carry, $field) use ($settings) {
+ return $carry && ! empty($settings->get($field));
+ }, true);
+
+ return $valid ? $driver : $this->app->make(NullDriver::class);
});
$this->app->alias('mail.driver', DriverInterface::class);
diff --git a/framework/core/src/Mail/MailgunDriver.php b/framework/core/src/Mail/MailgunDriver.php
index d600db6b4..2b11efcd9 100644
--- a/framework/core/src/Mail/MailgunDriver.php
+++ b/framework/core/src/Mail/MailgunDriver.php
@@ -28,6 +28,11 @@ class MailgunDriver implements DriverInterface
];
}
+ public function requiredFields(): array
+ {
+ return $this->availableSettings();
+ }
+
public function buildTransport(SettingsRepositoryInterface $settings): Swift_Transport
{
return new MailgunTransport(
diff --git a/framework/core/src/Mail/MandrillDriver.php b/framework/core/src/Mail/MandrillDriver.php
index 45a0c4051..d45236e60 100644
--- a/framework/core/src/Mail/MandrillDriver.php
+++ b/framework/core/src/Mail/MandrillDriver.php
@@ -23,6 +23,11 @@ class MandrillDriver implements DriverInterface
];
}
+ public function requiredFields(): array
+ {
+ return $this->availableSettings();
+ }
+
public function buildTransport(SettingsRepositoryInterface $settings): Swift_Transport
{
return new MandrillTransport(
diff --git a/framework/core/src/Mail/NullDriver.php b/framework/core/src/Mail/NullDriver.php
new file mode 100644
index 000000000..acddd51df
--- /dev/null
+++ b/framework/core/src/Mail/NullDriver.php
@@ -0,0 +1,32 @@
+availableSettings();
+ }
+
public function buildTransport(SettingsRepositoryInterface $settings): Swift_Transport
{
$config = [
diff --git a/framework/core/src/Mail/SmtpDriver.php b/framework/core/src/Mail/SmtpDriver.php
index b6233cfe8..6818a3565 100644
--- a/framework/core/src/Mail/SmtpDriver.php
+++ b/framework/core/src/Mail/SmtpDriver.php
@@ -21,8 +21,17 @@ class SmtpDriver implements DriverInterface
'mail_host' => '', // a hostname, IPv4 address or IPv6 wrapped in []
'mail_port' => '', // a number, defaults to 25
'mail_encryption' => '', // "tls" or "ssl"
- 'mail_username' => '', // required
- 'mail_password' => '', // required
+ 'mail_username' => '',
+ 'mail_password' => '',
+ ];
+ }
+
+ public function requiredFields(): array
+ {
+ return [
+ 'mail_host',
+ 'mail_username',
+ 'mail_password',
];
}