Skip to content
This repository has been archived by the owner on Oct 1, 2024. It is now read-only.

Commit

Permalink
Improve email service
Browse files Browse the repository at this point in the history
  • Loading branch information
lukynmatuska committed Sep 30, 2021
1 parent dad4ebe commit aa47728
Show file tree
Hide file tree
Showing 8 changed files with 489 additions and 38 deletions.
385 changes: 375 additions & 10 deletions package-lock.json

Large diffs are not rendered by default.

9 changes: 7 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@
"@tsed/schema": "^6.63.2",
"@tsed/socketio": "^6.63.2",
"@tsed/swagger": "^6.63.2",
"@types/bluebird": "^3.5.36",
"@types/nodemailer": "^6.4.4",
"@types/nodemailer-direct-transport": "^1.0.32",
"@types/nodemailer-smtp-transport": "^2.7.5",
"ajv": "^8.6.2",
"body-parser": "^1.19.0",
"compression": "^1.7.4",
Expand All @@ -34,6 +38,7 @@
"method-override": "^3.0.0",
"moment": "^2.29.1",
"mongoose": "^5.13.8",
"nodemailer": "^6.6.5",
"socket.io": "^4.1.3"
},
"devDependencies": {
Expand All @@ -46,7 +51,7 @@
"@types/express-session": "^1.17.4",
"@types/method-override": "^0.0.32",
"@types/multer": "^1.4.7",
"@types/node": "^16.7.1",
"@types/node": "^16.9.6",
"ts-node": "^10.2.1",
"ts-node-dev": "^1.1.8",
"tsconfig-paths": "^3.10.1",
Expand All @@ -56,4 +61,4 @@
"packageManager": "npm",
"convention": "default"
}
}
}
5 changes: 3 additions & 2 deletions src/Server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,9 @@ import compression from "compression";
resource: process.env.KEYCLOAK_CLIENT_ID || "backend",
confidentialPort: process.env.KEYCLOAK_CONF_PORT || 0
},
nodeMailer: {
smtp: "ahoj"
nodemailer: {
transport: process.env.NODEMAILER_TRANSPORT,
defaults: process.env.NODEMAILER_DEFAULTS,
}
})
export class Server {
Expand Down
9 changes: 0 additions & 9 deletions src/controllers/rest.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,12 @@ import { ContentType, Description, Summary } from "@tsed/schema";
import { SwaggerSettings } from "@tsed/swagger";
import moment from "moment";
import { KeycloakAuth } from "src/decorators/KeycloakAuthOptions.decorator";
import { NodeMailerService } from "src/services/NodeMailer.service";

@Controller("/")
export class RestController {
@Constant("swagger")
swagger: SwaggerSettings[];

@Inject()
nodeMailerService: NodeMailerService;

@ContentType('application/json')
@Get("/")
@Summary("Root route of the API")
Expand All @@ -30,9 +26,4 @@ export class RestController {
protected() {
return { "test": "ahoj" };
}

@Get("/smtp")
smtp(){
return this.nodeMailerService.getSmtp();
}
}
3 changes: 0 additions & 3 deletions src/services/NodeMailer.config.ts

This file was deleted.

12 changes: 0 additions & 12 deletions src/services/NodeMailer.service.ts

This file was deleted.

8 changes: 8 additions & 0 deletions src/services/Nodemailer.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { Address } from 'nodemailer/lib/mailer';
import SMTPTransport from 'nodemailer/lib/smtp-transport';

export interface NodemailerConfig {
transport?: SMTPTransport | SMTPTransport.Options | string,
defaults?: SMTPTransport.Options,
sender?: string | Address,
};
96 changes: 96 additions & 0 deletions src/services/Nodemailer.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import { Constant, Injectable } from "@tsed/di";
import { NodemailerConfig } from "./Nodemailer.config";
import * as nodemailer from 'nodemailer';
import SMTPTransport from "nodemailer/lib/smtp-transport";
import Mail from "nodemailer/lib/mailer";
import moment from "moment";

@Injectable()
export class NodemailerService {
@Constant("nodemailer")
config: NodemailerConfig;

private _transporter: nodemailer.Transporter<SMTPTransport.SentMessageInfo>;

private _testAccount: nodemailer.TestAccount;


constructor() {
if (!this.config?.transport) {
// Generate test SMTP service account from ethereal.email
// Only needed if you don't have a real mail account for testing
nodemailer.createTestAccount((err, testAccount) => {
if (err) {
return console.error(err);
}
this._testAccount = testAccount;
console.log(testAccount);
// create reusable transporter object using the default SMTP transport
this._transporter = nodemailer.createTransport({
host: testAccount.smtp.host,
port: testAccount.smtp.port,
secure: testAccount.smtp.secure,
auth: {
user: testAccount.user, // generated ethereal user
pass: testAccount.pass, // generated ethereal password
},
});
this.transporterVerify();
this.sendTestMail();
});
} else {
this._transporter = nodemailer.createTransport(
this.config.transport,
this.config.defaults
);
this.transporterVerify();
}
}

private transporterVerify() {
this._transporter.verify((error) => {
if (error) {
return console.error(error);
}
console.log(`${moment().format('YYYY-MM-DD HH:mm:ss')} Nodemailer: Server is ready to take our messages`);
})
}

public async sendTestMail() {
// send mail with defined transport object
let info = await this._transporter.sendMail({
from: `"Fred Foo 👻" <${this._testAccount.user}>`, // sender address
to: "matuska.lukas@lukasmatuska.cz", // list of receivers
subject: "Hello ✔", // Subject line
text: "Hello world?", // plain text body
html: "<b>Hello world?</b>", // html body
});

console.log("Message sent: %s", info.messageId);
// Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>

// Preview only available when sending through an Ethereal account
console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
}

public async send(id: string, callback: Function) {
// send mail with defined transport object
let info = await this._transporter.sendMail({
from: this.config.sender, // sender address
to: "matuska.lukas@lukasmatuska.cz", // list of receivers
subject: "Hello ✔", // Subject line
text: "Hello world?", // plain text body
html: "<b>Hello world?</b>", // html body
});

console.log("Message sent: %s", info.messageId);

// Preview only available when sending through an Ethereal account
console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
}

/*public send(mailOptions: Mail.Options) {
this._transporter.sendMail(mailOptions);
}*/

}

0 comments on commit aa47728

Please sign in to comment.