74#define MMC_NEW_DIR (1 << 0)
75#define MMC_CUR_DIR (1 << 1)
104 bool check_new,
bool check_stats)
107 struct dirent *de = NULL;
109 struct stat st = { 0 };
118 if (check_new && c_mail_check_recent)
127 if (!(check_new || check_stats))
139 char delimiter_version[8] = { 0 };
140 snprintf(delimiter_version,
sizeof(delimiter_version),
"%c2,", c_maildir_field_delimiter);
141 while ((de = readdir(dir)))
143 if (*de->d_name ==
'.')
146 p = strstr(de->d_name, delimiter_version);
147 if (p && strchr(p + 3,
'T'))
153 if (p && strchr(p + 3,
'F'))
156 if (!p || !strchr(p + 3,
'S'))
162 if (c_mail_check_recent)
210 const char *flags = NULL;
214 flags =
edata->maildir_flags;
224 char tmp[1024] = { 0 };
225 snprintf(tmp,
sizeof(tmp),
"%s%s%s%s%s", e->
flagged ?
"F" :
"", e->
replied ?
"R" :
"",
231 snprintf(dest, destlen,
"%c2,%s", c_maildir_field_delimiter, tmp);
261 char subdir[4] = { 0 };
262 char suffix[16] = { 0 };
272 char *s = strrchr(msg->
path,
'/') + 1;
277 s = strchr(s, c_maildir_field_delimiter);
302 struct utimbuf ut = { 0 };
310 }
while ((rc_utime == -1) && (errno == EINTR));
313 mutt_perror(
_(
"maildir_commit_message(): unable to set time on file"));
330 else if (errno != EEXIST)
361 long old_hdr_lines = e->
lines;
387 if ((rc == -1) && restore)
391 e->
lines = old_hdr_lines;
410 struct Buffer *newpath = NULL;
411 struct Buffer *partpath = NULL;
412 struct Buffer *fullpath = NULL;
413 struct Buffer *oldpath = NULL;
414 char suffix[16] = { 0 };
428 char *p = strrchr(e->
path,
'/');
444 p = strchr(newpath->
data, c_maildir_field_delimiter);
467 struct stat st = { 0 };
499 struct stat st = { 0 };
502 snprintf(buf,
sizeof(buf),
"%s/%s",
mailbox_path(m),
"cur");
503 if (stat(buf, &st) == 0)
506 snprintf(buf,
sizeof(buf),
"%s/%s",
mailbox_path(m),
"new");
507 if (stat(buf, &st) == 0)
533 const char *subdir,
struct Progress *progress)
535 struct dirent *de = NULL;
539 struct Email *e = NULL;
553 while (((de = readdir(dir))) && !
SigInt)
555 if (*de->d_name ==
'.')
571 entry->
inode = de->d_ino;
602 const char *p = strrchr(fn, c_maildir_field_delimiter);
614 struct Progress *progress)
637 struct stat st_lastchanged = { 0 };
649 if (hce.
email && c_maildir_header_cache_verify)
651 rc = stat(fn, &st_lastchanged);
699 struct Progress *progress = NULL;
704 snprintf(msg,
sizeof(msg),
_(
"Scanning %s..."),
mailbox_path(m));
725 snprintf(msg,
sizeof(msg),
_(
"Reading %s..."),
mailbox_path(m));
755 char *t = strrchr(src,
'/');
763 char searchable_bytes[8] = { 0 };
764 snprintf(searchable_bytes,
sizeof(searchable_bytes),
",%c", c_maildir_field_delimiter);
765 char *u = strpbrk(dest->
data, searchable_bytes);
787 const char *subfolder,
char **newname)
793 struct dirent *de = NULL;
798 buf_printf(dirname,
"%s/%s", folder, subfolder);
807 while ((de = readdir(dir)))
813 buf_printf(fname,
"%s/%s/%s", folder, subfolder, de->d_name);
851 char *p = strrchr(
path, c_maildir_field_delimiter);
857 q =
edata->maildir_flags;
878 if (!e->
flagged || !c_flag_safe)
894 if (q ==
edata->maildir_flags)
913 bool is_old,
struct Email *e)
915 if (!fp || !fname || !e)
955 bool is_old,
struct Email *e)
960 FILE *fp = fopen(fname,
"r");
983 if (e->
deleted && !c_maildir_trash)
990 const char *key = e->
path + 3;
1007 const char *key = e->
path + 3;
1025 static unsigned int new_hits = 0, cur_hits = 0;
1031 (new_hits > cur_hits) ?
"new" :
"cur", newname);
1032 if (fp || (errno != ENOENT))
1034 if ((new_hits < UINT_MAX) && (cur_hits < UINT_MAX))
1036 new_hits += ((new_hits > cur_hits) ? 1 : 0);
1037 cur_hits += ((new_hits > cur_hits) ? 0 : 1);
1043 (new_hits > cur_hits) ?
"cur" :
"new", newname);
1044 if (fp || (errno != ENOENT))
1046 if ((new_hits < UINT_MAX) && (cur_hits < UINT_MAX))
1048 new_hits += ((new_hits > cur_hits) ? 0 : 1);
1049 cur_hits += ((new_hits > cur_hits) ? 1 : 0);
1073 struct dirent *de = NULL;
1084 snprintf(realpath,
sizeof(realpath),
"%s/%s",
buf_string(path),
1085 (iter == 0) ?
"cur" :
"new");
1089 while ((de = readdir(dir)))
1091 if (*de->d_name !=
'.')
1099 }
while (rc && iter < 2);
1153 if ((mkdir(tmp, S_IRWXU) != 0) && (errno != EEXIST))
1162 if ((mkdir(tmp, S_IRWXU) != 0) && (errno != EEXIST))
1173 if ((mkdir(tmp, S_IRWXU) != 0) && (errno != EEXIST))
1201 struct stat st_new = { 0 };
1202 struct stat st_cur = { 0 };
1204 bool occult =
false;
1206 bool flags_changed =
false;
1292 if (md && md->
email)
1305 flags_changed =
true;
1312 flags_changed =
true;
1387 bool check_new =
true;
1400 check_new = !m->
has_new && c_maildir_check_cur;
1401 if (check_new || check_stats)
1426 struct Progress *progress = NULL;
1430 snprintf(msg,
sizeof(msg),
_(
"Writing %s..."),
mailbox_path(m));
1461 for (
int i = 0, j = 0; i < m->
msg_count; i++)
1467 if (!e->
deleted || c_maildir_trash)
1500 msg->
fp = fopen(
path,
"r");
1501 if (!msg->
fp && (errno == ENOENT))
1526 char suffix[16] = { 0 };
1527 char subdir[16] = { 0 };
1531 struct Email tmp = *e;
1549 snprintf(
path,
sizeof(
path),
"%s/tmp/%s.%lld.R%" PRIu64
".%s%s",
1555 fd = open(
path, O_WRONLY | O_EXCL | O_CREAT, 0666);
1558 if (errno != EEXIST)
1574 msg->
fp = fdopen(fd,
"w");
1613 char *key = e->
path + 3;
1638 if (
buf_at(path, 0) ==
'~')
1666 if (!st || !S_ISDIR(st->st_mode))
1670 struct stat stsub = { 0 };
1671 char *subs[] = {
"cur",
"new" };
1674 snprintf(sub,
sizeof(sub),
"%s/%s", path, subs[i]);
1675 if ((stat(sub, &stsub) == 0) && S_ISDIR(stsub.st_mode))
1702 .msg_padding_size = NULL,
1705 .tags_commit = NULL,
#define ARRAY_SORT(head, fn, sdata)
Sort an array.
#define ARRAY_ADD(head, elem)
Add an element at the end of the array.
#define ARRAY_FOREACH(elem, head)
Iterate over all elements of the array.
#define ARRAY_SIZE(head)
The number of elements stored.
#define ARRAY_FREE(head)
Release all memory.
#define ARRAY_HEAD_INITIALIZER
Static initializer for arrays.
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
char buf_at(const struct Buffer *buf, size_t offset)
Return the character at the given offset.
size_t buf_strcpy(struct Buffer *buf, const char *s)
Copy a string into a Buffer.
char * buf_strdup(const struct Buffer *buf)
Copy a Buffer's string.
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
const char * cs_subset_path(const struct ConfigSubset *sub, const char *name)
Get a path config item by name.
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Convenience wrapper for the config headers.
char * HomeDir
User's home directory.
const char * cc_maildir_field_delimiter(void)
Get the cached value of $maildir_field_delimiter.
int mutt_copy_message(FILE *fp_out, struct Email *e, struct Message *msg, CopyMessageFlags cmflags, CopyHeaderFlags chflags, int wraplen)
Copy a message from a Mailbox.
Duplicate the structure of an entire email.
#define MUTT_CM_UPDATE
Update structs on sync.
#define CH_UPDATE
Update the status and x-status fields?
#define CH_UPDATE_LEN
Update Lines: and Content-Length:
Convenience wrapper for the core headers.
void mutt_body_free(struct Body **ptr)
Free a Body.
struct Email * email_new(void)
Create a new Email.
void email_free(struct Email **ptr)
Free an Email.
Structs that make up an email.
struct Envelope * mutt_rfc822_read_header(FILE *fp, struct Email *e, bool user_hdrs, bool weed)
Parses an RFC822 header.
void mutt_file_get_stat_timespec(struct timespec *dest, struct stat *st, enum MuttStatType type)
Read the stat() time into a time value.
int mutt_file_safe_rename(const char *src, const char *target)
NFS-safe renaming of files.
int mutt_file_fclose(FILE **fp)
Close a FILE handle (and NULL the pointer)
int mutt_file_mkdir(const char *path, mode_t mode)
Recursively create directories.
long mutt_file_get_size_fp(FILE *fp)
Get the size of a file.
DIR * mutt_file_opendir(const char *path, enum MuttOpenDirMode mode)
Open a directory.
int mutt_file_stat_timespec_compare(struct stat *st, enum MuttStatType type, struct timespec *b)
Compare stat info with a time value.
int mutt_file_fsync_close(FILE **fp)
Flush the data, before closing a file (and NULL the pointer)
@ MUTT_OPENDIR_CREATE
Create the directory if it doesn't exist.
@ MUTT_STAT_CTIME
File/dir's ctime - creation time.
@ MUTT_STAT_MTIME
File/dir's mtime - last modified time.
char * ShortHostname
Short version of the hostname.
SIG_ATOMIC_VOLATILE_T SigInt
true after SIGINT is received
#define mutt_debug(LEVEL,...)
static bool maildir_ac_add(struct Account *a, struct Mailbox *m)
Add a Mailbox to an Account - Implements MxOps::ac_add() -.
static bool maildir_ac_owns_path(struct Account *a, const char *path)
Check whether an Account own a Mailbox path - Implements MxOps::ac_owns_path() -.
const struct MxOps MxMaildirOps
Maildir Mailbox - Implements MxOps -.
static enum MxStatus maildir_mbox_check_stats(struct Mailbox *m, uint8_t flags)
Check the Mailbox statistics - Implements MxOps::mbox_check_stats() -.
static enum MxStatus maildir_mbox_check(struct Mailbox *m)
Check for new mail - Implements MxOps::mbox_check() -.
static enum MxStatus maildir_mbox_close(struct Mailbox *m)
Close a Mailbox - Implements MxOps::mbox_close() -.
static bool maildir_mbox_open_append(struct Mailbox *m, OpenMailboxFlags flags)
Open a Mailbox for appending - Implements MxOps::mbox_open_append() -.
static enum MxOpenReturns maildir_mbox_open(struct Mailbox *m)
Open a Mailbox - Implements MxOps::mbox_open() -.
static enum MxStatus maildir_mbox_sync(struct Mailbox *m)
Save changes to the Mailbox - Implements MxOps::mbox_sync() -.
static int maildir_msg_close(struct Mailbox *m, struct Message *msg)
Close an email - Implements MxOps::msg_close() -.
static int maildir_msg_commit(struct Mailbox *m, struct Message *msg)
Save changes to an email - Implements MxOps::msg_commit() -.
bool maildir_msg_open_new(struct Mailbox *m, struct Message *msg, const struct Email *e)
Open a new message in a Mailbox - Implements MxOps::msg_open_new() -.
static bool maildir_msg_open(struct Mailbox *m, struct Message *msg, struct Email *e)
Open an email message in a Mailbox - Implements MxOps::msg_open() -.
static int maildir_msg_save_hcache(struct Mailbox *m, struct Email *e)
Save message to the header cache - Implements MxOps::msg_save_hcache() -.
static int maildir_path_canon(struct Buffer *path)
Canonicalise a Mailbox path - Implements MxOps::path_canon() -.
static int maildir_path_parent(struct Buffer *path)
Find the parent of a Mailbox path - Implements MxOps::path_parent() -.
static int maildir_path_pretty(struct Buffer *path, const char *folder)
Abbreviate a Mailbox path - Implements MxOps::path_pretty() -.
static enum MailboxType maildir_path_probe(const char *path, const struct stat *st)
Is this a Maildir Mailbox? - Implements MxOps::path_probe() -.
static int maildir_sort_inode(const void *a, const void *b, void *sdata)
Compare two Maildirs by inode number - Implements sort_t -.
static int maildir_sort_flags(const void *a, const void *b, void *sdata)
Compare two flag characters - Implements sort_t -.
struct HashElem * mutt_hash_insert(struct HashTable *table, const char *strkey, void *data)
Add a new element to the Hash Table (with string keys)
void * mutt_hash_find(const struct HashTable *table, const char *strkey)
Find the HashElem data in a Hash Table element using a key.
struct HashTable * mutt_hash_new(size_t num_elems, HashFlags flags)
Create a new Hash Table (with string keys)
void mutt_hash_free(struct HashTable **ptr)
Free a hash table.
#define MUTT_HASH_NO_FLAGS
No flags are set.
Header cache multiplexor.
int hcache_store(struct HeaderCache *hc, const char *key, size_t keylen, struct Email *e, uint32_t uidvalidity)
Multiplexor for StoreOps::store.
struct HCacheEntry hcache_fetch(struct HeaderCache *hc, const char *key, size_t keylen, uint32_t uidvalidity)
Multiplexor for StoreOps::fetch.
struct HeaderCache * hcache_open(const char *path, const char *folder, hcache_namer_t namer)
Multiplexor for StoreOps::open.
void hcache_close(struct HeaderCache **ptr)
Multiplexor for StoreOps::close.
int hcache_delete_record(struct HeaderCache *hc, const char *key, size_t keylen)
Multiplexor for StoreOps::delete_record.
@ LL_DEBUG2
Log at debug level 2.
@ LL_DEBUG1
Log at debug level 1.
void mailbox_changed(struct Mailbox *m, enum NotifyMailbox action)
Notify observers of a change to a Mailbox.
@ NT_MAILBOX_RESORT
Email list needs resorting.
@ NT_MAILBOX_INVALID
Email list was changed.
static const char * mailbox_path(const struct Mailbox *m)
Get the Mailbox's path string.
MailboxType
Supported mailbox formats.
@ MUTT_NOTMUCH
'Notmuch' (virtual) Mailbox type
@ MUTT_UNKNOWN
Mailbox wasn't recognised.
@ MUTT_MAILDIR
'Maildir' Mailbox type
struct MaildirEmailData * maildir_edata_get(struct Email *e)
Get the private data for this Email.
void maildir_edata_free(void **ptr)
Free the private Email data - Implements Email::edata_free()
struct MaildirEmailData * maildir_edata_new(void)
Create a new MaildirEmailData object.
bool maildir_update_flags(struct Mailbox *m, struct Email *e_old, struct Email *e_new)
Update the mailbox flags.
void maildir_mdata_free(void **ptr)
Free the private Mailbox data - Implements Mailbox::mdata_free()
struct MaildirMboxData * maildir_mdata_get(struct Mailbox *m)
Get the private data for this Mailbox.
struct MaildirMboxData * maildir_mdata_new(void)
Create a new MaildirMboxData object.
mode_t mh_umask(struct Mailbox *m)
Create a umask from the mailbox directory.
int maildir_move_to_mailbox(struct Mailbox *m, const struct MdEmailArray *mda)
Copy the Maildir list to the Mailbox.
static enum MxStatus maildir_check(struct Mailbox *m)
Check for new mail.
static int maildir_sync_message(struct Mailbox *m, struct Email *e)
Sync an email to a Maildir folder.
static size_t maildir_hcache_keylen(const char *fn)
Calculate the length of the Maildir path.
static void maildir_delayed_parsing(struct Mailbox *m, struct MdEmailArray *mda, struct Progress *progress)
This function does the second parsing pass.
int maildir_check_empty(struct Buffer *path)
Is the mailbox empty.
bool maildir_parse_stream(enum MailboxType type, FILE *fp, const char *fname, bool is_old, struct Email *e)
Parse a Maildir message.
static int maildir_read_dir(struct Mailbox *m, const char *subdir)
Read a Maildir style mailbox.
FILE * maildir_open_find_message(const char *folder, const char *msg, char **newname)
Find a message by name.
#define MMC_CUR_DIR
'cur' directory changed
static void maildir_canon_filename(struct Buffer *dest, const char *src)
Generate the canonical filename for a Maildir folder.
bool maildir_parse_message(enum MailboxType type, const char *fname, bool is_old, struct Email *e)
Actually parse a maildir message.
static FILE * maildir_open_find_message_dir(const char *folder, const char *unique, const char *subfolder, char **newname)
Find a message in a maildir folder.
struct Email * maildir_email_new(void)
Create a Maildir Email.
static void maildir_update_mtime(struct Mailbox *m)
Update our record of the Maildir modification time.
#define MMC_NO_DIRS
No directories changed.
static void maildir_check_dir(struct Mailbox *m, const char *dir_name, bool check_new, bool check_stats)
Check for new mail / mail counts.
bool maildir_sync_mailbox_message(struct Mailbox *m, struct Email *e, struct HeaderCache *hc)
Save changes to the mailbox.
static int maildir_parse_dir(struct Mailbox *m, struct MdEmailArray *mda, const char *subdir, struct Progress *progress)
Read a Maildir mailbox.
#define MMC_NEW_DIR
'new' directory changed
static int maildir_rewrite_message(struct Mailbox *m, struct Email *e)
Sync a message in an MH folder.
void maildir_gen_flags(char *dest, size_t destlen, struct Email *e)
Generate the Maildir flags for an email.
static int maildir_commit_message(struct Mailbox *m, struct Message *msg, struct Email *e)
Commit a message to a maildir folder.
void maildir_parse_flags(struct Email *e, const char *path)
Parse Maildir file flags.
struct MdEmail * maildir_entry_new(void)
Create a new Maildir entry.
void maildirarray_clear(struct MdEmailArray *mda)
Free a Maildir array.
#define mutt_array_size(x)
bool MonitorContextChanged
Set to true when the current mailbox has changed.
Monitor files for changes.
time_t mutt_date_now(void)
Return the number of seconds since the Unix epoch.
Convenience wrapper for the library headers.
bool mutt_path_canon(struct Buffer *path, const char *homedir, bool is_dir)
Create the canonical version of a path.
bool mutt_path_abbr_folder(struct Buffer *path, const char *folder)
Create a folder abbreviation.
bool mutt_path_parent(struct Buffer *path)
Find the parent of a path.
bool mutt_path_pretty(struct Buffer *path, const char *homedir, bool is_dir)
Tidy a filesystem path.
char * mutt_str_dup(const char *str)
Copy a string, safely.
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
bool mutt_strn_equal(const char *a, const char *b, size_t num)
Check for equality of two strings (to a maximum), safely.
size_t mutt_str_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix.
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
size_t mutt_str_copy(char *dest, const char *src, size_t dsize)
Copy a string into a buffer (guaranteeing NUL-termination)
char * mutt_str_replace(char **p, const char *s)
Replace one string with another.
int mx_msg_close(struct Mailbox *m, struct Message **ptr)
Close a message.
struct Message * mx_msg_open(struct Mailbox *m, struct Email *e)
Return a stream pointer for a message.
struct Message * mx_msg_open_new(struct Mailbox *m, const struct Email *e, MsgOpenFlags flags)
Open a new message.
#define MUTT_MSG_NO_FLAGS
No flags are set.
uint8_t OpenMailboxFlags
Flags for mutt_open_mailbox(), e.g. MUTT_NOSORT.
#define MUTT_NEWFOLDER
Create a new folder - same as MUTT_APPEND, but uses mutt_file_fopen() with mode "w" for mbox-style fo...
#define MUTT_APPEND
Open mailbox for appending messages.
MxOpenReturns
Return values for mbox_open()
@ MX_OPEN_ERROR
Open failed with an error.
@ MX_OPEN_OK
Open succeeded.
#define MUTT_MAILBOX_CHECK_FORCE_STATS
Ignore MailboxType and calculate statistics.
#define MUTT_APPENDNEW
Set in mx_open_mailbox_append if the mailbox doesn't exist.
MxStatus
Return values from mbox_check(), mbox_check_stats(), mbox_snc(), and mbox_close()
@ MX_STATUS_ERROR
An error occurred.
@ MX_STATUS_OK
No changes.
@ MX_STATUS_FLAGS
Nondestructive flags change (IMAP)
@ MX_STATUS_REOPENED
Mailbox was reopened.
@ MX_STATUS_NEW_MAIL
New mail received in Mailbox.
Notmuch virtual mailbox type.
int nm_update_filename(struct Mailbox *m, const char *old_file, const char *new_file, struct Email *e)
Change the filename.
Notmuch-specific Mailbox data.
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
@ MUTT_PROGRESS_READ
Progress tracks elements, according to $read_inc
@ MUTT_PROGRESS_WRITE
Progress tracks elements, according to $write_inc
void progress_free(struct Progress **ptr)
Free a Progress Bar.
bool progress_update(struct Progress *progress, size_t pos, int percent)
Update the state of the progress bar.
struct Progress * progress_new(const char *msg, enum ProgressType type, size_t size)
Create a new Progress Bar.
void mutt_qsort_r(void *base, size_t nmemb, size_t size, sort_t compar, void *sdata)
Sort an array, where the comparator has access to opaque data rather than requiring global variables.
uint64_t mutt_rand64(void)
Create a 64-bit random number.
Assorted sorting methods.
#define mutt_numeric_cmp(a, b)
A group of associated Mailboxes.
struct Body * parts
parts of a multipart or message/rfc822
LOFF_T offset
offset where the actual data begins
LOFF_T length
length (in bytes) of attachment
String manipulation buffer.
char * dptr
Current read/write position.
char * data
Pointer to data.
The envelope/body of an email.
bool purge
Skip trash folder when deleting.
struct Envelope * env
Envelope information.
void * edata
Driver-specific data.
int lines
How many lines in the body of this message?
struct Body * body
List of MIME parts.
bool old
Email is seen, but unread.
void(* edata_free)(void **ptr)
Free the private data attached to the Email.
bool changed
Email has been edited.
bool attach_del
Has an attachment marked for deletion.
bool flagged
Marked important?
time_t date_sent
Time when the message was sent (UTC)
bool replied
Email has been replied to.
char * path
Path of Email (for local Mailboxes)
bool deleted
Email is deleted.
int index
The absolute (unsorted) message number.
bool trash
Message is marked as trashed on disk (used by the maildir_trash option)
time_t received
Time when the message was placed in the mailbox.
unsigned char changed
Changed fields, e.g. MUTT_ENV_CHANGED_SUBJECT.
Wrapper for Email retrieved from the header cache.
uint32_t uidvalidity
IMAP-specific UIDVALIDITY.
struct Email * email
Retrieved email.
void(* mdata_free)(void **ptr)
Free the private data attached to the Mailbox.
bool changed
Mailbox has been modified.
bool has_new
Mailbox has new mail.
int msg_new
Number of new messages.
int msg_count
Total number of messages.
enum MailboxType type
Mailbox type.
void * mdata
Driver specific data.
struct Email ** emails
Array of Emails.
int msg_deleted
Number of deleted messages.
int msg_flagged
Number of flagged messages.
struct timespec last_visited
Time of last exit from this mailbox.
bool verbose
Display status messages?
int msg_unread
Number of unread messages.
Maildir-specific Email data -.
Maildir-specific Mailbox data -.
mode_t mh_umask
umask to use when creating files
struct timespec mtime_cur
Timestamp of the 'cur' dir.
struct timespec mtime
Time Mailbox was last changed.
A local copy of an email.
FILE * fp
pointer to the message data
char * path
path to temp file
char * committed_path
the final path generated by mx_msg_commit()
time_t received
Time at which this message was received.
enum MailboxType type
Mailbox type, e.g. MUTT_IMAP.
Container for Accounts, Notifications.
struct ConfigSubset * sub
Inherited config items.