doveadm-mail-fetch.c revision e1ba963457988db73650fbf972398e1d0e2318b6
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (c) 2010-2015 Dovecot authors, see the included COPYING file */
4b41116563110d00330896a568eff1078c382827Timo Sirainenstatic int fetch_user(struct fetch_cmd_context *ctx)
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen doveadm_print(ctx->ctx.cur_mail_user->username);
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenstatic int fetch_mailbox(struct fetch_cmd_context *ctx)
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen if (mail_get_special(ctx->mail, MAIL_FETCH_MAILBOX_NAME, &value) < 0)
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenstatic int fetch_mailbox_guid(struct fetch_cmd_context *ctx)
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen if (mailbox_get_metadata(ctx->mail->box, MAILBOX_METADATA_GUID,
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainen doveadm_print(guid_128_to_string(metadata.guid));
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenstatic int fetch_seq(struct fetch_cmd_context *ctx)
4b41116563110d00330896a568eff1078c382827Timo Sirainenstatic int fetch_uid(struct fetch_cmd_context *ctx)
fe6c1556d3529a6376d4cbb3766c34aebde0de99Timo Sirainenstatic int fetch_guid(struct fetch_cmd_context *ctx)
ccc895c0358108d2304239063e940b7d75f364abTimo Sirainen if (mail_get_special(ctx->mail, MAIL_FETCH_GUID, &value) < 0)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenstatic int fetch_flags(struct fetch_cmd_context *ctx)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen imap_write_flags(str, mail_get_flags(ctx->mail),
4b41116563110d00330896a568eff1078c382827Timo Sirainenstatic int fetch_modseq(struct fetch_cmd_context *ctx)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen doveadm_print_num(mail_get_modseq(ctx->mail));
345212e8f61ebf14ff4f80df26df9e655eb5121eTimo Sirainenstatic int fetch_hdr(struct fetch_cmd_context *ctx)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen if (mail_get_hdr_stream(ctx->mail, &hdr_size, &input) < 0)
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen input = i_stream_create_limit(input, hdr_size.physical_size);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainenstatic int fetch_hdr_field(struct fetch_cmd_context *ctx)
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen const char *const *value, *filter, *name = ctx->cur_field->name;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen if (filter != NULL && strcmp(filter, "utf8") == 0) {
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen if (mail_get_headers_utf8(ctx->mail, name, &value) < 0)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen if (mail_get_headers(ctx->mail, name, &value) < 0)
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen if (filter == NULL || strcmp(filter, "utf8") == 0) {
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen /* print the header as-is */
a0b0d629931773c17a236f6214adbe0e13b9b3fdTimo Sirainen addr = message_address_parse(pool_datastack_create(),
54d42552005111841ab45ec9ca7559075fabd5dfTimo Sirainenstatic int fetch_body(struct fetch_cmd_context *ctx)
54d42552005111841ab45ec9ca7559075fabd5dfTimo Sirainen if (mail_get_stream(ctx->mail, &hdr_size, NULL, &input) < 0)
54d42552005111841ab45ec9ca7559075fabd5dfTimo Sirainenstatic int fetch_body_snippet(struct fetch_cmd_context *ctx)
64a67c0296b120b6e15169ac9d84dec964e55969Timo Sirainen if (mail_get_special(ctx->mail, MAIL_FETCH_BODY_SNIPPET, &value) < 0)
54d42552005111841ab45ec9ca7559075fabd5dfTimo Sirainen /* [0] contains the snippet algorithm, skip over it */
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainenstatic int fetch_text(struct fetch_cmd_context *ctx)
a5c8dc283ef673fcdae158513b8032e74b45f59aTimo Sirainen if (mail_get_stream(ctx->mail, NULL, NULL, &input) < 0)
aa215ab623706463cea1d047f975ffe51d3f0c05Timo Sirainenstatic int fetch_text_utf8(struct fetch_cmd_context *ctx)
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen if (mail_get_stream(ctx->mail, NULL, NULL, &input) < 0)
1b5366b2234892f8930a29351da06b193e385150Timo Sirainen parser = message_parser_init(pool_datastack_create(), input,
64a67c0296b120b6e15169ac9d84dec964e55969Timo Sirainen while ((ret = message_parser_parse_next_block(parser, &raw_block)) > 0) {
1b5366b2234892f8930a29351da06b193e385150Timo Sirainen if (!message_decoder_decode_next_block(decoder, &raw_block,
f480b30abdddf6f1beb8a2c5b1ce4bf8999400dbTimo Sirainen i_error("read(%s) failed: %s", i_stream_get_name(input),
64a67c0296b120b6e15169ac9d84dec964e55969Timo Sirainenstatic int fetch_size_physical(struct fetch_cmd_context *ctx)
64a67c0296b120b6e15169ac9d84dec964e55969Timo Sirainen if (mail_get_physical_size(ctx->mail, &size) < 0)
59151b71059df1190acd75d8717ed04a7920c862Timo Sirainenstatic int fetch_size_virtual(struct fetch_cmd_context *ctx)
64a67c0296b120b6e15169ac9d84dec964e55969Timo Sirainen if (mail_get_virtual_size(ctx->mail, &size) < 0)
64a67c0296b120b6e15169ac9d84dec964e55969Timo Sirainenstatic int fetch_date_received(struct fetch_cmd_context *ctx)
64a67c0296b120b6e15169ac9d84dec964e55969Timo Sirainen if (mail_get_received_date(ctx->mail, &t) < 0)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenstatic int fetch_date_sent(struct fetch_cmd_context *ctx)
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen doveadm_print(t_strdup_printf("%s (%c%02u%02u)", unixdate2str(t),
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainenstatic int fetch_date_saved(struct fetch_cmd_context *ctx)
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenstatic int fetch_imap_envelope(struct fetch_cmd_context *ctx)
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen if (mail_get_special(ctx->mail, MAIL_FETCH_IMAP_ENVELOPE, &value) < 0)
87460b08cb97b31cde640d4975a6aa2c1d0e7226Timo Sirainenstatic int fetch_imap_body(struct fetch_cmd_context *ctx)
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen if (mail_get_special(ctx->mail, MAIL_FETCH_IMAP_BODY, &value) < 0)
const char *value;
const char *value;
const char *value;
const char *value;
return &fetch_fields[i];
return NULL;
static void print_fetch_fields(void)
int ret = 0;
return ret;
int ret = 0;
&iter) < 0)
T_BEGIN {
} T_END;
return ret;
int ret = 0;
} T_END;
return ret;
const char *const args[])