62#define CONTENT_TOO_BIG (1 << 30)
67 LOFF_T end_off,
bool digest,
int *counter);
78 for (; (*header !=
'\0'); header++)
80 if ((*header < 33) || (*header > 126) || (*header ==
':'))
98 for (; (*header !=
'\0'); header++)
100 if ((*header ==
'\n') || (*header ==
'\r'))
116static void parse_parameters(
struct ParameterList *pl,
const char *s,
bool allow_value_spaces)
119 const char *p = NULL;
126 if (allow_value_spaces)
136 p = strpbrk(s,
"=;");
170 bool state_ascii =
true;
179 if ((s[1] ==
'(') && ((s[2] ==
'B') || (s[2] ==
'J')))
185 if (state_ascii && (*s ==
'"'))
206 for (; *s && *s !=
' ' && *s !=
';'; s++)
211 }
while (allow_value_spaces && (*s ==
' '));
232 if ((*s !=
';') && !(s = strchr(s,
';')))
370 if (!s || (*s ==
'\0'))
378 for (
const char *p = decoded, *beg = NULL; *p; p++)
386 if (beg && (*p ==
'>'))
389 *len = p - decoded + 1;
442 char *pc = strchr(s,
';');
464 char *subtype = strchr(s,
'/');
468 for (pc = subtype; *pc && !
mutt_isspace(*pc) && (*pc !=
';'); pc++)
504 char buf[128] = { 0 };
507 snprintf(buf,
sizeof(buf),
"x-%s", s);
545 autocrypt->
next = head;
609 struct ListHead links = { 0 };
624 if (!mailto_only && !value)
643 if (!links->stqh_last)
647 for (
const char *beg = body; (beg = strchr(beg,
'<')) != NULL; beg++)
651 const char *end = strchr(beg,
'>');
686 if (!headers->
archive.stqh_last)
688 if (!headers->
help.stqh_last)
690 if (!headers->
owner.stqh_last)
692 if (!headers->
post.stqh_last)
740 const char *p = strpbrk(lines,
": \t");
741 if (!p || (*p !=
':'))
748 if (
is_from(lines, NULL, 0, &t))
754 const size_t name_len = p - lines;
759 struct ListHead *value = NULL;
760 if ((name_len == 12) &&
eqi12(lines,
"List-Archive"))
762 else if ((name_len == 9) &&
eqi9(lines,
"List-Help"))
763 value = &headers->
help;
764 else if ((name_len == 10) &&
eqi10(lines,
"List-Owner"))
765 value = &headers->
owner;
766 else if ((name_len == 9) &&
eqi9(lines,
"List-Post"))
767 value = &headers->
post;
768 else if ((name_len == 14) &&
eqi14(lines,
"List-Subscribe"))
770 else if ((name_len == 16) &&
eqi16(lines,
"List-Unsubscribe"))
799 const char *name,
size_t name_len,
const char *body,
800 bool user_hdrs,
bool weed,
bool do_2047)
805 bool matched =
false;
807 switch (name[0] | 0x20)
810 if ((name_len == 13) &&
eqi12(name + 1,
"pparently-to"))
815 else if ((name_len == 15) &&
eqi14(name + 1,
"pparently-from"))
821 else if ((name_len == 9) &&
eqi8(name + 1,
"utocrypt"))
830 else if ((name_len == 16) &&
eqi15(name + 1,
"utocrypt-gossip"))
843 if ((name_len == 3) &&
eqi2(name + 1,
"cc"))
851 if ((name_len == 2) &&
eqi1(name + 1,
"c"))
858 if ((name_len >= 12) &&
eqi8(name,
"content-"))
860 if ((name_len == 12) &&
eqi4(name + 8,
"type"))
866 else if ((name_len == 16) &&
eqi8(name + 8,
"language"))
872 else if ((name_len == 25) &&
eqi17(name + 8,
"transfer-encoding"))
878 else if ((name_len == 14) &&
eqi8(name + 6,
"t-length"))
882 unsigned long len = 0;
887 else if ((name_len == 19) &&
eqi11(name + 8,
"description"))
896 else if ((name_len == 19) &&
eqi11(name + 8,
"disposition"))
907 if ((name_len != 4) || !
eqi4(name,
"date"))
913 struct Tz tz = { 0 };
927 if ((name_len == 7) &&
eqi6(name + 1,
"xpires") && e)
938 if ((name_len == 4) &&
eqi4(name,
"from"))
943 else if ((name_len == 11) &&
eqi10(name + 1,
"ollowup-to"))
955 if ((name_len != 11) || !
eqi10(name + 1,
"n-reply-to"))
967 if ((name_len == 5) &&
eqi4(name + 1,
"ines"))
978 else if ((name_len == 9) &&
eqi8(name + 1,
"ist-post"))
989 if (c_auto_subscribe)
995 else if ((name_len == 14) &&
eqi13(name + 1,
"ist-subscribe"))
1006 else if ((name_len == 16) &&
eqi15(name + 1,
"ist-unsubscribe"))
1020 if ((name_len == 12) &&
eqi11(name + 1,
"ime-version"))
1026 else if ((name_len == 10) &&
eqi9(name + 1,
"essage-id"))
1035 if ((name_len >= 13) &&
eqi4(name + 1,
"ail-"))
1037 if ((name_len == 13) &&
eqi8(name + 5,
"reply-to"))
1044 else if ((name_len == 16) &&
eqi11(name + 5,
"followup-to"))
1054 if ((name_len == 10) &&
eqi9(name + 1,
"ewsgroups"))
1065 if ((name_len == 12) &&
eqi11(name + 1,
"rganization"))
1073 if ((name_len == 10) &&
eqi9(name + 1,
"eferences"))
1079 else if ((name_len == 8) &&
eqi8(name,
"reply-to"))
1084 else if ((name_len == 11) &&
eqi10(name + 1,
"eturn-path"))
1089 else if ((name_len == 8) &&
eqi8(name,
"received"))
1093 const char *d = strrchr(body,
';');
1105 if ((name_len == 7) &&
eqi6(name + 1,
"ubject"))
1111 else if ((name_len == 6) &&
eqi5(name + 1,
"ender"))
1116 else if ((name_len == 6) &&
eqi5(name + 1,
"tatus"))
1141 else if (e && (name_len == 10) &&
eqi1(name + 1,
"u") &&
1142 (
eqi8(name + 2,
"persedes") ||
eqi8(name + 2,
"percedes")))
1150 if ((name_len == 2) &&
eqi1(name + 1,
"o"))
1158 if ((name_len == 8) &&
eqi8(name,
"x-status"))
1183 else if ((name_len == 7) &&
eqi6(name + 1,
"-label"))
1189 else if ((name_len == 12) &&
eqi11(name + 1,
"-comment-to"))
1195 else if ((name_len == 4) &&
eqi4(name,
"xref"))
1201 else if ((name_len == 13) &&
eqi12(name + 1,
"-original-to"))
1213 if (!matched && user_hdrs)
1251 char line[1024] = { 0 };
1256 if (!fgets(line,
sizeof(line), fp))
1275 size_t off = linelen - 1;
1276 if (line[off] ==
'\n')
1286 if ((ch !=
' ') && (ch !=
'\t'))
1296 while (((ch = fgetc(fp)) ==
' ') || (ch ==
'\t'))
1302 line[off + 1] =
' ';
1332 LOFF_T loc = ftello(fp);
1363 LOFF_T line_start_loc = loc;
1371 p = strpbrk(lines,
": \t");
1372 if (!p || (*p !=
':'))
1381 else if (
is_from(lines, NULL, 0, &t))
1395 size_t name_len = p - lines;
1397 char buf[1024] = { 0 };
1407 if (c_spam_separator)
1493 bool matched =
false;
1505 c = strchr(line,
':');
1558 if (
id[cid_len - 1] ==
'>')
1559 id[cid_len - 1] =
'\0';
1625 subtype =
NONULL(subtype);
1641 const char *bound = NULL;
1642 static unsigned short recurse_level = 0;
1708 LOFF_T end_off,
bool digest,
int *counter)
1715 mutt_error(
_(
"multipart message has no boundary parameter"));
1719 char buf[1024] = { 0 };
1720 struct Body *head = NULL;
1721 struct Body *last = NULL;
1722 struct Body *new_body = NULL;
1726 while ((ftello(fp) < end_off) && fgets(buf,
sizeof(buf), fp))
1730 const size_t crlf = ((len > 1) && (buf[len - 2] ==
'\r')) ? 1 : 0;
1736 last->
length = ftello(fp) - last->
offset - len - 1 - crlf;
1747 for (
size_t i = len - 1;
mutt_isspace(buf[i]) && (i >= (blen + 2)); i--)
1757 else if (buf[2 + blen] ==
'\0')
1767 for (; lines > 0; lines--)
1768 if ((ftello(fp) >= end_off) || !fgets(buf,
sizeof(buf), fp))
1773 if (new_body->
offset > end_off)
1780 last->
next = new_body;
1800 if (last && (last->
length == 0) && !
final)
1804 for (last = head; last; last = last->
next)
1903 const char *tag = np->
name;
1924 char *scratch = NULL;
1929 scratch[taglen] = 0;
void mutt_addrlist_clear(struct AddressList *al)
Unlink and free all Address in an AddressList.
int mutt_addrlist_parse(struct AddressList *al, const char *s)
Parse a list of email addresses.
void mutt_auto_subscribe(const char *mailto)
Check if user is subscribed to mailing list.
const char * mutt_str_atoul(const char *str, unsigned long *dst)
Convert ASCII string to an unsigned long.
const char * mutt_str_atoui(const char *str, unsigned int *dst)
Convert ASCII string to an unsigned integer.
const char * mutt_str_atoi(const char *str, int *dst)
Convert ASCII string to an integer.
Autocrypt end-to-end encryption.
int mutt_autocrypt_process_autocrypt_header(struct Email *e, struct Envelope *env)
Parse an Autocrypt email header.
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
bool buf_is_empty(const struct Buffer *buf)
Is the Buffer empty?
size_t buf_addch(struct Buffer *buf, char c)
Add a single character to a Buffer.
size_t buf_addstr(struct Buffer *buf, const char *s)
Add a string to a Buffer.
char * buf_strdup(const struct Buffer *buf)
Copy a Buffer's string.
void buf_alloc(struct Buffer *buf, size_t new_size)
Make sure a buffer can store at least new_size bytes.
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string 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.
const struct Slist * cc_assumed_charset(void)
Get the cached value of $assumed_charset.
Convenience wrapper for the core headers.
bool mutt_isspace(int arg)
Wrapper for isspace(3)
void mutt_body_free(struct Body **ptr)
Free a Body.
struct Body * mutt_body_new(void)
Create a new Body.
Representation of the body of an email.
struct Email * email_new(void)
Create a new Email.
Email private Module data.
int mutt_rfc822_parse_line(struct Envelope *env, struct Email *e, const char *name, size_t name_len, const char *body, bool user_hdrs, bool weed, bool do_2047)
Parse an email header.
struct Body * mutt_rfc822_parse_message(FILE *fp, struct Body *b)
Parse a Message/RFC822 body.
void mutt_parse_part(FILE *fp, struct Body *b)
Parse a MIME part.
void mutt_parse_content_type(const char *s, struct Body *b)
Parse a content type.
size_t mutt_rfc822_read_line(FILE *fp, struct Buffer *buf)
Read a header line from a file.
char * mutt_rfc2369_first_mailto(const char *body)
Extract the first mailto: URL from an RFC 2369 list.
struct Body * mutt_read_mime_header(FILE *fp, bool digest)
Parse a MIME header.
static struct AutocryptHeader * parse_autocrypt(struct AutocryptHeader *head, const char *s)
Parse an Autocrypt header line.
static void parse_references(struct ListHead *head, const char *s)
Parse references from an email header.
bool mutt_matches_ignore(const char *s)
Does the string match the ignore list.
enum ContentType mutt_check_mime_type(const char *s)
Check a MIME type string.
static struct Body * rfc822_parse_message(FILE *fp, struct Body *parent, int *counter)
Parse a Message/RFC822 body.
struct Envelope * mutt_rfc822_read_header(FILE *fp, struct Email *e, bool user_hdrs, bool weed)
Parses an RFC822 header.
static void parse_content_language(const char *s, struct Body *b)
Read the content's language.
static bool mailto_header_allowed(const char *s, struct ListHead *h)
Is the string in the list.
bool mutt_parse_mailto(struct Envelope *env, char **body, const char *src)
Parse a mailto:// url.
int mutt_check_encoding(const char *c)
Check the encoding type.
static void parse_content_disposition(const char *s, struct Body *b)
Parse a content disposition.
struct Body * mutt_parse_multipart(FILE *fp, const char *boundary, LOFF_T end_off, bool digest)
Parse a multipart structure.
size_t mutt_rfc2369_parse(const char *body, struct ListHead *links)
Extract URLs from an RFC 2369 list header.
void mutt_filter_commandline_header_tag(char *header)
Sanitise characters in a header tag.
char * mutt_extract_message_id(const char *s, size_t *len)
Find a Message-ID.
static void parse_part(FILE *fp, struct Body *b, int *counter)
Parse a MIME part.
static struct Body * parse_multipart(FILE *fp, const char *boundary, LOFF_T end_off, bool digest, int *counter)
Parse a multipart structure.
static void rfc2369_list_headers_ensure_init(struct Rfc2369ListHeaders *headers)
Initialise RFC 2369 header lists.
bool mutt_is_message_type(int type, const char *subtype)
Determine if a mime type matches a message or not.
void mutt_rfc2369_list_headers_free(struct Rfc2369ListHeaders *headers)
Free RFC 2369 mailing-list header values.
void mutt_filter_commandline_header_value(char *header)
Sanitise characters in a header value.
static char * rfc2369_first_value(const char *body, bool mailto_only)
Extract the first useful URL from an RFC 2369 list.
static void parse_parameters(struct ParameterList *pl, const char *s, bool allow_value_spaces)
Parse a list of Parameters.
void mutt_rfc2369_read_headers(FILE *fp, struct Rfc2369ListHeaders *headers)
Read RFC 2369 mailing-list headers.
#define CONTENT_TOO_BIG
Maximum reasonable Content-Length value (1 GiB) to prevent overflow.
Miscellaneous email parsing routines.
Representation of an email.
void mutt_env_free(struct Envelope **ptr)
Free an Envelope.
struct Envelope * mutt_env_new(void)
Create a new Envelope.
void mutt_env_set_subject(struct Envelope *env, const char *subj)
Set both subject and real_subj to subj.
struct AutocryptHeader * mutt_autocrypthdr_new(void)
Create a new AutocryptHeader.
void mutt_autocrypthdr_free(struct AutocryptHeader **ptr)
Free an AutocryptHeader.
Representation of an email header (envelope)
static bool eqi17(const char *a, const char b[17])
eqi17 - Compare two 17-byte strings, ignoring case - See: Case-insensitive fixed-chunk comparisons
static bool eqi9(const char *a, const char b[9])
eqi9 - Compare two 9-byte strings, ignoring case - See: Case-insensitive fixed-chunk comparisons
static bool eqi10(const char *a, const char b[10])
eqi10 - Compare two 10-byte strings, ignoring case - See: Case-insensitive fixed-chunk comparisons
static bool eqi8(const char *a, const char b[8])
Compare two 8-byte strings, ignoring case - See: Case-insensitive fixed-chunk comparisons.
static bool eqi11(const char *a, const char b[11])
eqi11 - Compare two 11-byte strings, ignoring case - See: Case-insensitive fixed-chunk comparisons
static bool eqi6(const char *a, const char b[6])
eqi6 - Compare two 6-byte strings, ignoring case - See: Case-insensitive fixed-chunk comparisons
static bool eqi14(const char *a, const char b[14])
eqi14 - Compare two 14-byte strings, ignoring case - See: Case-insensitive fixed-chunk comparisons
static bool eqi13(const char *a, const char b[13])
eqi13 - Compare two 13-byte strings, ignoring case - See: Case-insensitive fixed-chunk comparisons
static bool eqi4(const char *a, const char b[4])
Compare two 4-byte strings, ignoring case - See: Case-insensitive fixed-chunk comparisons.
static bool eqi5(const char *a, const char b[5])
eqi5 - Compare two 5-byte strings, ignoring case - See: Case-insensitive fixed-chunk comparisons
static bool eqi12(const char *a, const char b[12])
eqi12 - Compare two 12-byte strings, ignoring case - See: Case-insensitive fixed-chunk comparisons
static bool eqi16(const char *a, const char b[16])
eqi16 - Compare two 16-byte strings, ignoring case - See: Case-insensitive fixed-chunk comparisons
static bool eqi15(const char *a, const char b[15])
eqi15 - Compare two 15-byte strings, ignoring case - See: Case-insensitive fixed-chunk comparisons
static bool eqi1(const char *a, const char b[1])
Compare two 1-byte strings, ignoring case - See: Case-insensitive fixed-chunk comparisons.
static bool eqi2(const char *a, const char b[2])
Compare two 2-byte strings, ignoring case - See: Case-insensitive fixed-chunk comparisons.
bool mutt_file_seek(FILE *fp, LOFF_T offset, int whence)
Wrapper for fseeko with error handling.
bool is_from(const char *s, char *path, size_t pathlen, time_t *tp)
Is a string a 'From' header line?
Determine who the email is from.
#define mutt_debug(LEVEL,...)
struct ListNode * mutt_list_insert_tail(struct ListHead *h, char *s)
Append a string to the end of a List.
struct ListNode * mutt_list_insert_head(struct ListHead *h, char *s)
Insert a string at the beginning of a List.
void mutt_list_free(struct ListHead *h)
Free a List AND its strings.
bool mutt_list_match(const char *s, struct ListHead *h)
Is the string in the list (see notes)
@ LL_DEBUG5
Log at debug level 5.
@ LL_DEBUG2
Log at debug level 2.
@ LL_DEBUG1
Log at debug level 1.
#define FREE(x)
Free memory and set the pointer to NULL.
#define MIN(a, b)
Return the minimum of two values.
Constants and macros for managing MIME encoding.
@ ENC_UUENCODED
UUEncoded text.
@ ENC_OTHER
Encoding unknown.
@ ENC_BASE64
Base-64 encoded text.
@ ENC_QUOTED_PRINTABLE
Quoted-printable text.
#define MUTT_MIME_MAX_DEPTH
Maximum nesting depth for MIME parts to prevent stack overflow.
@ TYPE_AUDIO
Type: 'audio/*'.
@ TYPE_IMAGE
Type: 'image/*'.
@ TYPE_OTHER
Unknown Content-Type.
@ TYPE_MESSAGE
Type: 'message/*'.
@ TYPE_MODEL
Type: 'model/*'.
@ TYPE_MULTIPART
Type: 'multipart/*'.
@ TYPE_APPLICATION
Type: 'application/*'.
@ TYPE_TEXT
Type: 'text/*'.
@ TYPE_ANY
Type: '' or '.'.
@ TYPE_VIDEO
Type: 'video/*'.
@ DISP_ATTACH
Content is attached.
@ DISP_INLINE
Content is inline.
@ DISP_FORM_DATA
Content is form-data.
#define MUTT_MIME_MAX_PARTS
Maximum number of MIME parts to process to prevent DoS.
@ MODULE_ID_EMAIL
ModuleEmail, Email code
const char * mutt_ch_get_default_charset(const struct Slist *const assumed_charset)
Get the default character set.
int mutt_date_local_tz(time_t t)
Calculate the local timezone in seconds east of UTC.
time_t mutt_date_now(void)
Return the number of seconds since the Unix epoch.
time_t mutt_date_parse_date(const char *s, struct Tz *tz_out)
Parse a date string in RFC822 format.
Convenience wrapper for the library headers.
bool mutt_replacelist_match(struct ReplaceList *rl, char *buf, size_t buflen, const char *str)
Does a string match a pattern?
bool mutt_regexlist_match(struct RegexList *rl, const char *str)
Does a string match any Regex in the list?
bool slist_is_empty(const struct Slist *list)
Is the slist empty?
char * mutt_strn_dup(const char *begin, size_t len)
Duplicate a sub-string.
void mutt_str_remove_trailing_ws(char *s)
Trim trailing whitespace from a string.
bool mutt_istr_equal(const char *a, const char *b)
Compare two strings, ignoring case.
char * mutt_str_dup(const char *str)
Copy a string, safely.
int mutt_str_asprintf(char **strp, const char *fmt,...)
char * mutt_str_skip_email_wsp(const char *s)
Skip over whitespace as defined by RFC5322.
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.
char * mutt_str_skip_whitespace(const char *p)
Find the first non-whitespace character in a string.
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
size_t mutt_istr_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix, ignoring case.
bool mutt_istrn_equal(const char *a, const char *b, size_t num)
Check for equality of two strings ignoring case (to a maximum), safely.
char * mutt_str_replace(char **p, const char *s)
Replace one string with another.
Many unsorted constants and some structs.
void * neomutt_get_module_data(struct NeoMutt *n, enum ModuleId id)
Get the private data for a Module.
char * mutt_param_get(const struct ParameterList *pl, const char *s)
Find a matching Parameter.
void mutt_param_set(struct ParameterList *pl, const char *attribute, const char *value)
Set a Parameter.
void mutt_param_free(struct ParameterList *pl)
Free a ParameterList.
struct Parameter * mutt_param_new(void)
Create a new Parameter.
Store attributes associated with a MIME part.
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.
#define TAILQ_FOREACH(var, head, field)
#define STAILQ_INIT(head)
#define STAILQ_FOREACH(var, head, field)
#define TAILQ_HEAD_INITIALIZER(head)
#define TAILQ_EMPTY(head)
#define TAILQ_INSERT_HEAD(head, elm, field)
void rfc2047_decode_envelope(struct Envelope *env)
Decode the fields of an Envelope.
void rfc2047_decode(char **pd)
Decode any RFC2047-encoded header fields.
RFC2047 MIME extensions encoding / decoding routines.
void rfc2231_decode_parameters(struct ParameterList *pl)
Decode a Parameter list.
RFC2231 MIME Charset routines.
static bool mutt_str_is_email_wsp(char c)
Is this a whitespace character (for an email header)
char * language
content-language (RFC8255)
char * content_id
Content-Id (RFC2392)
struct Body * parts
parts of a multipart or message/rfc822
LOFF_T offset
offset where the actual data begins
char * xtype
content-type if x-unknown
struct Envelope * mime_headers
Memory hole protected headers.
LOFF_T length
length (in bytes) of attachment
struct ParameterList parameter
Parameters of the content-type.
struct Email * email
header information for message/rfc822
char * description
content-description
unsigned int disposition
content-disposition, ContentDisposition
struct Body * next
next attachment in the list
char * subtype
content-type subtype
unsigned int encoding
content-transfer-encoding, ContentEncoding
long hdr_offset
Offset in stream where the headers begin.
char * form_name
Content-Disposition form-data name param.
unsigned int type
content-type primary type, ContentType
char * filename
When sending a message, this is the file to which this structure refers.
String manipulation buffer.
char * data
Pointer to data.
Email private Module data.
struct ListHead unignore
Header patterns to unignore.
struct ListHead ignore
Header patterns to ignore.
struct ReplaceList spam
Regexes and patterns to match spam emails.
struct ListHead mail_to_allow
Permitted fields in a mailto: url.
struct RegexList no_spam
Regexes to identify non-spam emails.
The envelope/body of an email.
unsigned int zminutes
Minutes away from UTC.
struct Envelope * env
Envelope information.
bool mime
Has a MIME-Version header?
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.
bool zoccident
True, if west of UTC, False if east.
LOFF_T offset
Where in the stream does this message begin?
bool flagged
Marked important?
unsigned int zhours
Hours away from UTC.
time_t date_sent
Time when the message was sent (UTC)
bool replied
Email has been replied to.
bool expired
Already expired?
bool deleted
Email is deleted.
time_t received
Time when the message was placed in the mailbox.
struct ListHead userhdrs
user defined headers
char * supersedes
Supersedes header.
char * list_subscribe
This stores a list URI, preferring mailto.
struct AddressList return_path
Return path for the Email.
char *const subject
Email's subject.
struct AddressList to
Email's 'To' list.
char * followup_to
List of 'followup-to' fields.
struct AddressList reply_to
Email's 'reply-to'.
char * message_id
Message ID.
char * x_comment_to
List of 'X-comment-to' fields.
struct AddressList x_original_to
Email's 'X-Original-to'.
struct AutocryptHeader * autocrypt_gossip
Autocrypt Gossip header.
char * newsgroups
List of newsgroups.
struct AddressList mail_followup_to
Email's 'mail-followup-to'.
struct AddressList cc
Email's 'Cc' list.
struct AddressList sender
Email's sender.
struct ListHead references
message references (in reverse order)
struct AutocryptHeader * autocrypt
Autocrypt header.
struct Buffer spam
Spam header.
struct ListHead in_reply_to
in-reply-to header content
struct AddressList bcc
Email's 'Bcc' list.
char * xref
List of cross-references.
char * organization
Organisation header.
char * list_post
This stores a mailto URL, or nothing.
char * list_unsubscribe
This stores a list URI, preferring mailto.
struct AddressList from
Email's 'From' list.
Container for Accounts, Notifications.
struct ConfigSubset * sub
Inherited config items.
Attribute associated with a MIME part.
char * attribute
Parameter name.
char * value
Parameter value.
List of recognised Timezones.
unsigned char zminutes
Minutes away from UTC.
bool zoccident
True if west of UTC, False if East.
unsigned char zhours
Hours away from UTC.
A parsed URL proto://user:password@host:port/path?a=1&b=2
struct UrlQueryList query_strings
List of query strings.
char * src
Raw URL string.
struct Url * url_parse(const char *src)
Fill in Url.
void url_free(struct Url **ptr)
Free the contents of a URL.
Parse and identify different URL schemes.