mirror of
https://github.com/plankanban/planka.git
synced 2025-12-20 01:14:12 +03:00
feat: Add ability to configure and test SMTP via UI
This commit is contained in:
117
server/api/controllers/config/test-smtp.js
Normal file
117
server/api/controllers/config/test-smtp.js
Normal file
@@ -0,0 +1,117 @@
|
||||
/*!
|
||||
* Copyright (c) 2024 PLANKA Software GmbH
|
||||
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||
*/
|
||||
|
||||
/**
|
||||
* @swagger
|
||||
* /config/test-smtp:
|
||||
* post:
|
||||
* summary: Test SMTP configuration
|
||||
* description: Sends a test email to verify the SMTP is configured correctly. Only available when SMTP is configured via the UI.
|
||||
* tags:
|
||||
* - Config
|
||||
* operationId: testSmtpConfig
|
||||
* responses:
|
||||
* 200:
|
||||
* description: Test email sent successfully
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* type: object
|
||||
* required:
|
||||
* - item
|
||||
* properties:
|
||||
* item:
|
||||
* $ref: '#/components/schemas/Config'
|
||||
* 401:
|
||||
* $ref: '#/components/responses/Unauthorized'
|
||||
* 403:
|
||||
* $ref: '#/components/responses/Forbidden'
|
||||
*/
|
||||
|
||||
const Errors = {
|
||||
NOT_AVAILABLE: {
|
||||
notAvailable: 'Not available',
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
exits: {
|
||||
notAvailable: {
|
||||
responseType: 'forbidden',
|
||||
},
|
||||
},
|
||||
|
||||
async fn() {
|
||||
const { currentUser } = this.req;
|
||||
|
||||
if (sails.config.custom.smtpHost) {
|
||||
return Errors.NOT_AVAILABLE;
|
||||
}
|
||||
|
||||
const { transporter, config } = await sails.helpers.utils.makeSmtpTransporter({
|
||||
connectionTimeout: 5000,
|
||||
greetingTimeout: 5000,
|
||||
socketTimeout: 10000,
|
||||
dnsTimeout: 3000,
|
||||
});
|
||||
|
||||
if (!transporter) {
|
||||
return Errors.NOT_AVAILABLE;
|
||||
}
|
||||
|
||||
const logs = [];
|
||||
try {
|
||||
logs.push('📧 Sending test email...');
|
||||
/* eslint-disable no-underscore-dangle */
|
||||
const info = await transporter.sendMail({
|
||||
to: currentUser.email,
|
||||
subject: this.req.i18n.__('Test Title'),
|
||||
text: this.req.i18n.__('This is a test text message!'),
|
||||
html: this.req.i18n.__('This is a <i>test</i> <b>html</b> <code>message</code>!'),
|
||||
});
|
||||
/* eslint-enable no-underscore-dangle */
|
||||
logs.push('✅ Email sent successfully!', '');
|
||||
|
||||
logs.push(`📬 Message ID: ${info.messageId}`);
|
||||
if (info.response) {
|
||||
logs.push(`📤 Server response: ${info.response.trim()}`);
|
||||
}
|
||||
|
||||
logs.push('', '🎉 Your configuration is working correctly!');
|
||||
} catch (error) {
|
||||
logs.push('❌ Failed to send email!', '');
|
||||
|
||||
if (error.code) {
|
||||
logs.push(`⚠️ Error code: ${error.code}`);
|
||||
}
|
||||
logs.push(`💬 Reason: ${error.message.trim()}`);
|
||||
|
||||
if (error.code === 'EDNS') {
|
||||
logs.push('', '💡 Hint: Check your host setting.');
|
||||
} else if (error.code === 'ETIMEDOUT') {
|
||||
logs.push('', '💡 Hint: Check your host and port settings.');
|
||||
} else if (error.code === 'EAUTH') {
|
||||
logs.push('', '💡 Hint: Check your username and password.');
|
||||
} else if (error.code === 'ESOCKET') {
|
||||
if (error.message.includes('ECONNREFUSED') || error.message.includes('ETIMEDOUT')) {
|
||||
logs.push('', '💡 Hint: Check your host and port settings.');
|
||||
} else if (error.message.includes('wrong version number')) {
|
||||
logs.push('', '💡 Hint: Try toggling "Use secure connection".');
|
||||
} else if (error.message.includes('certificate')) {
|
||||
logs.push('', '💡 Hint: Try toggling "Reject unauthorized TLS certificates".');
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
transporter.close();
|
||||
}
|
||||
|
||||
return {
|
||||
item: sails.helpers.config.presentOne(config),
|
||||
included: {
|
||||
logs,
|
||||
},
|
||||
};
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user