Просмотр исходного кода

Added MAIL_SERVICE settings for Well Known Email Services https://github.com/wekan/wekan/wiki/Troubleshooting-Mail . Please test.

Thanks to xet7 !

Fixes #3702
Lauri Ojansivu 3 лет назад
Родитель
Сommit
ab8e56e16a

+ 5 - 0
Dockerfile

@@ -21,6 +21,11 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
     ARCHITECTURE=linux-x64 \
     SRC_PATH=./ \
     WITH_API=true \
+    MAIL_URL="" \
+    MAIL_FROM="" \
+    MAIL_SERVICE="" \
+    MAIL_SERVICE_USER="" \
+    MAIL_SERVICE_PASSWORD="" \
     RESULTS_PER_PAGE="" \
     ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE=3 \
     ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD=60 \

+ 3 - 0
docker-compose.yml

@@ -166,6 +166,9 @@ services:
       #- MAIL_URL=smtp://user:pass@mailserver.example.com:25/
       - MAIL_URL=smtp://<mail_url>:25/?ignoreTLS=true&tls={rejectUnauthorized:false}
       - MAIL_FROM=Wekan Notifications <noreply.wekan@mydomain.com>
+      #- MAIL_SERVICE=Outlook365
+      #- MAIL_SERVICE_USER=firstname.lastname@hotmail.com
+      #- MAIL_SERVICE_PASSWORD=SecretPassword
       #---------------------------------------------------------------
       # ==== OPTIONAL: MONGO OPLOG SETTINGS =====
       # https://github.com/wekan/wekan-mongodb/issues/2#issuecomment-378343587

+ 47 - 12
models/settings.js

@@ -1,3 +1,5 @@
+var nodemailer = require('nodemailer');
+
 // Sandstorm context is detected using the METEOR_SETTINGS environment variable
 // in the package definition.
 const isSandstorm =
@@ -220,12 +222,29 @@ if (Meteor.isServer) {
       };
       const lang = author.getLanguage();
 
-      Email.send({
-        to: icode.email,
-        from: Accounts.emailTemplates.from,
-        subject: TAPi18n.__('email-invite-register-subject', params, lang),
-        text: TAPi18n.__('email-invite-register-text', params, lang),
-      });
+
+      if (process.env.MAIL_SERVICE !== '') {
+        let transporter = nodemailer.createTransport({
+          service: process.env.MAIL_SERVICE,
+          auth: {
+            user: process.env.MAIL_SERVICE_USER,
+            pass: process.env.MAIL_SERVICE_PASSWORD
+          },
+        })
+        let info = transporter.sendMail({
+          to: icode.email,
+          from: Accounts.emailTemplates.from,
+          subject: TAPi18n.__('email-invite-register-subject', params, lang),
+          text: TAPi18n.__('email-invite-register-text', params, lang),
+        })
+      } else {
+        Email.send({
+          to: icode.email,
+          from: Accounts.emailTemplates.from,
+          subject: TAPi18n.__('email-invite-register-subject', params, lang),
+          text: TAPi18n.__('email-invite-register-text', params, lang),
+        });
+      }
     } catch (e) {
       InvitationCodes.remove(_id);
       throw new Meteor.Error('email-fail', e.message);
@@ -318,12 +337,28 @@ if (Meteor.isServer) {
       this.unblock();
       const lang = user.getLanguage();
       try {
-        Email.send({
-          to: user.emails[0].address,
-          from: Accounts.emailTemplates.from,
-          subject: TAPi18n.__('email-smtp-test-subject', { lng: lang }),
-          text: TAPi18n.__('email-smtp-test-text', { lng: lang }),
-        });
+        if (process.env.MAIL_SERVICE !== '') {
+          let transporter = nodemailer.createTransport({
+            service: process.env.MAIL_SERVICE,
+            auth: {
+              user: process.env.MAIL_SERVICE_USER,
+              pass: process.env.MAIL_SERVICE_PASSWORD
+            },
+          })
+          let info = transporter.sendMail({
+            to: user.emails[0].address,
+            from: Accounts.emailTemplates.from,
+            subject: TAPi18n.__('email-smtp-test-subject', { lng: lang }),
+            text: TAPi18n.__('email-smtp-test-text', { lng: lang }),
+          })
+        } else {
+          Email.send({
+            to: user.emails[0].address,
+            from: Accounts.emailTemplates.from,
+            subject: TAPi18n.__('email-smtp-test-subject', { lng: lang }),
+            text: TAPi18n.__('email-smtp-test-text', { lng: lang }),
+          });
+        }
       } catch ({ message }) {
         throw new Meteor.Error(
           'email-fail',

+ 24 - 6
models/users.js

@@ -1,3 +1,4 @@
+var nodemailer = require('nodemailer');
 import { SyncedCron } from 'meteor/percolate:synced-cron';
 import ImpersonatedUsers from './impersonatedUsers';
 
@@ -1218,12 +1219,29 @@ if (Meteor.isServer) {
           url: board.absoluteUrl(),
         };
         const lang = user.getLanguage();
-        Email.send({
-          to: user.emails[0].address.toLowerCase(),
-          from: Accounts.emailTemplates.from,
-          subject: TAPi18n.__('email-invite-subject', params, lang),
-          text: TAPi18n.__('email-invite-text', params, lang),
-        });
+
+        if (process.env.MAIL_SERVICE !== '') {
+          let transporter = nodemailer.createTransport({
+            service: process.env.MAIL_SERVICE,
+            auth: {
+              user: process.env.MAIL_SERVICE_USER,
+              pass: process.env.MAIL_SERVICE_PASSWORD
+            },
+          })
+          let info = transporter.sendMail({
+            to: user.emails[0].address.toLowerCase(),
+            from: Accounts.emailTemplates.from,
+            subject: TAPi18n.__('email-invite-subject', params, lang),
+            text: TAPi18n.__('email-invite-text', params, lang),
+          })
+        } else {
+          Email.send({
+            to: user.emails[0].address.toLowerCase(),
+            from: Accounts.emailTemplates.from,
+            subject: TAPi18n.__('email-invite-subject', params, lang),
+            text: TAPi18n.__('email-invite-text', params, lang),
+          });
+        }
       } catch (e) {
         throw new Meteor.Error('email-fail', e.message);
       }

+ 5 - 0
package-lock.json

@@ -2691,6 +2691,11 @@
       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.74.tgz",
       "integrity": "sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw=="
     },
+    "nodemailer": {
+      "version": "6.6.3",
+      "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.3.tgz",
+      "integrity": "sha512-faZFufgTMrphYoDjvyVpbpJcYzwyFnbAMmQtj1lVBYAUSm3SOy2fIdd9+Mr4UxPosBa0JRw9bJoIwQn+nswiew=="
+    },
     "normalize-path": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",

+ 1 - 0
package.json

@@ -40,6 +40,7 @@
     "markdown-it-emoji": "^2.0.0",
     "meteor-node-stubs": "^1.1.0",
     "mongodb": "^3.6.11",
+    "nodemailer": "^6.6.3",
     "os": "^0.1.2",
     "page": "^1.11.5",
     "papaparse": "^5.3.1",

+ 4 - 0
releases/virtualbox/start-wekan.sh

@@ -16,6 +16,10 @@
       # https://github.com/wekan/wekan/wiki/Troubleshooting-Mail
       # https://github.com/wekan/wekan-mongodb/blob/master/docker-compose.yml
       export MAIL_URL='smtp://user:pass@mailserver.example.com:25/'
+      export MAIL_FROM='Wekan Boards <info@example.com>'
+      #export MAIL_SERVICE=Outlook365
+      #export MAIL_SERVICE_USER=firstname.lastname@hotmail.com
+      #export MAIL_SERVICE_PASSWORD=SecretPassword
       #---------------------------------------------
       #export KADIRA_OPTIONS_ENDPOINT=http://127.0.0.1:11011
       #---------------------------------------------

+ 24 - 6
server/notifications/email.js

@@ -1,3 +1,5 @@
+var nodemailer = require('nodemailer');
+
 // buffer each user's email text in a queue, then flush them in single email
 Meteor.startup(() => {
   Notifications.subscribe('email', (user, title, description, params) => {
@@ -38,12 +40,28 @@ Meteor.startup(() => {
       const html = texts.join('<br/>\n\n');
       user.clearEmailBuffer();
       try {
-        Email.send({
-          to: user.emails[0].address.toLowerCase(),
-          from: Accounts.emailTemplates.from,
-          subject,
-          html,
-        });
+        if (process.env.MAIL_SERVICE !== '') {
+          let transporter = nodemailer.createTransport({
+            service: process.env.MAIL_SERVICE,
+            auth: {
+              user: process.env.MAIL_SERVICE_USER,
+              pass: process.env.MAIL_SERVICE_PASSWORD
+            },
+          })
+          let info = transporter.sendMail({
+            to: user.emails[0].address.toLowerCase(),
+            from: Accounts.emailTemplates.from,
+            subject,
+            html,
+          })
+        } else {
+          Email.send({
+            to: user.emails[0].address.toLowerCase(),
+            from: Accounts.emailTemplates.from,
+            subject,
+            html,
+          });
+        }
       } catch (e) {
         return;
       }

+ 24 - 6
server/rulesHelper.js

@@ -1,3 +1,5 @@
+var nodemailer = require('nodemailer');
+
 RulesHelper = {
   executeRules(activity) {
     const matchingRules = this.findMatchingRules(activity);
@@ -119,12 +121,28 @@ RulesHelper = {
       const text = action.emailMsg || '';
       const subject = action.emailSubject || '';
       try {
-        Email.send({
-          to,
-          from: Accounts.emailTemplates.from,
-          subject,
-          text,
-        });
+        if (process.env.MAIL_SERVICE !== '') {
+          let transporter = nodemailer.createTransport({
+            service: process.env.MAIL_SERVICE,
+            auth: {
+              user: process.env.MAIL_SERVICE_USER,
+              pass: process.env.MAIL_SERVICE_PASSWORD
+            },
+          })
+          let info = transporter.sendMail({
+            to,
+            from: Accounts.emailTemplates.from,
+            subject,
+            text,
+          })
+        } else {
+          Email.send({
+            to,
+            from: Accounts.emailTemplates.from,
+            subject,
+            text,
+          });
+        }
       } catch (e) {
         // eslint-disable-next-line no-console
         console.error(e);

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
snap-src/bin/config


+ 12 - 0
snap-src/bin/wekan-help

@@ -49,6 +49,18 @@ echo -e "\t$ snap set $SNAP_NAME with-api='true'"
 echo -e "\t-Disable the API:"
 echo -e "\t$ snap unset $SNAP_NAME with-api"
 echo -e "\n"
+echo -e "Email: https://github.com/wekan/wekan/wiki/Troubleshooting-Mail"
+echo -e "mail-url:"
+echo -e "\t$ snap set $SNAP_NAME mail-url='smtp://username:password@email-smtp.eu-west-1.amazonaws.com:587?tls={ciphers:\"SSLv3\"}&secureConnection=false'"
+echo -e "mail-from:"
+echo -e "\t$ snap set $SNAP_NAME mail-from='Boards Support <support@example.com>'"
+echo -e "mail-service:"
+echo -e "\t$ snap set $SNAP_NAME mail-service='Outlook365'"
+echo -e "mail-service-user:"
+echo -e "\t$ snap set $SNAP_NAME mail-service-user='firstname.lastname@hotmail.com'"
+echo -e "mail-service-password:"
+echo -e "\t$ snap set $SNAP_NAME mail-service-password='SecretPassword'"
+echo -e "\n"
 echo -e "Number of search results to show per page by default:"
 echo -e "\t$ snap set $SNAP_NAME results-per-page='20'"
 echo -e "\t-Restore default:"

+ 4 - 0
start-wekan.bat

@@ -14,6 +14,10 @@ SET MONGO_URL=mongodb://127.0.0.1:27017/wekan
 REM # https://github.com/wekan/wekan/wiki/Troubleshooting-Mail
 REM SET MAIL_URL=smtps://username:password@email-smtp.eu-west-1.amazonaws.com:587/
 REM SET MAIL_FROM="Wekan Boards <info@example.com>"
+REM SET MAIL_SERVICE=Outlook365
+REM SET MAIL_SERVICE_USER=firstname.lastname@hotmail.com
+REM SET MAIL_SERVICE_PASSWORD=SecretPassword
+
 
 REM # ==== NUMBER OF SEARCH RESULTS PER PAGE BY DEFAULT ====
 REM SET RESULTS_PER_PAGE=20

+ 4 - 0
start-wekan.sh

@@ -17,6 +17,10 @@
       # https://github.com/wekan/wekan/wiki/Troubleshooting-Mail
       # https://github.com/wekan/wekan-mongodb/blob/master/docker-compose.yml
       export MAIL_URL='smtp://user:pass@mailserver.example.com:25/'
+      export MAIL_FROM='Wekan Boards <info@example.com>'
+      #export MAIL_SERVICE=Outlook365
+      #export MAIL_SERVICE_USER=firstname.lastname@hotmail.com
+      #export MAIL_SERVICE_PASSWORD=SecretPassword
       #---------------------------------------------
       #export KADIRA_OPTIONS_ENDPOINT=http://127.0.0.1:11011
       #---------------------------------------------

+ 3 - 0
torodb-postgresql/docker-compose.yml

@@ -170,6 +170,9 @@ services:
       #       You can encode those characters for example at: https://www.urlencoder.org
       - MAIL_URL=smtp://user:pass@mailserver.example.com:25/
       - MAIL_FROM='Example Wekan Support <support@example.com>'
+      #- MAIL_SERVICE=Outlook365
+      #- MAIL_SERVICE_USER=firstname.lastname@hotmail.com
+      #- MAIL_SERVICE_PASSWORD=SecretPassword
       #---------------------------------------------------------------
       # ==== OPTIONAL: MONGO OPLOG SETTINGS =====
       # https://github.com/wekan/wekan-mongodb/issues/2#issuecomment-378343587

Некоторые файлы не были показаны из-за большого количества измененных файлов