mirror of
https://github.com/mailscope/kumomta.git
synced 2026-08-25 05:38:18 +00:00
78 lines
3.0 KiB
Markdown
78 lines
3.0 KiB
Markdown
# get_simple_structure
|
|
|
|
```lua
|
|
local structure = mimepart:get_simple_structure()
|
|
```
|
|
|
|
{{since('2025.10.06-5ec871ab')}}
|
|
|
|
A MIME message is an encoding of a tree of pieces of content which makes things
|
|
relatively complex to script around in various processing work flows,
|
|
especially because there can be multiple ways to encode similar information
|
|
that result in different tree structures.
|
|
|
|
This method will walk the tree structure starting from `mimepart` and collect
|
|
together the main points of interest, returning a lua table holding that
|
|
simplified and flattened view. The following fields are present in the
|
|
simplified structure:
|
|
|
|
* `text_part` - The first `text/plain` [MimePart](index.md) found in the walk, if any.
|
|
* `html_part` - The first `text/html` [MimePart](index.md) found in the walk, if any.
|
|
* `header_part` - The "main" part from the perspective of header analysis
|
|
* `attachments` - An array style table holding a list of all the attachments.
|
|
* `amp_html_part` - The first `text/x-amp-html` [MimePart](index.md) found in the walk, if any. {{since('2026.03.04-bb93ecb1', inline=True)}}
|
|
|
|
Each attachment table entry has the following fields:
|
|
|
|
* `file_name` - The suggested name to use when saving the attachment. If the
|
|
`Content-Disposition` header defined the file name, then that will be used.
|
|
Otherwise, the `Content-Type` `name` parameter will be used. If neither is
|
|
present, then the `file_name` field will not be set (effectively `nil`).
|
|
* `inline` - will be `true` if the attachment was marked as having an inline
|
|
disposition, `false` otherwise.
|
|
* `content_id` - if the `Content-ID` header is defined, this field will hold
|
|
its value.
|
|
* `part` - the [MimePart](index.md) for the attachment. You can use this to
|
|
access its body (eg: [mimepart.body](body.md) or headers.
|
|
|
|
## Example of modifying incoming message content
|
|
|
|
This example prepends text to both the text and html parts of incoming messages:
|
|
|
|
```lua
|
|
kumo.on('smtp_server_message_received', function(message, conn_meta)
|
|
local mime_part = message:parse_mime()
|
|
local structure = mime_part:get_simple_structure()
|
|
|
|
if structure.text_part then
|
|
structure.text_part.body = 'PREPENDED!\r\n' .. structure.text_part.body
|
|
end
|
|
|
|
if structure.html_part then
|
|
structure.html_part.body = '<B>PREPENDED!</B>\r\n'
|
|
.. structure.html_part.body
|
|
end
|
|
|
|
-- Apply the changed content to the message
|
|
message:set_data(tostring(mime_part))
|
|
end)
|
|
```
|
|
|
|
## Example of dumping incoming attachments
|
|
|
|
This example logs the attachment information and contents during reception.
|
|
It is not recommended for production workflows, as the contents can be
|
|
large and unsuitable for capture in the diagnostic log, but can be helpful
|
|
in some debugging scenarios.
|
|
|
|
```lua
|
|
kumo.on('smtp_server_message_received', function(message, conn_meta)
|
|
local mime_part = message:parse_mime()
|
|
local structure = mime_part:get_simple_structure()
|
|
|
|
for _, attachment in ipairs(structure.attachments) do
|
|
print(attachment.file_name, attachment.content_type, attachment.part.body)
|
|
end
|
|
end)
|
|
```
|