@social-mail/social-mail-web-server 1.4.798 → 1.4.800

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,8 @@
1
+ import Page from "@entity-access/server-pages/dist/Page.js";
2
+ import SocialMailContext from "../../../../../server/model/SocialMailContext.js";
3
+ export default class extends Page {
4
+ db: SocialMailContext;
5
+ private els;
6
+ run(): Promise<import("@entity-access/server-pages/dist/Content.js").default>;
7
+ }
8
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/api/emails/d/get.ts"],"names":[],"mappings":"AAEA,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAE5D,OAAO,iBAAiB,MAAM,kDAAkD,CAAC;AAKjF,MAAM,CAAC,OAAO,MAAO,SAAQ,IAAI;IAG7B,EAAE,EAAE,iBAAiB,CAAC;IAGtB,OAAO,CAAC,GAAG,CAAkB;IAGvB,GAAG;CA4CZ"}
@@ -0,0 +1,64 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import Inject from "@entity-access/entity-access/dist/di/di.js";
11
+ import { Prepare } from "@entity-access/server-pages/dist/decorators/Prepare.js";
12
+ import Page from "@entity-access/server-pages/dist/Page.js";
13
+ import { MimeMessage, LineStream } from "@social-mail/shared/index.js";
14
+ import SocialMailContext from "../../../../../server/model/SocialMailContext.js";
15
+ import EmailLogService from "../../../../../server/services/email-logs/EmailLogService.js";
16
+ import { JSDOM } from 'jsdom';
17
+ let default_1 = class extends Page {
18
+ async run() {
19
+ const [emailID, ...link] = this.childPath;
20
+ const email = await this.db.emails
21
+ .filtered("read")
22
+ .where({ emailID }, (p) => (x) => x.emailID === p.emailID)
23
+ .include((x) => x.mimeFile)
24
+ .first();
25
+ this.cacheControl = "public, max-age=2592000, immutable";
26
+ const file = await this.els.load(email.mimeFile);
27
+ const root = MimeMessage.load(new (class extends LineStream {
28
+ lines() {
29
+ return file.lines();
30
+ }
31
+ })());
32
+ const html = root.html;
33
+ const { window: { document } } = new JSDOM(html);
34
+ const links = Array.from(document.links);
35
+ const q = this.request.URL.search;
36
+ const url = `//${link.join("/")}${q}`;
37
+ const ae = links.find((x) => x.href.endsWith(url));
38
+ const rs = await fetch(ae.href);
39
+ const status = rs.status;
40
+ const headers = {};
41
+ for (const [key, value] of rs.headers.entries()) {
42
+ headers[key] = value;
43
+ }
44
+ const body = Buffer.from(await rs.arrayBuffer());
45
+ return this.content({
46
+ body,
47
+ headers,
48
+ status
49
+ });
50
+ }
51
+ };
52
+ __decorate([
53
+ Inject,
54
+ __metadata("design:type", SocialMailContext)
55
+ ], default_1.prototype, "db", void 0);
56
+ __decorate([
57
+ Inject,
58
+ __metadata("design:type", EmailLogService)
59
+ ], default_1.prototype, "els", void 0);
60
+ default_1 = __decorate([
61
+ Prepare.authorize
62
+ ], default_1);
63
+ export default default_1;
64
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/api/emails/d/get.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,4CAA4C,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,wDAAwD,CAAC;AACjF,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,iBAAiB,MAAM,kDAAkD,CAAC;AACjF,OAAO,eAAe,MAAM,8DAA8D,CAAC;AAC3F,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAGf,gBAAA,KAAM,SAAQ,IAAI;IAS7B,KAAK,CAAC,GAAG;QAEL,MAAM,CAAC,OAAO,EAAE,GAAI,IAAI,CAAC,GAAG,IAAI,CAAC,SAAkB,CAAC;QAEpD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM;aAC7B,QAAQ,CAAC,MAAM,CAAC;aAChB,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC;aACzD,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;aAC1B,KAAK,EAAE,CAAC;QAEb,IAAI,CAAC,YAAY,GAAG,oCAAoC,CAAC;QAEzD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEjD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAE,IAAI,CAAC,KAAM,SAAQ,UAAU;YACxD,KAAK;gBACD,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;SACJ,CAAC,EAAE,CAAC,CAAC;QAEN,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEvB,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;QAEjD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEzC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QAClC,MAAM,GAAG,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAEtC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAEnD,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;QACzB,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACzB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,OAAO,CAAC;YAChB,IAAI;YACJ,OAAO;YACP,MAAM;SACT,CAAC,CAAC;IACP,CAAC;CACJ,CAAA;AAlDG;IADC,MAAM;8BACH,iBAAiB;qCAAC;AAGd;IADP,MAAM;8BACM,eAAe;sCAAC;AANlB;IADd,OAAO,CAAC,SAAS;aAsDjB"}
@@ -0,0 +1,8 @@
1
+ import Page from "@entity-access/server-pages/dist/Page.js";
2
+ import SocialMailContext from "../../../../../server/model/SocialMailContext.js";
3
+ export default class extends Page {
4
+ db: SocialMailContext;
5
+ private els;
6
+ run(): Promise<import("@entity-access/server-pages/dist/Content.js").default>;
7
+ }
8
+ //# sourceMappingURL=post.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/api/emails/unsubscribe/post.tsx"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAC5D,OAAO,iBAAiB,MAAM,kDAAkD,CAAC;AAOjF,MAAM,CAAC,OAAO,MAAO,SAAQ,IAAI;IAG7B,EAAE,EAAE,iBAAiB,CAAC;IAGtB,OAAO,CAAC,GAAG,CAAkB;IAEvB,GAAG;CAuDZ"}
@@ -0,0 +1,73 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import Inject from "@entity-access/entity-access/dist/di/di.js";
11
+ import Page from "@entity-access/server-pages/dist/Page.js";
12
+ import SocialMailContext from "../../../../../server/model/SocialMailContext.js";
13
+ import EmailLogService from "../../../../../server/services/email-logs/EmailLogService.js";
14
+ import { MimeNode, LineStream } from "@social-mail/shared/index.js";
15
+ import { Prepare } from "@entity-access/server-pages/dist/decorators/Prepare.js";
16
+ let default_1 = class extends Page {
17
+ async run() {
18
+ const [emailID] = this.childPath;
19
+ const email = await this.db.emails
20
+ .filtered("read")
21
+ .where({ emailID }, (p) => (x) => x.emailID === p.emailID)
22
+ .include((x) => x.mimeFile)
23
+ .first();
24
+ const file = await this.els.load(email.mimeFile);
25
+ const root = new MimeNode();
26
+ await root.parse(new (class extends LineStream {
27
+ lines() {
28
+ return file.lines();
29
+ }
30
+ })());
31
+ let u = root.header("List-Unsubscribe");
32
+ u = u.split(",").find((x) => /\<http/i.test(x)).trim();
33
+ if (u.endsWith(">")) {
34
+ u = u.substring(0, u.length - 1);
35
+ }
36
+ if (u.startsWith("<")) {
37
+ u = u.substring(1);
38
+ }
39
+ let method = "GET";
40
+ if (root.header("List-Unsubscribe-Post")) {
41
+ method = "POST";
42
+ }
43
+ const rs = await fetch(u, {
44
+ method
45
+ });
46
+ let failed = "";
47
+ let result = "";
48
+ const status = rs.status;
49
+ if (status > 399) {
50
+ failed = await rs.text();
51
+ }
52
+ else {
53
+ result = await rs.text();
54
+ }
55
+ return this.json({
56
+ failed,
57
+ result
58
+ }, void 0, { status });
59
+ }
60
+ };
61
+ __decorate([
62
+ Inject,
63
+ __metadata("design:type", SocialMailContext)
64
+ ], default_1.prototype, "db", void 0);
65
+ __decorate([
66
+ Inject,
67
+ __metadata("design:type", EmailLogService)
68
+ ], default_1.prototype, "els", void 0);
69
+ default_1 = __decorate([
70
+ Prepare.authorize
71
+ ], default_1);
72
+ export default default_1;
73
+ //# sourceMappingURL=post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post.js","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/api/emails/unsubscribe/post.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@social-mail/social-mail-web-server",
3
- "version": "1.4.798",
3
+ "version": "1.4.800",
4
4
  "description": "## Phase 1",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -22,9 +22,10 @@
22
22
  "@aws-sdk/client-s3": "^3.609.0",
23
23
  "@azure/storage-blob": "^12.23.0",
24
24
  "@entity-access/entity-access": "^1.0.343",
25
- "@entity-access/server-pages": "^1.1.220",
25
+ "@entity-access/server-pages": "^1.1.221",
26
26
  "@otplib/preset-v11": "^12.0.1",
27
27
  "@social-mail/noto-emoji-svg": "^2.0.42",
28
+ "@social-mail/shared": "^1.0.11",
28
29
  "@socket.io/cluster-adapter": "^0.2.2",
29
30
  "@socket.io/sticky": "^1.0.4",
30
31
  "@sunknudsen/totp": "^1.1.0",
@@ -3,7 +3,7 @@ import semver from "semver";
3
3
 
4
4
  export default async function seedUI(config: DBConfig) {
5
5
 
6
- const version = "1.2.311";
6
+ const version = "1.2.312";
7
7
 
8
8
  const existing = await config.get(UIPackageConfig, false);
9
9
  if (existing) {
@@ -1,102 +1,266 @@
1
1
  import assert from "assert";
2
- import { MailParser, ParsedMail, simpleParser } from "mailparser";
2
+ import { MimeNode, ReadableLineStream, LineStream } from "@social-mail/shared/index.js";
3
+ import { LocalFile } from "@entity-access/server-pages/dist/core/LocalFile.js";
4
+ import { tmpName } from "tmp-promise";
3
5
 
4
- export default async function() {
6
+ class FileLineStream extends LineStream {
7
+
8
+ constructor(private file: LocalFile) {
9
+ super();
10
+ }
5
11
 
6
- const parsed = await new Promise<ParsedMail>((resolve, reject) => {
7
- simpleParser(data, (error, result) => {
8
- if (error) {
9
- reject(error);
10
- return;
12
+ async *lines() {
13
+ let line = "";
14
+ const trimEndR = (t: string) => {
15
+ if (t.endsWith("\r")) {
16
+ return t.substring(0, t.length - 1);
11
17
  }
12
- resolve(result);
13
- });
14
- });
18
+ return t;
19
+ };
20
+ for await(const buffer of this.file.readBuffers(4 * 1024 * 1024)) {
21
+ let start = 0;
22
+ do {
15
23
 
16
- const { headers: mailHeaders } = parsed;
24
+ const index = buffer.indexOf("\n", start);
25
+ if (index === -1) {
26
+ line += buffer.toString("utf8", start);
27
+ break;
28
+ }
17
29
 
18
- for (const iterator of mailHeaders.keys()) {
19
- if (/^list(\-unsubscribe)?$/i.test(iterator)) {
20
- return;
30
+ yield trimEndR(line + buffer.toString("utf8", start, index));
31
+ start = index + 1;
32
+ line = "";
33
+ } while (true);
34
+ }
35
+ line = trimEndR(line);
36
+ if (line) {
37
+ yield line;
21
38
  }
22
39
  }
40
+ }
23
41
 
24
- assert.fail();
42
+ export default async function() {
43
+
44
+ const tmp = await tmpName();
45
+
46
+ const lf = new LocalFile(tmp);
47
+ await lf.writeAllText(data);
48
+
49
+ const root = new MimeNode();
50
+
51
+ await root.parse( new (class extends LineStream {
52
+ lines() {
53
+ return lf.lines();
54
+ }
55
+ })());
56
+ let u = root.header("List-Unsubscribe");
57
+ u = u.split(",").find((x) => /\<http/i.test(x));
58
+ console.log(u);
25
59
 
26
60
  }
27
61
 
28
62
  const data = `Delivered-To: ackava@gmail.com
29
- Received: by 2002:ab3:a101:0:b0:55d:606f:316e with SMTP id i1csp1687511qnb;
30
- Sun, 14 Jul 2024 02:47:23 -0700 (PDT)
31
- X-Google-Smtp-Source: AGHT+IHIktcqIeQq/WmGpF8s64oRN9mJxgWK+7OCe3L0t3QVWGf0s46wgtGSqnjoW10jiRsR/4VE
32
- X-Received: by 2002:a05:620a:2482:b0:79e:f930:535e with SMTP id af79cd13be357-79f19a71793mr2460157185a.27.1720950443577;
33
- Sun, 14 Jul 2024 02:47:23 -0700 (PDT)
34
- ARC-Seal: i=1; a=rsa-sha256; t=1720950443; cv=none;
63
+ Received: by 2002:ab3:fb12:0:b0:55d:606f:316e with SMTP id n18csp371930qnc;
64
+ Tue, 16 Jul 2024 08:30:44 -0700 (PDT)
65
+ X-Google-Smtp-Source: AGHT+IFBGmsLkRNUsZ+w6HtkMCU8QjJA+8pm+hRhxQ9MeeVYz8gZ3ejYW+KoK9Sc+tpGwciIOljV
66
+ X-Received: by 2002:a17:90b:957:b0:2c9:649c:5e07 with SMTP id 98e67ed59e1d1-2cb373e888emr2021999a91.8.1721143844087;
67
+ Tue, 16 Jul 2024 08:30:44 -0700 (PDT)
68
+ ARC-Seal: i=1; a=rsa-sha256; t=1721143844; cv=none;
35
69
  d=google.com; s=arc-20160816;
36
- b=ndFKtkcG+IcFqBLLMUqsYRh5TrvJ4J1y4Pa1NQk8LDQEhSBfUOddqR5CQAipiGhLle
37
- vlYOCjDiQc/ysWjgp+Cz/PmGUfEKzMjIDWwI88m1JMr7Yiaf4j6hOQpU6vwOc3JElkDP
38
- 1wKOcc/pGzYnLgx7cYiYo1lg+tksGrulrP0FPwsxacBEpXDlIHq8idCO76Aur1k/xv0S
39
- LV28ySmsjJVz60eZ5O2MO28jBsVbikNCYfrMVfGFHL1+iA9smtk9TPyNL4P/5LZDfHVk
40
- cR7kffo9AJOtZidFoRaHArTwT4AekBUBZCbG6GGrXajB1vgGv00/LUEKg4THS18yJbCS
41
- o+Yg==
70
+ b=HwyhoQtC0Zb9d3Uc0YEt6DCcAR41g1r3GxNqAnjegyHCI11QLJ1PDkZWBps2QMc9LM
71
+ WgnGyJzUzNxY7LzHEebzr9/qOXRni4pkRm0j9La5nA8o3tZUjiWanU1WI6+rAcE7qcAY
72
+ NcHW/TE97IiTuGOJYJIMkevV6W2L/y6Wd083xbIDtNopTfmo0YQeVc2hvnrWir72k8Na
73
+ ABLWewW1Ra6asH+CXuwRtpgIlXYX4ULFqX011jQaEIAHA2tTRS3Ptdw3wzAqAwXOSVdv
74
+ obQS08nSMF2uApBJD9myCz83ZNPEKO4/jiQ7a87r4u3HLdzWzGRQZ7VwTR5Z8ES68HYz
75
+ q26A==
42
76
  ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;
43
- h=mime-version:feedback-id:list-unsubscribe:list-unsubscribe-post
44
- :message-id:subject:reply-to:from:to:date:dkim-signature
45
- :dkim-signature;
46
- bh=yy52+d7me1j35SiZJoDV3Zuz1al3iiPgBgDi3EsvcLI=;
77
+ h=list-unsubscribe-post:list-unsubscribe:to:reply-to:subject
78
+ :message-id:mime-version:from:date:dkim-signature:dkim-signature;
79
+ bh=402bS+KKQORVvr6ZanPLHNmAMqbTlH5bZOugjTDPzBI=;
47
80
  fh=hmlPyZWPDmkzfTC20X6uYeCWPkl43Yxy6ifyYfZzmrU=;
48
- b=Tc4DN4XOQFy092UnkpNANHapwhK6jYRKXPKvhiLmdJwNntEsr+SAdjU0/KqrNHyU7E
49
- VzKlTAcvNs8WHNTgWgjkhVxtoMCzzuCJsd4B6sxGVcNABH19gPWwYPUNKhE2xaS/mGHp
50
- OM+zwmbk3C5RLnEEN4k31Q3mky2spU4OD0KMgOIKRcIe+x4Y971x9FDJ1NT+9zkxpefS
51
- UtIOCZgLVq2sfa+EA6na6x0PHcmNHAN/nEX5Oj/hHlpIlPQ7WytcfAUMMHY/tOG9i8Aw
52
- N5hkBQFqAbhqvU9u4SCXAHYUqBnI3NH8eswGEyEMHU2/owpUMkFqRytXgWCREab2etRQ
53
- xTbw==;
81
+ b=Lh4S82uNcK/e5K2pWdnna4bqWLj2HQm5As4knhZ7TcwFV/UB33h9IoPrPILhFd/HdH
82
+ MgQPdMVL3C86SpKdieJhp/9yhVwu6WggHGgj7O2LdSKk/opbU8HIimkms6Mo8AI2Tn8z
83
+ 1/7zAicpEpmEgbaVSypUcfUHRl4MLiTOQ63NAjQnlXP6GseBCOQXa0APPUA0mD64ZvlS
84
+ rHRPg35sWVpH7YgqFmWuyRapkaggzAf9fTqqKf1Zi8aX30pdgtgkp8gqx5zuV27dn0Y/
85
+ J9tobOpAkCNvot2FhNxiGJQry4/zjRDo92EJm2WNrGPBO2CAEazug+NA6oGXvkxgBaRV
86
+ 2mFQ==;
54
87
  dara=google.com
55
88
  ARC-Authentication-Results: i=1; mx.google.com;
56
- dkim=pass header.i=@travel.e-redbus.in header.s=fnc header.b=JIM4clD9;
57
- dkim=pass header.i=@ncdelivery01.com header.s=global header.b=powMjeKF;
58
- spf=pass (google.com: domain of campaign-traveleredbus-69014-34506-39262872-ackava=gmail.com@travel.e-redbus.in designates 193.35.16.230 as permitted sender) smtp.mailfrom="campaign-traveleredbus-69014-34506-39262872-ackava=gmail.com@travel.e-redbus.in";
59
- dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=travel.e-redbus.in
60
- Return-Path: <campaign-traveleredbus-69014-34506-39262872-ackava=gmail.com@travel.e-redbus.in>
61
- Received: from mta-16.230.e-redbus.in (mta-16.230.e-redbus.in. [193.35.16.230])
62
- by mx.google.com with ESMTPS id af79cd13be357-7a160c7dcc6si279760585a.578.2024.07.14.02.47.23
89
+ dkim=pass header.i=@hollylist.com header.s=s1 header.b=mpwylBiy;
90
+ dkim=pass header.i=@sendgrid.info header.s=smtpapi header.b=CbxOWjDV;
91
+ spf=pass (google.com: domain of bounces+14706413-1fb4-ackava=gmail.com@em5661.hollylist.com designates 149.72.65.15 as permitted sender) smtp.mailfrom="bounces+14706413-1fb4-ackava=gmail.com@em5661.hollylist.com"
92
+ Return-Path: <bounces+14706413-1fb4-ackava=gmail.com@em5661.hollylist.com>
93
+ Received: from wrqvqkhf.outbound-mail.sendgrid.net (wrqvqkhf.outbound-mail.sendgrid.net. [149.72.65.15])
94
+ by mx.google.com with ESMTPS id 98e67ed59e1d1-2cb3791c1a9si1773882a91.68.2024.07.16.08.30.43
63
95
  for <ackava@gmail.com>
64
96
  (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
65
- Sun, 14 Jul 2024 02:47:23 -0700 (PDT)
66
- Received-SPF: pass (google.com: domain of campaign-traveleredbus-69014-34506-39262872-ackava=gmail.com@travel.e-redbus.in designates 193.35.16.230 as permitted sender) client-ip=193.35.16.230;
97
+ Tue, 16 Jul 2024 08:30:44 -0700 (PDT)
98
+ Received-SPF: pass (google.com: domain of bounces+14706413-1fb4-ackava=gmail.com@em5661.hollylist.com designates 149.72.65.15 as permitted sender) client-ip=149.72.65.15;
67
99
  Authentication-Results: mx.google.com;
68
- dkim=pass header.i=@travel.e-redbus.in header.s=fnc header.b=JIM4clD9;
69
- dkim=pass header.i=@ncdelivery01.com header.s=global header.b=powMjeKF;
70
- spf=pass (google.com: domain of campaign-traveleredbus-69014-34506-39262872-ackava=gmail.com@travel.e-redbus.in designates 193.35.16.230 as permitted sender) smtp.mailfrom="campaign-traveleredbus-69014-34506-39262872-ackava=gmail.com@travel.e-redbus.in";
71
- dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=travel.e-redbus.in
72
- DKIM-Signature: a=rsa-sha256; bh=yy52+d7me1j35SiZJoDV3Zuz1al3iiPgBgDi3EsvcLI=;
73
- c=relaxed/relaxed; d=travel.e-redbus.in;
74
- h=DKIM-Signature:Date:To:From:Reply-To:Subject:Message-ID:List-Unsubscribe-Post:List-Unsubscribe:X-Mailer:X-Abuse-Reports-To:X-STO:X-Mta-Source:X-Mta-Priority:Feedback-ID:MIME-Version:Content-Type;
75
- s=fnc; t=1720950068; v=1;
76
- b=JIM4clD9D7S/Wd1fu2U/DnHa+dgLlvkDg9mc8xfCq0YwW9WfmC0VLU6R1/+C592VMtOO71za
77
- WXyopLxxF1Dr+wOfAnB8DAjY9tDitRg7xSh8niHAKzSjLvf+FJ9sDlGTXKl+UFnNWI/PMbqMDeC
78
- x/pJTQzjEq8A+l6TO6DjCLDQ=
79
- DKIM-Signature: a=rsa-sha256; bh=yy52+d7me1j35SiZJoDV3Zuz1al3iiPgBgDi3EsvcLI=;
80
- c=relaxed/relaxed; d=ncdelivery01.com;
81
- h=Date:To:From:Reply-To:Subject:Message-ID:List-Unsubscribe-Post:List-Unsubscribe:X-Mailer:X-Abuse-Reports-To:X-STO:X-Mta-Source:X-Mta-Priority:Feedback-ID:MIME-Version:Content-Type;
82
- s=global; t=1720950068; v=1;
83
- b=powMjeKFR2hDBe3rKBjoNC0u7QWwz7Zg1LKyAj/NNKCJE4HzbBEYZVuW6eYc86p3e6Lg9Zk0
84
- COpGiBMah+bNIOTYesDGgSA6vbr4HoBw5SDHlp7vRhhOcvefYxwJeQq9PH7FMQRBTUm21CmZssk
85
- BDU15fEz+SuJvofO6RKJ5MZU=
86
- Date: Sun, 14 Jul 2024 15:03:28 +0530
100
+ dkim=pass header.i=@hollylist.com header.s=s1 header.b=mpwylBiy;
101
+ dkim=pass header.i=@sendgrid.info header.s=smtpapi header.b=CbxOWjDV;
102
+ spf=pass (google.com: domain of bounces+14706413-1fb4-ackava=gmail.com@em5661.hollylist.com designates 149.72.65.15 as permitted sender) smtp.mailfrom="bounces+14706413-1fb4-ackava=gmail.com@em5661.hollylist.com"
103
+ DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hollylist.com;
104
+ h=content-type:from:mime-version:subject:reply-to:x-feedback-id:to:
105
+ list-unsubscribe:list-unsubscribe-post:cc:content-type:from:subject:to;
106
+ s=s1; bh=402bS+KKQORVvr6ZanPLHNmAMqbTlH5bZOugjTDPzBI=;
107
+ b=mpwylBiyiKfsi84ETYMiEc+7/+d0xcq6K8EEa5agPNUhV2n1UEpKkQ6pZX1KIyCkevlm
108
+ xtYPKLj5jNWwCkbOtf3KC2xoHsSyiTVXVmKpFrpn9u0FdRR4S3ES5O5L1dBWupWsiHnyPB
109
+ p7vcMBcWMvnfR7GFkWn/OkhIjIO1821P0bkX4MKsKYS2ON0lo5HLzHuA2uLaGaiXRkfrMD
110
+ faAnwuaidEhyGx53vtSmvWTPVSsS+Yqz5EYgMGXa/ri1kJocSyqR7SgigHxlSX110HuoJr
111
+ oE55oG1em9moLgnGgcFV2VdmloQj/ucQA22KB19b3Mo9IJwvRemK+9ELiDo2nFGQ==
112
+ DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sendgrid.info;
113
+ h=content-type:from:mime-version:subject:reply-to:x-feedback-id:to:
114
+ list-unsubscribe:list-unsubscribe-post:cc:content-type:from:subject:to;
115
+ s=smtpapi; bh=402bS+KKQORVvr6ZanPLHNmAMqbTlH5bZOugjTDPzBI=;
116
+ b=CbxOWjDVrUf/4M8UZ2QMOVCL1VCSCnqkphXZiQUOpRLwrENj1jQWoEwe98wGJd6RAsD2
117
+ 0IwgPIiGoCoQyqXzPobQF461//B/ejEbF5PmohxHQRF99SSisYacFBD7gZmmCaihOVuy3/
118
+ eyJDkQi+kANLzHcsPNX5fqdTBHvbEtRvI=
119
+ Received: by recvd-57f48955c8-wtwpq with SMTP id recvd-57f48955c8-wtwpq-1-6696921F-5
120
+ 2024-07-16 15:30:39.032414996 +0000 UTC m=+1635574.087856678
121
+ Received: from MTQ3MDY0MTM (unknown)
122
+ by geopod-ismtpd-32 (SG) with HTTP
123
+ id nLRKq8QeRaKhRm5aC1192g
124
+ Tue, 16 Jul 2024 15:30:38.972 +0000 (UTC)
125
+ Content-Type: multipart/alternative; boundary=4c179e45d5df60b67690c9f29b72290dff4b5199e7728ab00580638ac319
126
+ Date: Tue, 16 Jul 2024 15:30:42 +0000 (UTC)
127
+ From: Hollylist <no-reply@hollylist.com>
128
+ Mime-Version: 1.0
129
+ Message-ID: <nLRKq8QeRaKhRm5aC1192g@geopod-ismtpd-32>
130
+ Subject: Hollylist Job Listings for July 16th, 2024
131
+ Reply-To: services@hollylist.com
132
+ X-Feedback-ID: 14706413:SG
133
+ X-SG-EID:
134
+ =?us-ascii?Q?u001=2EaCua71+e3WrYKjCXdqsvkfAI7NBIUfIoGzl0F2CF7AW57j75Vqx5STi=2F7?=
135
+ =?us-ascii?Q?PokOJN8oxkCLBWJeJIYn8WYrht=2FeiJ4tneETzSI?=
136
+ =?us-ascii?Q?kt4b2slAUjqbsHJc3ZGeI+EBXZ0n6GQinN2PM0N?=
137
+ =?us-ascii?Q?Yrg2EcX7eKdG3uSVlcn=2FN4reVUmzNNuOYNM8FdY?=
138
+ =?us-ascii?Q?KBvGwkeXo6yCTJS+yH6nFVgvfIsFuiZ8DaYkn6q?=
139
+ =?us-ascii?Q?vEzVtnahd9Nlsj+5GXVA3g=3D?=
140
+ X-SG-ID:
141
+ =?us-ascii?Q?u001=2EXwhBPNhCejkv4+fVosb2QVfR16Qxp9CrA7PjDe5zzeI=2F0IZCBsPXtgHbA?=
142
+ =?us-ascii?Q?oGIj+Rs6OlRm=2FcaEsw=2FcuQFYvtovQxG2Eq1SU7B?=
143
+ =?us-ascii?Q?65rZKu5ZeoNq8Ti1S9MX+R5OO9Fx46CNqEQqEQg?=
144
+ =?us-ascii?Q?2bFioe9L0aVxGhTitsdHMv38OOcadCiP9AkhhqD?=
145
+ =?us-ascii?Q?6xtvHy33jrDXyc7sh8mkRczq21re3K7oN+d+S0g?=
146
+ =?us-ascii?Q?2a2RcQkKycMXxjukKjEdLsUSlKCIzo=2FVqZD2llw?=
147
+ =?us-ascii?Q?p0BlLYl=2FqoS+fMqlzkzLatqCf=2FivAIWLE9++kqR?=
148
+ =?us-ascii?Q?CzN9yI9KFoketBEzg=2FY6wahbjuC+Uth5oYU8xgt?=
149
+ =?us-ascii?Q?Qj4Y=2FF4aam3X=2F=2FsGVRHhhuJbiIbs6oA90OhSi4F?=
150
+ =?us-ascii?Q?8fbx53wZfAD8NZEB8WXNIdtOSDJDLO0cs+EgVa6?=
151
+ =?us-ascii?Q?7bgEOCt1ZQ7ya4Xg=2FC47Tpe8V0JyRfI5Cg+VehZ?=
152
+ =?us-ascii?Q?7MRDtl6Gh0cMmWH6CYONh6y3TmoRo4lKtyPMvUm?=
153
+ =?us-ascii?Q?gHJ+QquHu=2F08hZIdPn29sSfAKuAqWE58qcd4jWQ?=
154
+ =?us-ascii?Q?3pFvREEgasLAm0O9XTw2KiwUQPzOPU4llBryZW3?=
155
+ =?us-ascii?Q?8149YgU0D6dVdjfq6ltk28W4MiIxi7Zeut=2F1iiu?=
156
+ =?us-ascii?Q?i55xXrG01NfyevknYRechf57gJ4JGG6uofZTq5U?=
157
+ =?us-ascii?Q?ho=2FFpNeFkwGi153gjy3NbBpgl9lv2P6bJ3JjctP?=
158
+ =?us-ascii?Q?XqOyUlMqIOkBgBTFaSMnJ9fEhOC55wWDqYHZJ5C?=
159
+ =?us-ascii?Q?BIobEVcP5eWn48frMNWllNcPTYs=3D?=
87
160
  To: ackava@gmail.com
88
- From: redBus <greetings@travel.e-redbus.in>
89
- Reply-To: redBus <greetings@travel.e-redbus.in>
90
- Subject: =?UTF-8?Q?Ackava,_don=E2=80=99t_forget_to_carry_these!_=F0=9F=91=87?=
91
- Message-ID: <39017788139262872@travel.e-redbus.in>
92
- List-Unsubscribe-Post: List-Unsubscribe=One-Click
93
- List-Unsubscribe: <https://unsub-cee.netcorecloud.net/vtrack?ul=VwBUBlcPBFBPBkVXVVsEQQQhBF1VCAkXWgldGEU=&ml=Vw1TAFMHA1FPB0UDAAdTBRk=&sl=JkUpczBLZjFPZHRiSlUJXgsKTURGABNcVUhVSUtWBVpFRxhaWE0F&clientid=69014&c=000>, <mailto:uns-traveleredbus-69014-34506003-39262872-23a8f2ee270dab95dbfc8233939fab03@travel.e-redbus.in?subject=Unsubscribe>
94
- X-Mailer: NetcoreCloud Mailer
95
- X-Abuse-Reports-To: abuse@netcorecloud.com
96
- X-STO: 1
97
- X-Mta-Source: traveleredbus_69014
98
- X-Mta-Priority: 2
99
- Feedback-ID: 34506:69014:20240714150331:nczc
100
- MIME-Version: 1.0
101
- Content-Type: multipart/alternative;
102
- boundary="b1_f929807e96bcd3dfeb5a7c20e8243f65"`;
161
+ X-Entity-ID: u001.N5cBvza1ZrdFMHL5Qg+Wwg==
162
+ List-Unsubscribe:
163
+ =?us-ascii?Q?=3Cmailto=3Aunsubscribe=40em5661=2Ehollylist=2Ecom=3Fsubject=3D14706413=2EPN97?=
164
+ =?us-ascii?Q?5r59ipx7U=5FR6qiD5kd2e2aNZ7EnRSalVAsvsymp?=
165
+ =?us-ascii?Q?oMDAwdTAwMOVGIs8Z08WWNBrm4=5FvH0=5FcyQQiRlj?=
166
+ =?us-ascii?Q?2Fsy32EsKJKugRz23SkTWQNw7pbIz24q2uTkhnN?=
167
+ =?us-ascii?Q?QaqeAyFvS8noYgNuJYBY5i1o4AKjV5i3hSiXaeL?=
168
+ =?us-ascii?Q?=2Ef6-Z-cV1Iicc5IjRXRKVjA5yEE-kVb4NbMa7He?=
169
+ =?us-ascii?Q?hByT9oMDAwdTAwMPbJ0-wHj7rP6hR3CUw3Z3tjR?=
170
+ =?us-ascii?Q?t7Cg5tOSxwpOP3UUg0vNHwva1w7u3ucnBMU5=5FJP?=
171
+ =?us-ascii?Q?ulVCf1wX7KUYepn7fevTlxuZeLVbzVo6-G0nW5Q?=
172
+ =?us-ascii?Q?UYwE2GFF3ERbQ4IYiraqUFH8x4Gpy-x65kpUuH2?=
173
+ =?us-ascii?Q?UdFBL4M7kFmnVc1CJefdqojcsomeKK00fwN12ze?=
174
+ =?us-ascii?Q?UVvyhE0pTCy31LcJVDWka6LJ2TffcYCuuWXwNuk?=
175
+ =?us-ascii?Q?KzUjEJ1We5pTNZcpFGmiIv9GaHs=5FN5T2ZrGti9k?=
176
+ =?us-ascii?Q?e0m0FIomBvfh2YzWzN2qFG8aH5ICnnLuEE8-LDt?=
177
+ =?us-ascii?Q?6W-FuQD3BwYVyCb5Pf5InyLan2--nwzUjiiEq2W?=
178
+ =?us-ascii?Q?B-jKm4eErnzLmYTUfriQBZtJcDD=5FM61Kpv0eYuu?=
179
+ =?us-ascii?Q?UICUEts9jAKFtu5QiU1WMclUEraTO6KNXrDPS=5FY?=
180
+ =?us-ascii?Q?TLSI9eVXnOJcNhmoSTWyIvIxWyhwnNOJRnh=5FIuT?=
181
+ =?us-ascii?Q?UnBrjP=5F1ZdQO7Me0v97Y6BfuLaPej5WRCI7OQLV?=
182
+ =?us-ascii?Q?KLEVKyxbz8wC2UMopCGPZdfOEdhsFsVfyY-vaUB?=
183
+ =?us-ascii?Q?RQVVBIIcuVimP3ql73aWwTUxVvTa=5FJKf9YTGFQF?=
184
+ =?us-ascii?Q?-J8h=5FMBK0ERbCfoNXaDbbHJD38OaIS5VsRr39y4?=
185
+ =?us-ascii?Q?cXrE26C6LyzDZibOF4IfIBsQX61RVhvgV68VViv?=
186
+ =?us-ascii?Q?8zlxjSe57-JVxV57MvP3YOmpuXxl0qmvAYdRxL4?=
187
+ =?us-ascii?Q?9fDqzTnRMZLaTuGAexmaSO5cnOWRZNbu8f-gDm9?=
188
+ =?us-ascii?Q?EUv2zuedsgEM9cexNzXtwsFJZ5jVXTfe13ziWW7?=
189
+ =?us-ascii?Q?PeX4yFyUdqGEl6Sf2YwasNKTcmRaUkzrLxpLX5N?=
190
+ =?us-ascii?Q?C5nWG9MgFmnYkMhb57I8ufh8YS2tIUVMnhFZw2y?=
191
+ =?us-ascii?Q?oWFi380Zh=5F8Oh8zSj8H3Ts-1DTQiLsP3KTy1W-g?=
192
+ =?us-ascii?Q?eFWOJR0y3eRtA6ALtg3C75c8rXCnLrrHguMs=3D&b?=
193
+ =?us-ascii?Q?ody=3D14706413=2EPN975r59ipx7U=5FR6qiD5kd2e2a?=
194
+ =?us-ascii?Q?NZ7EnRSalVAsvsympoMDAwdTAwMOVGIs8Z08WWN?=
195
+ =?us-ascii?Q?Brm4=5FvH0=5FcyQQiRlj2Fsy32EsKJKugRz23SkTWQ?=
196
+ =?us-ascii?Q?Nw7pbIz24q2uTkhnNQaqeAyFvS8noYgNuJYBY5i?=
197
+ =?us-ascii?Q?1o4AKjV5i3hSiXaeL=2Ef6-Z-cV1Iicc5IjRXRKVj?=
198
+ =?us-ascii?Q?A5yEE-kVb4NbMa7HehByT9oMDAwdTAwMPbJ0-wH?=
199
+ =?us-ascii?Q?j7rP6hR3CUw3Z3tjRt7Cg5tOSxwpOP3UUg0vNHw?=
200
+ =?us-ascii?Q?va1w7u3ucnBMU5=5FJPulVCf1wX7KUYepn7fevTlx?=
201
+ =?us-ascii?Q?uZeLVbzVo6-G0nW5QUYwE2GFF3ERbQ4IYiraqUF?=
202
+ =?us-ascii?Q?H8x4Gpy-x65kpUuH2UdFBL4M7kFmnVc1CJefdqo?=
203
+ =?us-ascii?Q?jcsomeKK00fwN12zeUVvyhE0pTCy31LcJVDWka6?=
204
+ =?us-ascii?Q?LJ2TffcYCuuWXwNukKzUjEJ1We5pTNZcpFGmiIv?=
205
+ =?us-ascii?Q?9GaHs=5FN5T2ZrGti9ke0m0FIomBvfh2YzWzN2qFG?=
206
+ =?us-ascii?Q?8aH5ICnnLuEE8-LDt6W-FuQD3BwYVyCb5Pf5Iny?=
207
+ =?us-ascii?Q?Lan2--nwzUjiiEq2WB-jKm4eErnzLmYTUfriQBZ?=
208
+ =?us-ascii?Q?tJcDD=5FM61Kpv0eYuuUICUEts9jAKFtu5QiU1WMc?=
209
+ =?us-ascii?Q?lUEraTO6KNXrDPS=5FYTLSI9eVXnOJcNhmoSTWyIv?=
210
+ =?us-ascii?Q?IxWyhwnNOJRnh=5FIuTUnBrjP=5F1ZdQO7Me0v97Y6B?=
211
+ =?us-ascii?Q?fuLaPej5WRCI7OQLVKLEVKyxbz8wC2UMopCGPZd?=
212
+ =?us-ascii?Q?fOEdhsFsVfyY-vaUBRQVVBIIcuVimP3ql73aWwT?=
213
+ =?us-ascii?Q?UxVvTa=5FJKf9YTGFQF-J8h=5FMBK0ERbCfoNXaDbbH?=
214
+ =?us-ascii?Q?JD38OaIS5VsRr39y4cXrE26C6LyzDZibOF4IfIB?=
215
+ =?us-ascii?Q?sQX61RVhvgV68VViv8zlxjSe57-JVxV57MvP3YO?=
216
+ =?us-ascii?Q?mpuXxl0qmvAYdRxL49fDqzTnRMZLaTuGAexmaSO?=
217
+ =?us-ascii?Q?5cnOWRZNbu8f-gDm9EUv2zuedsgEM9cexNzXtws?=
218
+ =?us-ascii?Q?FJZ5jVXTfe13ziWW7PeX4yFyUdqGEl6Sf2YwasN?=
219
+ =?us-ascii?Q?KTcmRaUkzrLxpLX5NC5nWG9MgFmnYkMhb57I8uf?=
220
+ =?us-ascii?Q?h8YS2tIUVMnhFZw2yoWFi380Zh=5F8Oh8zSj8H3Ts?=
221
+ =?us-ascii?Q?-1DTQiLsP3KTy1W-geFWOJR0y3eRtA6ALtg3C75?=
222
+ =?us-ascii?Q?c8rXCnLrrHguMs=3D=3E=2C=3Chttps=3A=2F=2Fu14706413=2Ect=2E?=
223
+ =?us-ascii?Q?sendgrid=2Enet=2Flu=2Funsubscribe=3Foc=3Du001=2E5oK?=
224
+ =?us-ascii?Q?KCNHzcJi3sYQZinN1t1wdRtRIdXOxXawakRElTu?=
225
+ =?us-ascii?Q?FnPu-c45-Y4Skp5FOWMjvZMLoP=5F-XZ0sUVANKQF?=
226
+ =?us-ascii?Q?LZVRRAWQG2bKbKGCxV3mLHWejIrjMvuRybHWWSh?=
227
+ =?us-ascii?Q?IAE31UCrcq1i5SvfjLrfwc7EMJoktuA4H1BRUq4?=
228
+ =?us-ascii?Q?fz2sBgfnP2w-LrbV26YAbldXbI09eTOu3zaOTiO?=
229
+ =?us-ascii?Q?eIwhAremCzt7sUbhdnMj4KHvcm9zrZJIzjqs4Ov?=
230
+ =?us-ascii?Q?p92esVAT77hpX3A6FLwjvXYWM7xkkwjfL091xCN?=
231
+ =?us-ascii?Q?2DxpKCUU9k24WCLLtu3BC081InszbqUr4f8Tzjo?=
232
+ =?us-ascii?Q?vu1GEPZ1XxUC2abUge4iYNa8duh1ljTGcxiEHyI?=
233
+ =?us-ascii?Q?6PvCiM=5FocnvND7bgkceeHmPID=5Fm8lnrfgvpQbuO?=
234
+ =?us-ascii?Q?fpDibs7qtnq1AAYJYMesCEYFVYZT7tCh6FSenSC?=
235
+ =?us-ascii?Q?Tx6rAYSO3ogB-sQ6WmbosQGJs8mj-cKQ1oHiHlh?=
236
+ =?us-ascii?Q?FGtSfmdXOirdGwEctQLewyFI04Um1kJsUTRpHzp?=
237
+ =?us-ascii?Q?J1AH0cvZnTUtT7Q9iuMlbDfLgcWIAFP=5F5713dga?=
238
+ =?us-ascii?Q?SFw4HfDZQOwVJ9Apt-cEuSg3yCMmrXpHou8kuXO?=
239
+ =?us-ascii?Q?PXCYpyWRSzN9qw3sZp77wKiRMn6tQRUB24yIkJo?=
240
+ =?us-ascii?Q?bcyJMsn9x-Zo2PUGLSziizeuovpbzVNbee-Ew5R?=
241
+ =?us-ascii?Q?EichZZiaXoyt0RXtNfzRFc=5FjEyKqZ06KCAj8hm0?=
242
+ =?us-ascii?Q?HVN2KsOzu3fu58GfWvDjk2pbUpCg85BoenBmPDr?=
243
+ =?us-ascii?Q?zq=5FDWZdYOeyJT3retAJc22qRezI=5FmQ-dhJ02AQY?=
244
+ =?us-ascii?Q?oAV0foHywrEc-w1icZ38SG=5FuZu4=5FsX5pgkmpKBH?=
245
+ =?us-ascii?Q?=5FMwBxYkdESjbZh7cCXyWUd0kiHf6YglJgrrLwkC?=
246
+ =?us-ascii?Q?SZcX1an4jffonHjgGYMmdc=5FUsklNb1iNpjIRJDW?=
247
+ =?us-ascii?Q?UJ37t-hd2DdGd5LV3fYXn2myezMbUmT16uMLXMQ?=
248
+ =?us-ascii?Q?EgcjBc6a8=5Fj5SbOgJu59C6l-zbdcUewAt-5XeJu?=
249
+ =?us-ascii?Q?LluseHNd1=5Fvq5NR95Q-LRKGkGzAFydHMDuoIdGa?=
250
+ =?us-ascii?Q?psOIDqLrAmkfT=5FoxUqb7zLKKKiU9iOUrVCJ7UW3?=
251
+ =?us-ascii?Q?nhGzRxQBy8xU8otZeAW5gJ21rDiV1t0gM=5FxZYD5?=
252
+ =?us-ascii?Q?=5F6nXxDSIqKBkz8e1D1shMqGuAx3Qw4CgXGFS0k8?=
253
+ =?us-ascii?Q?pH49VGpRLAo-XS2O3r8dZxVUJB87PxpmNFQzEL0?=
254
+ =?us-ascii?Q?iN=5FymtMYS0lp3RjIM2BZja6UEAs5ODVKFZqyvZL?=
255
+ =?us-ascii?Q?Buehl06xC3J5A3zyK6GJ3FAY=5Fe9-ePHsiDMAu6-?=
256
+ =?us-ascii?Q?yjGugXS25wXkGZhTMsmAd3yj1claQ95r7iDWOXj?=
257
+ =?us-ascii?Q?7u7y5Y7SdFDYyaJ0YGcrS5XawOaZWift2NirISJ?=
258
+ =?us-ascii?Q?7L9gGhAiko6RqnJTn9BJuD2riWyfaFyeIqhI5Zo?=
259
+ =?us-ascii?Q?3iVEMb6ocZRidzyRSMkcEc=5FBwYn1IcS9pIWa9FY?=
260
+ =?us-ascii?Q?SUMDa4rythE3feqa9x6wGOxtTTJTj88Bc-pE5Ui?=
261
+ =?us-ascii?Q?WexasEvL8Lkxde=5FoYZU=5FX6tcNdqdRGQb1o9VeYL?=
262
+ =?us-ascii?Q?39UKp=5FAAQW2Lf3ug8NTh0nKj2ZvbpVcmZOmYBli?=
263
+ =?us-ascii?Q?ckO2PVdT-AK-DF50c2tiRSbLsPPUh1v1HCpjir3?=
264
+ =?us-ascii?Q?2ID=5FWwvUFZh9zF5CuQKP68Z3t5sLAV8fej-aX8K?=
265
+ =?us-ascii?Q?RBNuAmhR468nZlCDooVqJrd6La4h8KM360Fs4Y6?= =?us-ascii?Q?EY=3E?=
266
+ List-Unsubscribe-Post: List-Unsubscribe=One-Click`;
@@ -0,0 +1,63 @@
1
+ import Inject from "@entity-access/entity-access/dist/di/di.js";
2
+ import { Prepare } from "@entity-access/server-pages/dist/decorators/Prepare.js";
3
+ import Page from "@entity-access/server-pages/dist/Page.js";
4
+ import { MimeMessage, LineStream } from "@social-mail/shared/index.js";
5
+ import SocialMailContext from "../../../../../server/model/SocialMailContext.js";
6
+ import EmailLogService from "../../../../../server/services/email-logs/EmailLogService.js";
7
+ import { JSDOM } from 'jsdom';
8
+
9
+ @Prepare.authorize
10
+ export default class extends Page {
11
+
12
+ @Inject
13
+ db: SocialMailContext;
14
+
15
+ @Inject
16
+ private els: EmailLogService;
17
+
18
+
19
+ async run() {
20
+
21
+ const [emailID, ... link] = this.childPath as any[];
22
+
23
+ const email = await this.db.emails
24
+ .filtered("read")
25
+ .where({ emailID }, (p) => (x) => x.emailID === p.emailID)
26
+ .include((x) => x.mimeFile)
27
+ .first();
28
+
29
+ this.cacheControl = "public, max-age=2592000, immutable";
30
+
31
+ const file = await this.els.load(email.mimeFile);
32
+
33
+ const root = MimeMessage.load( new (class extends LineStream {
34
+ lines() {
35
+ return file.lines();
36
+ }
37
+ })());
38
+
39
+ const html = root.html;
40
+
41
+ const { window: { document } } = new JSDOM(html);
42
+
43
+ const links = Array.from(document.links);
44
+
45
+ const q = this.request.URL.search;
46
+ const url = `//${link.join("/")}${q}`;
47
+
48
+ const ae = links.find((x) => x.href.endsWith(url));
49
+
50
+ const rs = await fetch(ae.href);
51
+ const status = rs.status;
52
+ const headers = {};
53
+ for (const [key, value] of rs.headers.entries()) {
54
+ headers[key] = value;
55
+ }
56
+ const body = Buffer.from(await rs.arrayBuffer());
57
+ return this.content({
58
+ body,
59
+ headers,
60
+ status
61
+ });
62
+ }
63
+ }