@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.
- package/dist/server/seed/ui/seed-ui.js +1 -1
- package/dist/tests/protocols/parsers/email-parser.test.d.ts.map +1 -1
- package/dist/tests/protocols/parsers/email-parser.test.js +240 -81
- package/dist/tests/protocols/parsers/email-parser.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/wwwroot/routes/api/emails/d/get.d.ts +8 -0
- package/dist/wwwroot/routes/api/emails/d/get.d.ts.map +1 -0
- package/dist/wwwroot/routes/api/emails/d/get.js +64 -0
- package/dist/wwwroot/routes/api/emails/d/get.js.map +1 -0
- package/dist/wwwroot/routes/api/emails/unsubscribe/post.d.ts +8 -0
- package/dist/wwwroot/routes/api/emails/unsubscribe/post.d.ts.map +1 -0
- package/dist/wwwroot/routes/api/emails/unsubscribe/post.js +73 -0
- package/dist/wwwroot/routes/api/emails/unsubscribe/post.js.map +1 -0
- package/package.json +3 -2
- package/src/server/seed/ui/seed-ui.ts +1 -1
- package/src/tests/protocols/parsers/email-parser.test.ts +244 -80
- package/src/wwwroot/routes/api/emails/d/get.ts +63 -0
- package/src/wwwroot/routes/api/emails/unsubscribe/post.tsx +73 -0
|
@@ -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.
|
|
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.
|
|
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",
|
|
@@ -1,102 +1,266 @@
|
|
|
1
1
|
import assert from "assert";
|
|
2
|
-
import {
|
|
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
|
-
|
|
6
|
+
class FileLineStream extends LineStream {
|
|
7
|
+
|
|
8
|
+
constructor(private file: LocalFile) {
|
|
9
|
+
super();
|
|
10
|
+
}
|
|
5
11
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
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
|
-
|
|
24
|
+
const index = buffer.indexOf("\n", start);
|
|
25
|
+
if (index === -1) {
|
|
26
|
+
line += buffer.toString("utf8", start);
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
17
29
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
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:
|
|
30
|
-
|
|
31
|
-
X-Google-Smtp-Source: AGHT+
|
|
32
|
-
X-Received: by 2002:
|
|
33
|
-
|
|
34
|
-
ARC-Seal: i=1; a=rsa-sha256; t=
|
|
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=
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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=
|
|
44
|
-
:message-id:
|
|
45
|
-
|
|
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=
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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=@
|
|
57
|
-
dkim=pass header.i=@
|
|
58
|
-
spf=pass (google.com: domain of
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
66
|
-
Received-SPF: pass (google.com: domain of
|
|
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=@
|
|
69
|
-
dkim=pass header.i=@
|
|
70
|
-
spf=pass (google.com: domain of
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
c=relaxed/relaxed; d=
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
+
}
|