go-pst is a library for reading PST files (written in Go/Golang).


go-pst
go-pst

A library for reading PST files (written in Go/Golang).


Introduction

go-pst is a library for reading PST files (written in Go/Golang).

The PFF (Personal Folder File) and OFF (Offline Folder File) format is used to store Microsoft Outlook e-mails, appointments and contacts. The PST (Personal Storage Table), OST (Offline Storage Table) and PAB (Personal Address Book) file format consist of the PFF format.

References

Documentation

Libraries

Datasets

This library is tested on the following datasets:

Implementation

This implementation is based on the references.
The source code of go-pst will reference this implementation.

File Header

Offset Size Value Description
0 4 "\x21\x42\x44\x4e" (!BDN) The signature (magic identifier).
8 2 The content type (client signature). See Content Types.
10 2 The data version (NDB version). NDB is short for node database. See Format Types.

Content Types

Value Description
"\x53\x4d" (SM) Used for PST files
"\x53\x4d" (SO) Used for OST files
"\x41\x42" (AB) Used for PAB files

Format Types

Value Description
14 32-bit ANSI format
15 32-bit ANSI format
21 64-bit Unicode format (by Visual Recovery)
23 64-bit Unicode format
36 64-bit Unicode format with 4k

The 64-bit header data

Offset Size Description
224 8 The node b-tree file offset.
240 8 The block b-tree file offset.
513 1 Encryption type. See Encryption Types.

The 32-bit header data

Offset Size Description
188 4 The node b-tree file offset.
196 4 The block b-tree file offset.
461 1 Encryption type. See Encryption Types.

Encryption Types

Value Identifier Description
0x00 NDB_CRYPT_NONE No encryption.
0x01 NDB_CRYPT_PERMUTE Compressible encryption.
0x02 NDB_CRYPT_CYCLIC High encryption.

The node and block b-tree

The following offsets start from the (node/block) b-tree offset.

64-bit

Offset Size Description
0 488 B-tree node entries (number of entries x entry size).
488 1 The number of entries.
490 1 The size of an entry.
491 1 B-tree node level. A zero value represents a leaf node. A value greater than zero represents a branch node, with the highest level representing the root.

64-bit 4k

Offset Size Description
0 4056 B-tree node entries (number of entries x entry size).
4056 2 The number of entries.
4060 1 The size of an entry.
4061 1 B-tree node level. A zero value represents a leaf node. A value greater than zero represents a branch node, with the highest level representing the root.

32-bit

Offset Size Description
0 496 B-tree node entries (number of entries x entry size).
496 1 The number of entries.
498 1 The size of an entry.
499 1 B-tree node level. A zero value represents a leaf node. A value greater than zero represents a branch node, with the highest level representing the root.

The b-tree entries

The 64-bit block b-tree branch node entry

Offset Size Description
0 8 The identifier of the first child node. 32-bit integer.
16 8 The file offset, points to a block b-tree branch or leaf node entry.

The 64-bit block b-tree leaf node entry

Offset Size Description
0 8 The identifier. 32-bit integer.
8 8 The file offset, points to a Heap-on-Node.
16 2 The size of the Heap-on-Node.

The 64-bit node b-tree leaf node entry

Offset Size Description
0 8 The identifier. 32-bit integer.
8 8 The node identifier of the data. This node identifier is found in the block b-tree.
16 8 The node identifier of the local descriptors. This node identifier is found in the block b-tree.

The 32-bit block b-tree branch node entry

Offset Size Description
0 4 The identifier of the first child node. 32-bit integer.
8 4 The file offset, points to a block b-tree branch or leaf node entry.

The 32-bit block b-tree leaf node entry

Offset Size Description
0 4 The identifier. 32-bit integer.
4 4 The file offset, points to a Heap-on-Node.
8 2 The size of the Heap-on-Node.

The 32-bit node b-tree leaf node entry

Offset Size Description
0 4 The identifier. 32-bit integer.
4 4 The node identifier of the data. This node identifier is found in the block b-tree.
8 4 The node identifier of the local descriptors. This node identifier is found in the block b-tree.

Identifier

The 32-bit integer (identifier) can be used to search for b-tree nodes.

Offset Size Description
0 5 bits The identifier type.

Identifier types

Value Identifier Description
0 HID Table value (or heap node)
1 INTERNAL Internal node
2 NORMAL_FOLDER Folder item
3 SEARCH_FOLDER Search folder item
4 NORMAL_MESSAGE Message item
5 ATTACHMENT Attachment item
6 SEARCH_UPDATE_QUEUE Queue of changed search folder items
7 SEARCH_CRITERIA_OBJECT Search folder criteria
8 ASSOCIATED_MESSAGE Associated contents item
10 CONTENTS_TABLE_INDEX Unknown
11 RECEIVE_FOLDER_TABLE Inbox item (or received folder table)
12 OUTGOING_QUEUE_TABLE Outbox item (or outgoing queue table)
13 HIERARCHY_TABLE Sub folders item (or hierarchy table)
14 CONTENTS_TABLE Sub messages items (or contents table)
15 ASSOCIATED_CONTENTS_TABLE Sub associated contents item (or associated contents table)
16 SEARCH_CONTENTS_TABLE Search contents table
17 ATTACHMENT_TABLE Attachments item
18 RECIPIENT_TABLE Recipients items
19 SEARCH_TABLE_INDEX Unknown
20 Unknown
21 Unknown
22 Unknown
23 Unknown
24 Unknown
31 LTP Local descriptor value

Heap-on-Node

If the encryption type was set in the file header, the entire Heap-on-Node is encrypted.

Compressible encryption

Compressible encryption is a simple byte-substitution cipher with a fixed substitution table.

Heap-on-Node HID

Offset Size Description
0 5 bits HID Type; MUST be set to 0 (IdentifierTypeHID) to indicate a valid HID.
0.5 11 bits HID index. The index value that identifies an item allocated in the allocation table.
2.0 16 bits This number indicates the index of the data block in which this heap item resides.

Heap-on-Node header

The first block contains the Heap-on-Node header.

Offset Size Description
0 2 The offset to the Heap-on-Node page map.
2 1 Block signature; MUST be set to 0xEC (236) to indicate a Heap-on-Node.
3 1 The table type.
4 4 HID User Root.

Heap-on-Node bitmap header

Blocks 8, 136, then every 128th contains the Heap-on-Node bitmap header (i == 8 || i >= 138 && (i - 8) / 128 == 0).

Offset Size Description
0 2 The offset to the Heap-on-Node page map (starting at the Heap-on-Node page header).

Heap-on-Node page header

This is only used when multiple Heap-on-Node blocks are present.

Offset Size Description
0 2 The offset to the Heap-on-Node page map (starting at the Heap-on-Node page header).

Heap-on-Node page map

Offset Size Description
0 2 Allocation count.
4 variable Allocation table. This contains Allocation count + 1 entries. Each entry is an int (16 bit) value that is the byte offset to the beginning of the allocation. The start of this offset can be retrieved by using page map offset + (2 * hidIndex) + 2 (page map offset plus the start of the allocation table, at the HID index offset). An extra entry exists at the Allocation count +1 position to mark the offset of the next available slot.

Table types

Table type Description Features
108 6c table Has a b5 table header.
124 7c table Has a b5 table header.
140 8c table Has a b5 table header
156 9c table Has a b5 table header.
165 a5 table
172 ac table Has a b5 table header.
181 b5 table header B-Tree on Heap
188 bc table Property Context (PC/BTH). Has a b5 table header.
204 cc table Unknown

B-Tree-on-Heap

B-Tree-on-Heap header

All tables should have a BTree-on-Heap header at HID 0x20 (the start offset to the BTree-on-Heap header is in the allocation table). This is the HID User Root from the Heap-on-Node header.

Offset Size Description
0 1 Table type. MUST be 188.
1 1 Size of the BTree Key value. MUST be 2, 4, 8 or 16.
2 1 Size of the data value. MUST be greater than zero and less than or equal to 32.
3 1 Index depth.
4 4 HID root. Points to the B-Tree-on-Heap entries (offset can be found in the allocation table).

Property Context

The property context starts at the HID root of the B-Tree-on-Heap header.

Property Context B-Tree-on-Heap Record

Offset Size Description
0 2 Property ID.
2 2 Property type.

Property types

Type Value
Integer16 2
Integer32 3
Floating32 4
Floating64 5
Currency 6
FloatingTime 7
ErrorCode 10
Boolean 11
Integer64 20
String 31
String8 30
Time 64
GUID 72
ServerID 251
Restriction 253
RuleAction 254
Binary 258
MultipleInteger16 4098
MultipleInteger32 4099
MultipleFloating32 4100
MultipleFloating64 4101
MultipleCurrency 4102
MultipleFloatingTime 4103
MultipleInteger64 4116
MultipleString 4127
MultipleString8 4126
MultipleTime 4160
MultipleGUID 4168
MultipleBinary 4354
Unspecified 0
Null 1
Object 13

Contact

Feel free to contact me if you have any questions.
Name: Marten Mooij
Email: [email protected]
Phone: +31 6 30 53 47 67

License

MIT

Comments
  • [BUG] PST: external node, no local descriptors provided

    [BUG] PST: external node, no local descriptors provided

    Describe the bug After change the PST file path in the example, then go build, i got "external node, no local descriptors provided" error.

    To Reproduce

    I've used the same code provided in your example and test on 2 different PST file, same error.

    Expected behavior

    Should run without error

    Stack trace

    Initializing...
    panic: Failed to open PST file: go-pst: external node, no local descriptors provided
    github.com/mooijtech/go-pst/v5/pkg.(*File).GetHeapOnNodeReaderFromHID
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/heap_on_node.go:131
    github.com/mooijtech/go-pst/v5/pkg.(*File).GetHeapOnNodeReaderFromHNID
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/heap_on_node.go:122
    github.com/mooijtech/go-pst/v5/pkg.NewPropertyReader
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/property_reader.go:45
    github.com/mooijtech/go-pst/v5/pkg.(*PropertyContext).GetPropertyReader
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/property_context.go:54
    github.com/mooijtech/go-pst/v5/pkg.(*File).GetNameToIDMap
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/name_to_id_map.go:187
    github.com/mooijtech/go-pst/v5/pkg.NewFromReaderWithBTrees
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:132
    github.com/mooijtech/go-pst/v5/pkg.NewFromReader
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:52
    github.com/mooijtech/go-pst/v5/pkg.NewFromFile
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:47
    main.main
    	/home/eviltik/toto/main.go:18
    runtime.main
    	/usr/local/go/src/runtime/proc.go:250
    runtime.goexit
    	/usr/local/go/src/runtime/asm_amd64.s:1594
    github.com/mooijtech/go-pst/v5/pkg.NewPropertyReader
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/property_reader.go:48
    github.com/mooijtech/go-pst/v5/pkg.(*PropertyContext).GetPropertyReader
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/property_context.go:54
    github.com/mooijtech/go-pst/v5/pkg.(*File).GetNameToIDMap
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/name_to_id_map.go:187
    github.com/mooijtech/go-pst/v5/pkg.NewFromReaderWithBTrees
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:132
    github.com/mooijtech/go-pst/v5/pkg.NewFromReader
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:52
    github.com/mooijtech/go-pst/v5/pkg.NewFromFile
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:47
    main.main
    	/home/eviltik/toto/main.go:18
    runtime.main
    	/usr/local/go/src/runtime/proc.go:250
    runtime.goexit
    	/usr/local/go/src/runtime/asm_amd64.s:1594
    github.com/mooijtech/go-pst/v5/pkg.(*File).GetNameToIDMap
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/name_to_id_map.go:190
    github.com/mooijtech/go-pst/v5/pkg.NewFromReaderWithBTrees
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:132
    github.com/mooijtech/go-pst/v5/pkg.NewFromReader
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:52
    github.com/mooijtech/go-pst/v5/pkg.NewFromFile
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:47
    main.main
    	/home/eviltik/toto/main.go:18
    runtime.main
    	/usr/local/go/src/runtime/proc.go:250
    runtime.goexit
    	/usr/local/go/src/runtime/asm_amd64.s:1594
    github.com/mooijtech/go-pst/v5/pkg.NewFromReaderWithBTrees
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:135
    github.com/mooijtech/go-pst/v5/pkg.NewFromReader
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:52
    github.com/mooijtech/go-pst/v5/pkg.NewFromFile
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:47
    main.main
    	/home/eviltik/toto/main.go:18
    runtime.main
    	/usr/local/go/src/runtime/proc.go:250
    runtime.goexit
    	/usr/local/go/src/runtime/asm_amd64.s:1594
    
    
    goroutine 1 [running]:
    main.main()
    	/home/eviltik/toto/main.go:21 +0x239
    

    Platform (please complete the following information):

    • go-pst v5
    • go version go1.19.2 linux/amd64
  • Switch b-trees to google/btree (Go 1.18, generics support)

    Switch b-trees to google/btree (Go 1.18, generics support)

  • License Change?

    License Change?

    Would you consider changing the License to something here? I would kindly suggest the MIT license.

    pkg.go.dev won't even show documentation for this package since you're using WTFPL, and I imagine it's going to limit it's use in some projects. I'd love to add PST support to my own eml2html package.

    Thanks for the work in this package and considering this request.

    Edit: I noticed the badge on the README actually says MIT, but that doesn't match what's in the actual LICENSE.txt file. Maybe this is just an oversight?

  • Update module golang.org/x/text to v0.6.0

    Update module golang.org/x/text to v0.6.0

    Mend Renovate

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | golang.org/x/text | require | minor | v0.5.0 -> v0.6.0 |


    Release Notes

    golang/text

    v0.6.0

    Compare Source


    Configuration

    ๐Ÿ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    ๐Ÿšฆ Automerge: Disabled by config. Please merge this manually once you are satisfied.

    โ™ป Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    ๐Ÿ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

  • Update module github.com/tinylib/msgp to v1.1.8

    Update module github.com/tinylib/msgp to v1.1.8

    Mend Renovate

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | github.com/tinylib/msgp | require | patch | v1.1.7 -> v1.1.8 |


    Release Notes

    tinylib/msgp

    v1.1.8

    Compare Source


    Configuration

    ๐Ÿ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    ๐Ÿšฆ Automerge: Disabled by config. Please merge this manually once you are satisfied.

    โ™ป Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    ๐Ÿ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

  • Update module github.com/tinylib/msgp to v1.1.7

    Update module github.com/tinylib/msgp to v1.1.7

    Mend Renovate

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | github.com/tinylib/msgp | require | patch | v1.1.6 -> v1.1.7 |


    Release Notes

    tinylib/msgp

    v1.1.7

    Compare Source


    Configuration

    ๐Ÿ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    ๐Ÿšฆ Automerge: Disabled by config. Please merge this manually once you are satisfied.

    โ™ป Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    ๐Ÿ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

  • Update module github.com/tidwall/btree to v1.6.0

    Update module github.com/tidwall/btree to v1.6.0

    Mend Renovate

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | github.com/tidwall/btree | require | minor | v1.5.2 -> v1.6.0 |


    Release Notes

    tidwall/btree

    v1.6.0

    Compare Source


    Configuration

    ๐Ÿ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    ๐Ÿšฆ Automerge: Disabled by config. Please merge this manually once you are satisfied.

    โ™ป Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    ๐Ÿ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

  • Update module golang.org/x/text to v0.5.0

    Update module golang.org/x/text to v0.5.0

    Mend Renovate

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | golang.org/x/text | require | minor | v0.4.0 -> v0.5.0 |


    Release Notes

    golang/text

    v0.5.0

    Compare Source


    Configuration

    ๐Ÿ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    ๐Ÿšฆ Automerge: Disabled by config. Please merge this manually once you are satisfied.

    โ™ป Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    ๐Ÿ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

  • Update module github.com/tidwall/btree to v1.5.2

    Update module github.com/tidwall/btree to v1.5.2

    Mend Renovate

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | github.com/tidwall/btree | require | patch | v1.5.1 -> v1.5.2 |


    Release Notes

    tidwall/btree

    v1.5.2

    Compare Source


    Configuration

    ๐Ÿ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    ๐Ÿšฆ Automerge: Disabled by config. Please merge this manually once you are satisfied.

    โ™ป Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    ๐Ÿ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

  • Update module github.com/tidwall/btree to v1.5.1

    Update module github.com/tidwall/btree to v1.5.1

    Mend Renovate

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | github.com/tidwall/btree | require | patch | v1.5.0 -> v1.5.1 |


    Release Notes

    tidwall/btree

    v1.5.1

    Compare Source


    Configuration

    ๐Ÿ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    ๐Ÿšฆ Automerge: Disabled by config. Please merge this manually once you are satisfied.

    โ™ป Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    ๐Ÿ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

  • Update module github.com/tidwall/btree to v1.5.0

    Update module github.com/tidwall/btree to v1.5.0

    Mend Renovate

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | github.com/tidwall/btree | require | minor | v1.4.4 -> v1.5.0 |


    Release Notes

    tidwall/btree

    v1.5.0

    Compare Source


    Configuration

    ๐Ÿ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    ๐Ÿšฆ Automerge: Disabled by config. Please merge this manually once you are satisfied.

    โ™ป Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    ๐Ÿ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

  • Load messages from file offset

    Load messages from file offset

    go-pst should expose file offsets to messages and be able to load Message structs from this offset. This would bypass the b-tree and is useful for indexing.

  • B-Tree improvements

    B-Tree improvements

    go-pst currently uses the following to search for messages: b-tree.png It would be better to use the following so we don't have to traverse the whole tree to find the next message: search-tree.png

  • Return empty iterator

    Return empty iterator

    We currently return an error when attempting to create an iterator while there are no messages/attachments available. We should return an empty iterator instead.

    This is my iterator implementation flaw, but it would have been nice to have a standard iterator in Go: https://github.com/golang/go/discussions/54245 https://github.com/golang/go/discussions/56413

  • io_uring

    io_uring

    go-pst currently reads the PST file(s) sequentially. It would be nice to use a Goroutine pool to walk/read structures such as the b-trees/Property Context in parallel.

  • [BUG] OST: invalid table type

    [BUG] OST: invalid table type

    Describe the bug After change the file path to an OST file in the example, then go build / run , i got "invalid table type" error.

    To Reproduce Steps to reproduce the behavior:

    I've used the same code provided in your example but with an OST file.

    Expected behavior Should run without error

    Stack trace

    Initializing...
    panic: Failed to open PST file: go-pst: invalid table type
    github.com/mooijtech/go-pst/v5/pkg.(*File).GetPropertyContext
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/property_context.go:66
    github.com/mooijtech/go-pst/v5/pkg.(*File).GetNameToIDMap
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/name_to_id_map.go:111
    github.com/mooijtech/go-pst/v5/pkg.NewFromReaderWithBTrees
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:132
    github.com/mooijtech/go-pst/v5/pkg.NewFromReader
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:52
    github.com/mooijtech/go-pst/v5/pkg.NewFromFile
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:47
    main.main
    	/home/eviltik/toto/main.go:18
    runtime.main
    	/usr/local/go/src/runtime/proc.go:250
    runtime.goexit
    	/usr/local/go/src/runtime/asm_amd64.s:1594
    github.com/mooijtech/go-pst/v5/pkg.(*File).GetNameToIDMap
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/name_to_id_map.go:114
    github.com/mooijtech/go-pst/v5/pkg.NewFromReaderWithBTrees
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:132
    github.com/mooijtech/go-pst/v5/pkg.NewFromReader
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:52
    github.com/mooijtech/go-pst/v5/pkg.NewFromFile
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:47
    main.main
    	/home/eviltik/toto/main.go:18
    runtime.main
    	/usr/local/go/src/runtime/proc.go:250
    runtime.goexit
    	/usr/local/go/src/runtime/asm_amd64.s:1594
    github.com/mooijtech/go-pst/v5/pkg.NewFromReaderWithBTrees
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:135
    github.com/mooijtech/go-pst/v5/pkg.NewFromReader
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:52
    github.com/mooijtech/go-pst/v5/pkg.NewFromFile
    	/home/eviltik/go/pkg/mod/github.com/mooijtech/go-pst/[email protected]/pkg/file.go:47
    main.main
    	/home/eviltik/toto/main.go:18
    runtime.main
    	/usr/local/go/src/runtime/proc.go:250
    runtime.goexit
    	/usr/local/go/src/runtime/asm_amd64.s:1594
    
    
    goroutine 1 [running]:
    main.main()
    	/home/eviltik/toto/main.go:21 +0x239
    

    Platform (please complete the following information):

    • go-pst v5
    • go version go1.19.2 linux/amd64
This command line tool exports .eml files from POP3 account.

export-mail This command line tool exports .eml files from POP3 account. Install > go get github.com/gonejack/export-mail Usage > export-mail --host i

Dec 6, 2021
Send markdown files as MIME-encoded electronic mail.

Send markdown files as MIME-encoded electronic mail.

Aug 9, 2022
An email service written in Golang
An email service written in Golang

furion An email service written in Go. Architecture Diagram

Dec 19, 2021
The Official Twilio SendGrid Led, Community Driven Golang API Library
The Official Twilio SendGrid Led, Community Driven Golang API Library

NEW: Subscribe to email notifications for releases and breaking changes. The default branch name for this repository has been changed to main as of 07

Dec 15, 2022
Golang library for sending email using gmail credentials

library for sending email using gmail credentials

Jan 22, 2022
Lightweight SMTP client written in Go

Hectane Hectane is both a Go package providing an SMTP queue for sending emails and a standalone application that exposes this functionality via an HT

Nov 23, 2022
๐Ÿ“ฎ Simple (but useful) email sender written in pure Go v1.17. Support HTML templates and attachments.

?? Go Email Sender Simple (but useful) email sender written in pure Go v1.17. Yes, yet another email package here! ?? Support HTML templates and attac

Dec 31, 2021
Robust and flexible email library for Go

email Robust and flexible email library for Go Email for humans The email package is designed to be simple to use, but flexible enough so as not to be

Dec 30, 2022
:white_check_mark: A Go library for email verification without sending any emails.

email-verifier โœ‰๏ธ A Go library for email verification without sending any emails. Features Email Address Validation: validates if a string contains a

Dec 30, 2022
:inbox_tray: An IMAP library for clients and servers

go-imap An IMAP4rev1 library written in Go. It can be used to build a client and/or a server. Usage Client package main import ( "log" "github.com

Jan 6, 2023
:envelope: A streaming Go library for the Internet Message Format and mail messages

go-message A Go library for the Internet Message Format. It implements: RFC 5322: Internet Message Format RFC 2045, RFC 2046 and RFC 2047: Multipurpos

Dec 26, 2022
Go library for sending mail with the Mailgun API.

Mailgun with Go Go library for interacting with the Mailgun API. Usage package main import ( "context" "fmt" "log" "time" "githu

Dec 25, 2022
โœ‰๏ธ A Go library for email verification without sending any emails.

email-verifier โœ‰๏ธ A Go library for email verification without sending any emails. Features Email Address Validation: validates if a string contains a

Jun 24, 2021
Mail_sender - This library is for sending emails from your mail

Mail Sender This library is for sending emails from your mail Installation mail_

Dec 30, 2021
Mcopa - A library allows for parsing an email message into a more convenient form than the net/mail provides

Mail content parsing This library allows for parsing an email message into a mor

Jan 1, 2022
DKIM package for golang

go-dkim DKIM package for Golang Getting started Install go get github.com/toorop/go-dkim Warning: you need to use Go 1.4.2-master or 1.4.3 (when it

Dec 10, 2022
Inline styling for html mail in golang

go-premailer Inline styling for HTML mail in golang Document install go get github.com/vanng822/go-premailer/premailer Example import ( "fmt" "gith

Nov 30, 2022
Golang package for send email. Support keep alive connection, TLS and SSL. Easy for bulk SMTP.

Go Simple Mail The best way to send emails in Go with SMTP Keep Alive and Timeout for Connect and Send. IMPORTANT Examples in this README are for v2.2

Jan 8, 2023
Golang package that generates clean, responsive HTML e-mails for sending transactional mail
Golang package that generates clean, responsive HTML e-mails for sending transactional mail

Hermes Hermes is the Go port of the great mailgen engine for Node.js. Check their work, it's awesome! It's a package that generates clean, responsive

Dec 28, 2022