Hocuri 626ac8161a fix: Mark a message as delivered only after it has been fully sent out (#8062)
Fix https://github.com/chatmail/core/issues/8042

The problem was that after receiving the bcc_self'ed pre-message in
`receive_imf`, the logic there only looked for a pending
`smtp`-table-entry that matches the rfc724_mid, and if there was none
then it thought "Great, apparently the message is fully sent out, we can
mark it as delivered!".

But with pre-messages, the same message can have two `smtp` entries (one
for the pre-message and one for the post-message), and the message
should only be marked as delivered once both of them are sent out.

Now, I changed the logic to look for all entries with the same msg_id.
This is actually the same SQL query used in smtp.rs, so, I extracted it
into a new function; feel free to suggest a better name for it.

I tested on Android that it now works fine.

I'll add a test in a follow-up PR.

There are a lot of other problems with sending large files, though:
- The pre-message is sent before the post-message, so that for the
receiver it looks as if the message arrived, but stays in
"downloading..." forever
- There is quite a time delay between clicking on "Send" and the
outgoing message appearing in the chat
- The message shortly gets a letter icon right after it is sent
- I'm wondering if there is a way to give feedback to the user
immediately if the message is too big
- It's unclear when exactly we want to send read receipts

I'll open a follow-up issue for these.
2026-04-02 15:12:17 +02:00
2026-03-22 06:23:58 +00:00
2026-03-30 12:48:24 +02:00
2026-03-10 09:21:24 +00:00
2026-03-30 12:48:24 +02:00
2026-03-30 12:48:24 +02:00
2023-07-04 00:52:31 +02:00
2023-10-29 13:13:44 +00:00

Chatmail logo

Rust CI dependency status

The chatmail core library implements low-level network and encryption protocols, integrated by many chat bots and higher level applications, allowing to securely participate in the globally scaled e-mail server network. We provide reproducibly-built deltachat-rpc-server static binaries that offer a stdio-based high-level JSON-RPC API for instant messaging purposes.

The following protocols are handled without requiring API users to know much about them:

Installing Rust and Cargo

To download and install the official compiler for the Rust programming language, and the Cargo package manager, run the command in your user environment:

$ curl https://sh.rustup.rs -sSf | sh

On Windows, you may need to also install Perl to be able to compile deltachat-core.

Using the CLI client

Compile and run the command line utility, using cargo:

$ cargo run --locked -p deltachat-repl -- ~/profile-db

where ~/profile-db is the database file. The utility will create it if it does not exist.

Optionally, install deltachat-repl binary with

$ cargo install --locked --path deltachat-repl/

and run as

$ deltachat-repl ~/profile-db

Configure your account (if not already configured):

Chatmail is awaiting your commands.
> set addr your@email.org
> set mail_pw yourpassword
> configure

Connect to your mail server (if already configured):

> connect

Export your public key to a vCard file:

> make-vcard my.vcard 1

Create contacts by address or vCard file:

> addcontact yourfriends@email.org
> import-vcard key-contact.vcard

List contacts:

> listcontacts
Contact#Contact#11: key-contact@email.org <key-contact@email.org>
Contact#Contact#Self: Me √ <your@email.org>
2 key contacts.
Contact#Contact#10: yourfriends@email.org <yourfriends@email.org>
1 address contacts.

Create a chat with your friend and send a message:

> createchat 10
Single#Chat#12 created successfully.
> chat 12
Selecting chat Chat#12
Single#Chat#12: yourfriends@email.org [yourfriends@email.org] Icon: profile-db-blobs/4138c52e5bc1c576cda7dd44d088c07.png
0 messages.
81.252µs to create this list, 123.625µs to mark all messages as noticed.
> send hi

List messages when inside a chat:

> chat

For more commands type:

> help

Installing libdeltachat system wide

$ git clone https://github.com/chatmail/core.git
$ cd deltachat-core-rust
$ cmake -B build . -DCMAKE_INSTALL_PREFIX=/usr
$ cmake --build build
$ sudo cmake --install build

Development

# run tests
$ cargo test --all
# build c-ffi
$ cargo build -p deltachat_ffi --release

Debugging environment variables

  • DCC_MIME_DEBUG: if set outgoing and incoming message will be printed

  • RUST_LOG=async_imap=trace,async_smtp=trace: enable IMAP and SMTP tracing in addition to info messages.

Expensive tests

Some tests are expensive and marked with #[ignore], to run these use the --ignored argument to the test binary (not to cargo itself):

$ cargo test -- --ignored

Fuzzing

Install cargo-bolero with

$ cargo install cargo-bolero

Run fuzzing tests with

$ cd fuzz
$ cargo bolero test fuzz_mailparse -s NONE

Corpus is created at fuzz/fuzz_targets/corpus, you can add initial inputs there. For fuzz_mailparse target corpus can be populated with ../test-data/message/*.eml.

Features

  • vendored: When using Openssl for TLS, this bundles a vendored version.

Update Provider Data

To add the updates from the provider-db to the core, check line REV= inside ./scripts/update-provider-database.sh and then run the script.

Language bindings and frontend projects

Language bindings are available for:

The following "frontend" projects make use of the Rust-library or its language bindings:

Description
Chatmail Rust Core library, used by Android/iOS/desktop chatmail apps, bindings and bots 📧
Readme MPL-2.0 103 MiB
Languages
Rust 74.4%
Tcl 9.1%
Python 8.8%
C 4.9%
DIGITAL Command Language 1.1%
Other 1.7%