Compare commits
18 Commits
Author | SHA1 | Date | |
---|---|---|---|
f67750ff0f | |||
ee25cfc78f | |||
ff5ab4def0 | |||
b418c11827 | |||
e643cf714e | |||
5a82307afe | |||
9abbcac166 | |||
5db2cd1077 | |||
3de9178cd0 | |||
2b1f8a2718 | |||
2117c2f5d9 | |||
ca0daf2454 | |||
ad6d18d306 | |||
7ddcd88862 | |||
9d6b7f3b29 | |||
8be9fc38b6 | |||
6bb3bb7d9a | |||
7fcbd39166 |
4
.gitignore
vendored
4
.gitignore
vendored
@ -15,8 +15,6 @@ node_modules/
|
|||||||
|
|
||||||
# builds
|
# builds
|
||||||
dist/
|
dist/
|
||||||
dist_web/
|
dist_*/
|
||||||
dist_serve/
|
|
||||||
dist_ts_web/
|
|
||||||
|
|
||||||
# custom
|
# custom
|
@ -24,13 +24,14 @@ mirror:
|
|||||||
- docker
|
- docker
|
||||||
- notpriv
|
- notpriv
|
||||||
|
|
||||||
snyk:
|
audit:
|
||||||
image: registry.gitlab.com/hosttoday/ht-docker-node:snyk
|
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||||
stage: security
|
stage: security
|
||||||
script:
|
script:
|
||||||
- npmci npm prepare
|
- npmci npm prepare
|
||||||
- npmci command npm install --ignore-scripts
|
- npmci command npm install --ignore-scripts
|
||||||
- npmci command snyk test
|
- npmci command npm config set registry https://registry.npmjs.org
|
||||||
|
- npmci command npm audit --audit-level=high
|
||||||
tags:
|
tags:
|
||||||
- lossless
|
- lossless
|
||||||
- docker
|
- docker
|
||||||
|
29
.vscode/launch.json
vendored
Normal file
29
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "current file",
|
||||||
|
"type": "node",
|
||||||
|
"request": "launch",
|
||||||
|
"args": [
|
||||||
|
"${relativeFile}"
|
||||||
|
],
|
||||||
|
"runtimeArgs": ["-r", "@gitzone/tsrun"],
|
||||||
|
"cwd": "${workspaceRoot}",
|
||||||
|
"protocol": "inspector",
|
||||||
|
"internalConsoleOptions": "openOnSessionStart"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "test.ts",
|
||||||
|
"type": "node",
|
||||||
|
"request": "launch",
|
||||||
|
"args": [
|
||||||
|
"test/test.ts"
|
||||||
|
],
|
||||||
|
"runtimeArgs": ["-r", "@gitzone/tsrun"],
|
||||||
|
"cwd": "${workspaceRoot}",
|
||||||
|
"protocol": "inspector",
|
||||||
|
"internalConsoleOptions": "openOnSessionStart"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
26
.vscode/settings.json
vendored
Normal file
26
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"json.schemas": [
|
||||||
|
{
|
||||||
|
"fileMatch": ["/npmextra.json"],
|
||||||
|
"schema": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"npmci": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "settings for npmci"
|
||||||
|
},
|
||||||
|
"gitzone": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "settings for gitzone",
|
||||||
|
"properties": {
|
||||||
|
"projectType": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["website", "element", "service", "npm"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
10478
assets/domains.json
Normal file
10478
assets/domains.json
Normal file
File diff suppressed because it is too large
Load Diff
21
license
Normal file
21
license
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) Lossless GmbH
|
||||||
|
Copyright (c) Romain SIMON
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CON
|
@ -7,6 +7,7 @@
|
|||||||
"npmAccessLevel": "public"
|
"npmAccessLevel": "public"
|
||||||
},
|
},
|
||||||
"gitzone": {
|
"gitzone": {
|
||||||
|
"projectType": "npm",
|
||||||
"module": {
|
"module": {
|
||||||
"githost": "gitlab.com",
|
"githost": "gitlab.com",
|
||||||
"gitscope": "pushrocks",
|
"gitscope": "pushrocks",
|
||||||
|
4493
package-lock.json
generated
4493
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
29
package.json
29
package.json
@ -1,35 +1,38 @@
|
|||||||
{
|
{
|
||||||
"name": "@pushrocks/smartmail",
|
"name": "@pushrocks/smartmail",
|
||||||
"version": "1.0.8",
|
"version": "1.0.17",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "a unified format for representing and dealing with mails",
|
"description": "a unified format for representing and dealing with mails",
|
||||||
"main": "dist/index.js",
|
"main": "dist_ts/index.js",
|
||||||
"typings": "dist/index.d.ts",
|
"typings": "dist_ts/index.d.ts",
|
||||||
"author": "Lossless GmbH",
|
"author": "Lossless GmbH",
|
||||||
"license": "UNLICENSED",
|
"license": "UNLICENSED",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "(tstest test/)",
|
"test": "(tstest test/)",
|
||||||
"format": "(gitzone format)",
|
"format": "(gitzone format)",
|
||||||
"build": "(tsbuild)"
|
"build": "(tsbuild --web)"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@gitzone/tsbuild": "^2.1.17",
|
"@gitzone/tsbuild": "^2.1.24",
|
||||||
"@gitzone/tsrun": "^1.2.8",
|
"@gitzone/tsrun": "^1.2.12",
|
||||||
"@gitzone/tstest": "^1.0.28",
|
"@gitzone/tstest": "^1.0.33",
|
||||||
"@pushrocks/tapbundle": "^3.2.0",
|
"@pushrocks/tapbundle": "^3.2.1",
|
||||||
"@types/node": "^13.1.6",
|
"@types/node": "^14.0.13",
|
||||||
"tslint": "^5.20.1",
|
"tslint": "^6.1.2",
|
||||||
"tslint-config-prettier": "^1.18.0"
|
"tslint-config-prettier": "^1.18.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@pushrocks/smartfile": "^7.0.6",
|
"@pushrocks/smartdns": "^4.0.3",
|
||||||
"@pushrocks/smartmustache": "^2.0.9"
|
"@pushrocks/smartfile": "^7.0.12",
|
||||||
|
"@pushrocks/smartmustache": "^2.0.9",
|
||||||
|
"@pushrocks/smartrequest": "^1.1.47"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"ts/**/*",
|
"ts/**/*",
|
||||||
"ts_web/**/*",
|
"ts_web/**/*",
|
||||||
"dist/**/*",
|
"dist/**/*",
|
||||||
"dist_web/**/*",
|
"dist_*/**/*",
|
||||||
|
"dist_ts/**/*",
|
||||||
"dist_ts_web/**/*",
|
"dist_ts_web/**/*",
|
||||||
"assets/**/*",
|
"assets/**/*",
|
||||||
"cli.js",
|
"cli.js",
|
||||||
|
22
readme.md
22
readme.md
@ -8,16 +8,24 @@ a unified format for representing and dealing with mails
|
|||||||
* [docs (typedoc)](https://pushrocks.gitlab.io/smartmail/)
|
* [docs (typedoc)](https://pushrocks.gitlab.io/smartmail/)
|
||||||
|
|
||||||
## Status for master
|
## Status for master
|
||||||
[](https://gitlab.com/pushrocks/smartmail/commits/master)
|
|
||||||
[](https://gitlab.com/pushrocks/smartmail/commits/master)
|
Status Category | Status Badge
|
||||||
[](https://www.npmjs.com/package/@pushrocks/smartmail)
|
-- | --
|
||||||
[](https://snyk.io/test/npm/@pushrocks/smartmail)
|
GitLab Pipelines | [](https://lossless.cloud)
|
||||||
[](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
GitLab Pipline Test Coverage | [](https://lossless.cloud)
|
||||||
[](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
npm | [](https://lossless.cloud)
|
||||||
[](https://prettier.io/)
|
Snyk | [](https://lossless.cloud)
|
||||||
|
TypeScript Support | [](https://lossless.cloud)
|
||||||
|
node Support | [](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||||
|
Code Style | [](https://lossless.cloud)
|
||||||
|
PackagePhobia (total standalone install weight) | [](https://lossless.cloud)
|
||||||
|
PackagePhobia (package size on registry) | [](https://lossless.cloud)
|
||||||
|
BundlePhobia (total size when bundled) | [](https://lossless.cloud)
|
||||||
|
Platform support | [](https://lossless.cloud) [](https://lossless.cloud)
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
Use TypeScript for best in class intellisense!
|
||||||
|
|
||||||
## Contribution
|
## Contribution
|
||||||
|
|
||||||
|
30
test/test.ts
30
test/test.ts
@ -1,7 +1,35 @@
|
|||||||
import { expect, tap } from '@pushrocks/tapbundle';
|
import { expect, tap } from '@pushrocks/tapbundle';
|
||||||
import * as smartmail from '../ts/index';
|
import * as smartmail from '../ts/index';
|
||||||
|
|
||||||
tap.test('first test', async () => {
|
let emailAddressValidatorInstance: smartmail.EmailAddressValidator;
|
||||||
|
|
||||||
|
tap.test('should create an instance of EmailAddressValidator', async () => {
|
||||||
|
emailAddressValidatorInstance = new smartmail.EmailAddressValidator();
|
||||||
|
expect(emailAddressValidatorInstance).to.be.instanceOf(smartmail.EmailAddressValidator);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should validate an email', async () => {
|
||||||
|
const result = await emailAddressValidatorInstance.validate('sandbox@bleu.de');
|
||||||
|
expect(result.freemail).to.be.false;
|
||||||
|
expect(result.disposable).to.be.false;
|
||||||
|
console.log(result);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should recognize an email as freemail', async () => {
|
||||||
|
const result = await emailAddressValidatorInstance.validate('sandbox@gmail.com');
|
||||||
|
expect(result.freemail).to.be.true;
|
||||||
|
expect(result.disposable).to.be.false;
|
||||||
|
console.log(result);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should recognize an email as disposable', async () => {
|
||||||
|
const result = await emailAddressValidatorInstance.validate('sandbox@gmx.de');
|
||||||
|
expect(result.freemail).to.be.false;
|
||||||
|
expect(result.disposable).to.be.true;
|
||||||
|
console.log(result);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should create a SmartMail', async () => {
|
||||||
const testSmartmail = new smartmail.Smartmail({
|
const testSmartmail = new smartmail.Smartmail({
|
||||||
body: 'hi there',
|
body: 'hi there',
|
||||||
from: 'noreply@mail.lossless.com',
|
from: 'noreply@mail.lossless.com',
|
||||||
|
@ -1 +1,2 @@
|
|||||||
export * from './smartmail.classes.smartmail';
|
export * from './smartmail.classes.smartmail';
|
||||||
|
export * from './smartmail.classes.emailaddressvalidator';
|
||||||
|
58
ts/smartmail.classes.emailaddressvalidator.ts
Normal file
58
ts/smartmail.classes.emailaddressvalidator.ts
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
import * as plugins from './smartmail.plugins';
|
||||||
|
import * as paths from './smartmail.paths';
|
||||||
|
|
||||||
|
export interface IEmailValidationResult {
|
||||||
|
valid: boolean;
|
||||||
|
disposable: boolean;
|
||||||
|
freemail: boolean;
|
||||||
|
reason: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class EmailAddressValidator {
|
||||||
|
public domainMap: { [key: string]: 'disposable' | 'freemail'};
|
||||||
|
|
||||||
|
public smartdns = new plugins.smartdns.Smartdns({});
|
||||||
|
|
||||||
|
public async validate(emailArg: string): Promise<IEmailValidationResult> {
|
||||||
|
await this.fetchDomains();
|
||||||
|
const emailArray = emailArg.split('@');
|
||||||
|
const result = await this.smartdns.getRecord(emailArray[1], 'MX');
|
||||||
|
// console.log(emailArray);
|
||||||
|
// console.log(this.domainMap[emailArray[1]]);
|
||||||
|
return {
|
||||||
|
valid: !!result,
|
||||||
|
reason: 'todo',
|
||||||
|
disposable: this.domainMap[emailArray[1]] === 'disposable',
|
||||||
|
freemail: this.domainMap[emailArray[1]] === 'freemail'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public async fetchDomains() {
|
||||||
|
if (!this.domainMap) {
|
||||||
|
const localFileString = plugins.smartfile.fs.toStringSync(
|
||||||
|
plugins.path.join(paths.assetDir, 'domains.json')
|
||||||
|
);
|
||||||
|
const localFileObject = JSON.parse(localFileString);
|
||||||
|
|
||||||
|
|
||||||
|
let onlineFileObject: any;
|
||||||
|
try {
|
||||||
|
onlineFileObject = (
|
||||||
|
await plugins.smartrequest.getJson(
|
||||||
|
'https://raw.githubusercontent.com/romainsimon/emailvalid/master/domains.json'
|
||||||
|
)
|
||||||
|
).body;
|
||||||
|
this.domainMap = onlineFileObject;
|
||||||
|
console.log(
|
||||||
|
'smartmail EmailAddressValidator: Using online email list for email validation'
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
this.domainMap = localFileObject;
|
||||||
|
console.log(e);
|
||||||
|
console.log(
|
||||||
|
'smartmail EmailAddressValidator: Using local email list for email validation'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,19 +1,20 @@
|
|||||||
import * as plugins from './smartmail.plugins';
|
import * as plugins from './smartmail.plugins';
|
||||||
|
|
||||||
export interface ISmartmailOptions {
|
export interface ISmartmailOptions<T> {
|
||||||
from: string;
|
from: string;
|
||||||
subject: string;
|
subject: string;
|
||||||
body: string;
|
body: string;
|
||||||
|
creationObjectRef?: T;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* a standard representation for mails
|
* a standard representation for mails
|
||||||
*/
|
*/
|
||||||
export class Smartmail {
|
export class Smartmail<T> {
|
||||||
public options: ISmartmailOptions;
|
public options: ISmartmailOptions<T>;
|
||||||
public attachments: plugins.smartfile.Smartfile[] = [];
|
public attachments: plugins.smartfile.Smartfile[] = [];
|
||||||
|
|
||||||
constructor(optionsArg: ISmartmailOptions) {
|
constructor(optionsArg: ISmartmailOptions<T>) {
|
||||||
this.options = optionsArg;
|
this.options = optionsArg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -21,6 +22,10 @@ export class Smartmail {
|
|||||||
this.attachments.push(smartfileArg);
|
this.attachments.push(smartfileArg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getCreationObject(): T {
|
||||||
|
return this.options.creationObjectRef;
|
||||||
|
}
|
||||||
|
|
||||||
public getSubject(dataArg: any = {}) {
|
public getSubject(dataArg: any = {}) {
|
||||||
const smartmustache = new plugins.smartmustache.SmartMustache(this.options.subject);
|
const smartmustache = new plugins.smartmustache.SmartMustache(this.options.subject);
|
||||||
return smartmustache.applyData(dataArg);
|
return smartmustache.applyData(dataArg);
|
||||||
|
4
ts/smartmail.paths.ts
Normal file
4
ts/smartmail.paths.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import * as plugins from './smartmail.plugins';
|
||||||
|
|
||||||
|
export const packageDir = plugins.path.join(__dirname, '../');
|
||||||
|
export const assetDir = plugins.path.join(packageDir, './assets');
|
@ -1,4 +1,14 @@
|
|||||||
|
// node native scope
|
||||||
|
import * as path from 'path';
|
||||||
|
|
||||||
|
export {
|
||||||
|
path
|
||||||
|
};
|
||||||
|
|
||||||
|
// pushrocks scope
|
||||||
|
import * as smartdns from '@pushrocks/smartdns';
|
||||||
import * as smartfile from '@pushrocks/smartfile';
|
import * as smartfile from '@pushrocks/smartfile';
|
||||||
import * as smartmustache from '@pushrocks/smartmustache';
|
import * as smartmustache from '@pushrocks/smartmustache';
|
||||||
|
import * as smartrequest from '@pushrocks/smartrequest';
|
||||||
|
|
||||||
export { smartfile, smartmustache };
|
export { smartdns, smartfile, smartmustache, smartrequest };
|
||||||
|
Reference in New Issue
Block a user