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

Commit

Permalink
Merge pull request #6 from HodyRC/email
Browse files Browse the repository at this point in the history
Email
  • Loading branch information
lukynmatuska authored Oct 3, 2021
2 parents 8e8c0d2 + 4870505 commit fcde865
Show file tree
Hide file tree
Showing 9 changed files with 501 additions and 39 deletions.
385 changes: 375 additions & 10 deletions package-lock.json

Large diffs are not rendered by default.

11 changes: 9 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,26 @@
"@tsed/schema": "^6.63.2",
"@tsed/socketio": "^6.63.2",
"@tsed/swagger": "^6.63.2",
"@types/bluebird": "^3.5.36",
"@types/ejs": "^3.1.0",
"@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",
"cookie-parser": "^1.4.5",
"cors": "^2.8.5",
"cross-env": "^7.0.3",
"dotenv": "^10.0.0",
"ejs": "^3.1.6",
"express": "^4.17.1",
"express-session": "^1.17.2",
"keycloak-connect": "^15.0.2",
"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 +53,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 +63,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,
};
105 changes: 105 additions & 0 deletions src/services/Nodemailer.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import { Constant, Injectable, OnInit } 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";
import ejs from "ejs";
import path from "path";

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

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

private _testAccount: nodemailer.TestAccount;

$onInit(){
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));
}

//this.nodeMailerService.sendAndParse("email@seznam.cz", "Testovací email", "test.ejs", {"text": "Hello, World!"});
public async sendAndParse(to: string, subject: string, fileName: string, data: object, options?: object){
this.sendHtml(to, subject, await this.parse(fileName, data, options));
}

public async sendHtml(to: string, subject: string, html: string) {
// send mail with defined transport object
let info = await this._transporter.sendMail({
from: this.config.sender, // sender address
to: to, // list of receivers
subject: subject, // Subject line
html: html, // 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);
}*/


private parse(fileName: string, data: object, options?: object){
return ejs.renderFile(path.resolve(`src/templates/${fileName}`), data, options);
}
}
2 changes: 1 addition & 1 deletion src/services/Ticket.service.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Inject, Injectable } from "@tsed/di";
import { BadRequest } from "@tsed/exceptions";
import { MongooseModel } from "@tsed/mongoose";
import { CustomerModel } from "src/models/Customer.model";
import { TicketEasyModel, TicketModel, TicketUpdateModel } from "src/models/Ticket.model";
Expand Down Expand Up @@ -42,7 +43,6 @@ export class TicketService {
owner = await this.customerService.save(obj.buyer);
}


// Get active year
let year = await this.yearModel.findOne({ status: 'active' });
if (!year) {
Expand Down

0 comments on commit fcde865

Please sign in to comment.