+
diff --git a/dashboard/src/constants.js b/dashboard/src/constants.js
index 4675af200..478163e3f 100644
--- a/dashboard/src/constants.js
+++ b/dashboard/src/constants.js
@@ -317,6 +317,23 @@ const BACKUP_FORMATS = [
{ name: 'rsync', value: 'rsync' }
];
+const RELAY_PROVIDERS = [
+ { provider: 'cloudron-smtp', name: 'Built-in SMTP server' },
+ { provider: 'external-smtp', name: 'External SMTP server', host: '', port: 587 },
+ { provider: 'external-smtp-noauth', name: 'External SMTP server (No Authentication)', host: '', port: 587 },
+ { provider: 'ses-smtp', name: 'Amazon SES', host: 'email-smtp.us-east-1.amazonaws.com', port: 587, spfDoc: 'https://docs.aws.amazon.com/ses/latest/DeveloperGuide/spf.html' },
+ { provider: 'brevo-smtp', name: 'Brevo', host: 'smtp-relay.brevo.com', port: 587, spfDoc: 'https://help.brevo.com/hc/en-us/articles/12163873383186-Authenticate-your-domain-with-Brevo-Brevo-code-DKIM-DMARC' },
+ { provider: 'elasticemail-smtp', name: 'Elastic Email', host: 'smtp.elasticemail.com', port: 587, spfDoc: 'https://elasticemail.com/blog/marketing_tips/common-spf-errors' },
+ { provider: 'google-smtp', name: 'Google', host: 'smtp.gmail.com', port: 587, spfDoc: 'https://support.google.com/a/answer/33786?hl=en' },
+ { provider: 'mailgun-smtp', name: 'Mailgun', host: 'smtp.mailgun.org', port: 587, spfDoc: 'https://www.mailgun.com/blog/white-labeling-dns-records-your-customers-tips-tricks' },
+ { provider: 'mailjet-smtp', name: 'Mailjet', host: 'in-v3.mailjet.com', port: 587, spfDoc: 'https://app.mailjet.com/docs/spf-dkim-guide' },
+ { provider: 'office365-legacy-smtp', name: 'Office 365', host: 'smtp-legacy.office365.com', port: 587 }, // uses "login" AUTH instead of "plain"
+ { provider: 'postmark-smtp', name: 'Postmark', host: 'smtp.postmarkapp.com', port: 587, spfDoc: 'https://postmarkapp.com/support/article/1092-how-do-i-set-up-spf-for-postmark' },
+ { provider: 'sendgrid-smtp', name: 'SendGrid', host: 'smtp.sendgrid.net', port: 587, username: 'apikey', spfDoc: 'https://sendgrid.com/docs/ui/account-and-settings/spf-records/' },
+ { provider: 'sparkpost-smtp', name: 'SparkPost', host: 'smtp.sparkpostmail.com', port: 587, username: 'SMTP_Injection', spfDoc: 'https://www.sparkpost.com/resources/email-explained/spf-sender-policy-framework/' },
+ { provider: 'noop', name: 'Disable' },
+];
+
// named exports
export {
API_ORIGIN,
@@ -346,6 +363,7 @@ export {
REGIONS_HETZNER,
REGIONS_WASABI,
REGIONS_S3,
+ RELAY_PROVIDERS,
};
// default export
@@ -377,4 +395,5 @@ export default {
REGIONS_HETZNER,
REGIONS_WASABI,
REGIONS_S3,
+ RELAY_PROVIDERS,
};
diff --git a/dashboard/src/utils.js b/dashboard/src/utils.js
index 5fb3fc201..22114f112 100644
--- a/dashboard/src/utils.js
+++ b/dashboard/src/utils.js
@@ -1,6 +1,11 @@
import { prettyBinarySize } from '@cloudron/pankow/utils';
-import { ISTATES, STORAGE_PROVIDERS } from './constants.js';
+import { RELAY_PROVIDERS, ISTATES, STORAGE_PROVIDERS } from './constants.js';
+
+function prettyRelayProviderName(provider) {
+ const tmp = RELAY_PROVIDERS.find(p => p.provider === provider);
+ return tmp ? tmp.name : provider;
+}
// https://stackoverflow.com/questions/3665115/how-to-create-a-file-in-memory-for-user-to-download-but-not-through-server#18197341
function download(filename, text) {
@@ -635,6 +640,7 @@ const cronHours = Array.from({ length: 24 }).map(function (v, i) { return { id:
// named exports
export {
+ prettyRelayProviderName,
download,
mountlike,
s3like,
@@ -651,6 +657,7 @@ export {
// default export
export default {
+ prettyRelayProviderName,
download,
mountlike,
s3like,