diff --git a/backend/.env.dist b/backend/.env.dist index 30c0da2db..b4a91026a 100644 --- a/backend/.env.dist +++ b/backend/.env.dist @@ -18,6 +18,8 @@ DB_DATABASE=gradido_community #EMAIL_SMTP_URL= #EMAIL_SMTP_PORT=587 +#EMAIL_LINK_VERIFICATION=http://localhost/vue/checkEmail/$1 + #KLICKTIPP_USER= #KLICKTIPP_PASSWORD= #KLICKTIPP_APIKEY_DE= diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index 7e2059eac..f21082d1d 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -51,6 +51,9 @@ const email = { EMAIL_PASSWORD: process.env.EMAIL_PASSWORD || 'xxx', EMAIL_SMTP_URL: process.env.EMAIL_SMTP_URL || 'gmail.com', EMAIL_SMTP_PORT: process.env.EMAIL_SMTP_PORT || '587', + + EMAIL_LINK_VERIFICATION: + process.env.EMAIL_LINK_VERIFICATION || 'http://localhost/vue/checkEmail/$1', } // This is needed by graphql-directive-auth diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index c3c8e0f14..6a8eed67f 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -28,6 +28,7 @@ import { UserRepository } from '../../typeorm/repository/User' import { LoginUser } from '@entity/LoginUser' import { LoginUserBackup } from '@entity/LoginUserBackup' import { LoginEmailOptIn } from '@entity/LoginEmailOptIn' +import { sendEMail } from '../../util/sendEMail' // TODO apparently the types are cannot be loaded correctly? IDK whats wrong and we have to use require // import { @@ -378,7 +379,7 @@ export class UserResolver { // Store EmailOptIn in DB const emailOptIn = new LoginEmailOptIn() emailOptIn.userId = loginUserId - emailOptIn.verificationCode = random(64) // TODO generate verificationCode + emailOptIn.verificationCode = random(64) emailOptIn.emailOptInTypeId = 2 await queryRunner.manager.save(emailOptIn).catch((error) => { @@ -386,9 +387,33 @@ export class UserResolver { console.log('Error while saving emailOptIn', error) throw new Error('error saving email opt in') }) - // TODO: Send EmailOptIn to user.email - // emailOptIn->setBaseUrl(user->getGroupBaseUrl() + ServerConfig::g_frontend_checkEmailPath); - // em->addEmail(new model::Email(emailOptIn, user, model::Email::convertTypeFromInt(emailType))); + + // Send EMail to user + const activationLink = CONFIG.EMAIL_LINK_VERIFICATION.replace( + /\$1/g, + emailOptIn.verificationCode.toString(), + ) + const emailSent = await sendEMail({ + from: `Gradido (nicht antworten) <${CONFIG.EMAIL_SENDER}>`, + to: `${firstName} ${lastName} <${email}>`, + subject: 'Gradido: E-Mail Überprüfung', + text: `Hallo ${firstName} ${lastName}, + + Deine EMail wurde soeben bei Gradido registriert. + + Klicke bitte auf diesen Link, um die Registrierung abzuschließen und dein Gradido-Konto zu aktivieren: + ${activationLink} + oder kopiere den obigen Link in dein Browserfenster. + + Mit freundlichen Grüßen, + dein Gradido-Team`, + }) + + // In case EMails are disabled log the activation link for the user + if (!emailSent) { + // eslint-disable-next-line no-console + console.log(`Account confirmation link: ${activationLink}`) + } await queryRunner.commitTransaction() } catch (e) { await queryRunner.rollbackTransaction()