postal-mime 2.1.0 → 2.1.1-patch.1
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/CHANGELOG.md +7 -0
- package/README.md +3 -127
- package/package.json +5 -4
- package/postal-mime.d.ts +2 -2
- package/src/postal-mime.js +6 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.1.1](https://github.com/postalsys/postal-mime/compare/v2.1.0...v2.1.1) (2024-02-26)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **types:** Updated types for PostalMime ([bc90f6d](https://github.com/postalsys/postal-mime/commit/bc90f6d5b7d3e2475cece77bb094caf421dead97))
|
|
9
|
+
|
|
3
10
|
## [2.1.0](https://github.com/postalsys/postal-mime/compare/v2.0.2...v2.1.0) (2024-02-22)
|
|
4
11
|
|
|
5
12
|
|
package/README.md
CHANGED
|
@@ -1,130 +1,6 @@
|
|
|
1
1
|
# postal-mime
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
`postal-mime` is now `@postalsys/mime`
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## Source
|
|
8
|
-
|
|
9
|
-
Source code is available from [Github](https://github.com/postalsys/postal-mime).
|
|
10
|
-
|
|
11
|
-
## Demo
|
|
12
|
-
|
|
13
|
-
See this [example](https://kreata.ee/postal-mime/example/).
|
|
14
|
-
|
|
15
|
-
## Usage
|
|
16
|
-
|
|
17
|
-
First install the module from npm:
|
|
18
|
-
|
|
19
|
-
```
|
|
20
|
-
$ npm install postal-mime
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
next import the PostalMime class into your script:
|
|
24
|
-
|
|
25
|
-
```js
|
|
26
|
-
import PostalMime from './node_modules/postal-mime/src/postal-mime.js';
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
or when using from a Node.js app
|
|
30
|
-
|
|
31
|
-
```js
|
|
32
|
-
import PostalMime from 'postal-mime';
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### Promises
|
|
36
|
-
|
|
37
|
-
All postal-mime methods use Promises, so you need to wait using `await` or wait for the `then()` method to fire until you get the response.
|
|
38
|
-
|
|
39
|
-
#### Browser
|
|
40
|
-
|
|
41
|
-
```js
|
|
42
|
-
import PostalMime from './node_modules/postal-mime/src/postal-mime.js';
|
|
43
|
-
|
|
44
|
-
const parser = new PostalMime();
|
|
45
|
-
const email = await parser.parse(`Subject: My awesome email 🤓
|
|
46
|
-
Content-Type: text/html; charset=utf-8
|
|
47
|
-
|
|
48
|
-
<p>Hello world 😵💫</p>`);
|
|
49
|
-
|
|
50
|
-
console.log(email.subject);
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
#### Node.js
|
|
54
|
-
|
|
55
|
-
It is pretty much the same as in the browser.
|
|
56
|
-
|
|
57
|
-
```js
|
|
58
|
-
import PostalMime from 'postal-mime';
|
|
59
|
-
import util from 'node:util';
|
|
60
|
-
|
|
61
|
-
const parser = new PostalMime();
|
|
62
|
-
const email = await parser.parse(`Subject: My awesome email 🤓
|
|
63
|
-
Content-Type: text/html; charset=utf-8
|
|
64
|
-
|
|
65
|
-
<p>Hello world 😵💫</p>`);
|
|
66
|
-
|
|
67
|
-
console.log(util.inspect(email, false, 22, true));
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
#### Cloudflare [Email Workers](https://developers.cloudflare.com/email-routing/email-workers/)
|
|
71
|
-
|
|
72
|
-
Pretty much the same as in Node.js. Use `message.raw` as the raw message for parsing.
|
|
73
|
-
|
|
74
|
-
```js
|
|
75
|
-
import PostalMime from 'postal-mime';
|
|
76
|
-
|
|
77
|
-
export default {
|
|
78
|
-
async email(message, env, ctx) {
|
|
79
|
-
const parser = new PostalMime();
|
|
80
|
-
const email = await parser.parse(message.raw);
|
|
81
|
-
|
|
82
|
-
console.log('Subject: ', email.subject);
|
|
83
|
-
console.log('HTML: ', email.html);
|
|
84
|
-
console.log('Text: ', email.text);
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
#### parser.parse()
|
|
90
|
-
|
|
91
|
-
```js
|
|
92
|
-
parser.parse(email) -> Promise
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
Where
|
|
96
|
-
|
|
97
|
-
- **email** is the rfc822 formatted email. Either a string, an ArrayBuffer, a Blob object or a Node.js Buffer
|
|
98
|
-
|
|
99
|
-
> **NB** you can call `parse()` only once. If you need to parse another message, create a new _PostalMime_ object.
|
|
100
|
-
|
|
101
|
-
This method parses an email message into a structured object with the following properties:
|
|
102
|
-
|
|
103
|
-
- **headers** is an array of headers in the same order as found from the message (topmost headers first).
|
|
104
|
-
- **headers[].key** is lowercase key of the header line, eg. `"dkim-signature"`
|
|
105
|
-
- **headers[].value** is the unprocessed value of the header line
|
|
106
|
-
- **from**, **sender**, **replyTo** includes a processed object for the corresponding headers
|
|
107
|
-
- **from.name** is decoded name (empty string if not set)
|
|
108
|
-
- **from.address** is the email address
|
|
109
|
-
- **deliveredTo**, **returnPath** is the email address from the corresponding header
|
|
110
|
-
- **to**, **cc**, **bcc** includes an array of processed objects for the corresponding headers
|
|
111
|
-
- **to[].name** is decoded name (empty string if not set)
|
|
112
|
-
- **to[].address** is the email address
|
|
113
|
-
- **subject** is the email subject line
|
|
114
|
-
- **messageId**, **inReplyTo**, **references** includes the value as found from the corresponding header without any processing
|
|
115
|
-
- **date** is the email sending time formatted as an ISO date string (unless parsing failed and in this case the original value is used)
|
|
116
|
-
- **html** is the HTML content of the message as a string
|
|
117
|
-
- **text** is the plaintext content of the message as a string
|
|
118
|
-
- **attachments** is an array that includes message attachments
|
|
119
|
-
- **attachment[].filename** is the file name if provided
|
|
120
|
-
- **attachment[].mimeType** is the MIME type of the attachment
|
|
121
|
-
- **attachment[].disposition** is either "attachment", "inline" or `null` if disposition was not provided
|
|
122
|
-
- **attachment[].related** is a boolean value that indicats if this attachment should be treated as embedded image
|
|
123
|
-
- **attachment[].contentId** is the ID from Content-ID header
|
|
124
|
-
- **attachment[].content** is an ArrayBuffer that contains the attachment file
|
|
125
|
-
|
|
126
|
-
## License
|
|
127
|
-
|
|
128
|
-
© 2021-2023 Andris Reinman
|
|
129
|
-
|
|
130
|
-
`postal-mime` is licensed under the **MIT No Attribution license**
|
|
5
|
+
- @postalsys/mime in [Github](https://github.com/postalsys/mime)
|
|
6
|
+
- @postalsys/mime in [NPM](https://www.npmjs.com/package/@postalsys/mime)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "postal-mime",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.1-patch.1",
|
|
4
4
|
"description": "Email parser for browser environments",
|
|
5
5
|
"main": "./src/postal-mime.js",
|
|
6
6
|
"exports": {
|
|
@@ -27,10 +27,11 @@
|
|
|
27
27
|
"author": "Andris Reinman",
|
|
28
28
|
"license": "MIT-0",
|
|
29
29
|
"devDependencies": {
|
|
30
|
+
"@types/node": "20.11.20",
|
|
30
31
|
"cross-blob": "3.0.2",
|
|
31
|
-
"
|
|
32
|
+
"cross-env": "7.0.3",
|
|
33
|
+
"eslint": "8.57.0",
|
|
32
34
|
"eslint-cli": "1.1.1",
|
|
33
|
-
"iframe-resizer": "4.3.9"
|
|
34
|
-
"cross-env": "7.0.3"
|
|
35
|
+
"iframe-resizer": "4.3.9"
|
|
35
36
|
}
|
|
36
37
|
}
|
package/postal-mime.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type RawEmail = string | ArrayBuffer | Blob | Buffer;
|
|
1
|
+
export type RawEmail = string | ArrayBuffer | Uint8Array | Blob | Buffer | ReadableStream;
|
|
2
2
|
|
|
3
3
|
export type Header = Record<string, string>;
|
|
4
4
|
|
|
@@ -13,7 +13,7 @@ export type Attachment = {
|
|
|
13
13
|
disposition: "attachment" | "inline" | null;
|
|
14
14
|
related?: boolean;
|
|
15
15
|
contentId?: string;
|
|
16
|
-
content:
|
|
16
|
+
content: Uint8Array;
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
export type Email = {
|
package/src/postal-mime.js
CHANGED
|
@@ -317,30 +317,31 @@ export default class PostalMime {
|
|
|
317
317
|
}
|
|
318
318
|
this.started = true;
|
|
319
319
|
|
|
320
|
-
//
|
|
320
|
+
// Check if the input is a readable stream and resolve it into an ArrayBuffer
|
|
321
321
|
if (buf && typeof buf.getReader === 'function') {
|
|
322
322
|
buf = await this.resolveStream(buf);
|
|
323
323
|
}
|
|
324
324
|
|
|
325
|
-
//
|
|
325
|
+
// Should it throw for an empty value instead of defaulting to an empty ArrayBuffer?
|
|
326
326
|
buf = buf || ArrayBuffer(0);
|
|
327
327
|
|
|
328
|
+
// Cast string input to Uint8Array
|
|
328
329
|
if (typeof buf === 'string') {
|
|
329
|
-
// cast string input to ArrayBuffer
|
|
330
330
|
buf = textEncoder.encode(buf);
|
|
331
331
|
}
|
|
332
332
|
|
|
333
|
+
// Cast Blob to ArrayBuffer
|
|
333
334
|
if (buf instanceof Blob || Object.prototype.toString.call(buf) === '[object Blob]') {
|
|
334
|
-
// can't process blob directly, cast to ArrayBuffer
|
|
335
335
|
buf = await blobToArrayBuffer(buf);
|
|
336
336
|
}
|
|
337
337
|
|
|
338
|
+
// Cast Node.js Buffer object or Uint8Array into ArrayBuffer
|
|
338
339
|
if (buf.buffer instanceof ArrayBuffer) {
|
|
339
|
-
// Node.js Buffer object or Uint8Array
|
|
340
340
|
buf = new Uint8Array(buf).buffer;
|
|
341
341
|
}
|
|
342
342
|
|
|
343
343
|
this.buf = buf;
|
|
344
|
+
|
|
344
345
|
this.av = new Uint8Array(buf);
|
|
345
346
|
this.readPos = 0;
|
|
346
347
|
|