doveadm-mail-fetch.c revision 1631885636d15abaf0375304a17928c8c23782cd
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen ARRAY_DEFINE(fields, const struct fetch_field);
abc79eec93e58e0152cd1d483f37be66c26811b9Timo Sirainenstatic int fetch_user(struct fetch_cmd_context *ctx)
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen str_append(ctx->hdr, ctx->ctx.cur_mail_user->username);
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainenstatic int fetch_mailbox(struct fetch_cmd_context *ctx)
a8d47e2427558d5011dfc75694b704760c1ef8baTimo Sirainen unsigned int len;
a8d47e2427558d5011dfc75694b704760c1ef8baTimo Sirainen if (mail_get_special(ctx->mail, MAIL_FETCH_MAILBOX_NAME, &value) < 0)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* not a valid mUTF-7 name, fallback to showing it as-is */
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenstatic int fetch_mailbox_guid(struct fetch_cmd_context *ctx)
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen if (mailbox_get_guid(ctx->mail->box, guid) < 0)
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen str_append(ctx->hdr, mail_guid_128_to_string(guid));
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenstatic int fetch_seq(struct fetch_cmd_context *ctx)
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenstatic int fetch_uid(struct fetch_cmd_context *ctx)
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenstatic int fetch_guid(struct fetch_cmd_context *ctx)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (mail_get_special(ctx->mail, MAIL_FETCH_GUID, &value) < 0)
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainenstatic int fetch_flags(struct fetch_cmd_context *ctx)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen imap_write_flags(ctx->hdr, mail_get_flags(ctx->mail),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic void flush_hdr(struct fetch_cmd_context *ctx)
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen o_stream_send(ctx->output, str_data(ctx->hdr), str_len(ctx->hdr));
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenstatic int fetch_hdr(struct fetch_cmd_context *ctx)
5666a3d6a7ea89362b8d9e8b39b15424cd9d6388Timo Sirainen if (mail_get_stream(ctx->mail, &hdr_size, NULL, &input) < 0)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen input = i_stream_create_limit(input, hdr_size.physical_size);
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen if (o_stream_send_istream(ctx->output, input) <= 0)
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainenstatic int fetch_hdr_field(struct fetch_cmd_context *ctx)
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen const char *const *value;
e51cfb5506de764499cb5b81a098b23cf46f90f1Timo Sirainen if (mail_get_headers(ctx->mail, ctx->cur_field->name, &value) < 0)
e51cfb5506de764499cb5b81a098b23cf46f90f1Timo Sirainen str_printfa(ctx->hdr, "hdr.%s: ", ctx->cur_field->name);
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainenstatic int fetch_body(struct fetch_cmd_context *ctx)
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen if (mail_get_stream(ctx->mail, &hdr_size, NULL, &input) < 0)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (o_stream_send_istream(ctx->output, input) <= 0)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic int fetch_text(struct fetch_cmd_context *ctx)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (mail_get_stream(ctx->mail, NULL, NULL, &input) < 0)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (o_stream_send_istream(ctx->output, input) <= 0)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic int fetch_size_physical(struct fetch_cmd_context *ctx)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (mail_get_physical_size(ctx->mail, &size) < 0)
88b0427d90f1d3c2c5fb3171e53a505c46e2c39dTimo Sirainenstatic int fetch_size_virtual(struct fetch_cmd_context *ctx)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (mail_get_virtual_size(ctx->mail, &size) < 0)
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainenstatic int fetch_date_received(struct fetch_cmd_context *ctx)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen if (mail_get_received_date(ctx->mail, &t) < 0)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainenstatic int fetch_date_sent(struct fetch_cmd_context *ctx)
3398d5e2b883812de5d569721c8294b581e1d9e6Timo Sirainen str_printfa(ctx->hdr, "%s (%c%02u%02u)", unixdate2str(t),
3398d5e2b883812de5d569721c8294b581e1d9e6Timo Sirainenstatic int fetch_date_saved(struct fetch_cmd_context *ctx)
96f2533c48ce5def0004931606a2fdf275578880Timo Sirainenstatic int fetch_imap_envelope(struct fetch_cmd_context *ctx)
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen if (mail_get_special(ctx->mail, MAIL_FETCH_IMAP_ENVELOPE, &value) < 0)
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainenstatic int fetch_imap_body(struct fetch_cmd_context *ctx)
fc464e5b2b2ab4d415a5d5b90ce4475d34620a75Timo Sirainen if (mail_get_special(ctx->mail, MAIL_FETCH_IMAP_BODY, &value) < 0)
d2c853636ec2d99c9f96da877ff520a3b86a18baTimo Sirainenstatic int fetch_imap_bodystructure(struct fetch_cmd_context *ctx)
d2c853636ec2d99c9f96da877ff520a3b86a18baTimo Sirainen if (mail_get_special(ctx->mail, MAIL_FETCH_IMAP_BODYSTRUCTURE, &value) < 0)
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainenstatic const struct fetch_field fetch_fields[] = {
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen { "hdr", MAIL_FETCH_STREAM_HEADER, fetch_hdr },
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen { "body", MAIL_FETCH_STREAM_BODY, fetch_body },
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen { "size.physical", MAIL_FETCH_PHYSICAL_SIZE, fetch_size_physical },
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen { "size.virtual", MAIL_FETCH_VIRTUAL_SIZE, fetch_size_virtual },
dd7cbb32412c2f4d2d223af66672535bc1237246Timo Sirainen { "date.received", MAIL_FETCH_RECEIVED_DATE, fetch_date_received },
dd7cbb32412c2f4d2d223af66672535bc1237246Timo Sirainen { "date.sent", MAIL_FETCH_DATE, fetch_date_sent },
dd7cbb32412c2f4d2d223af66672535bc1237246Timo Sirainen { "date.saved", MAIL_FETCH_SAVE_DATE, fetch_date_saved },
dd7cbb32412c2f4d2d223af66672535bc1237246Timo Sirainen { "imap.envelope", MAIL_FETCH_IMAP_ENVELOPE, fetch_imap_envelope },
dd7cbb32412c2f4d2d223af66672535bc1237246Timo Sirainen { "imap.body", MAIL_FETCH_IMAP_BODY, fetch_imap_body },
dd7cbb32412c2f4d2d223af66672535bc1237246Timo Sirainen { "imap.bodystructure", MAIL_FETCH_IMAP_BODYSTRUCTURE, fetch_imap_bodystructure }
dd7cbb32412c2f4d2d223af66672535bc1237246Timo Sirainenstatic const struct fetch_field *fetch_field_find(const char *name)
dd7cbb32412c2f4d2d223af66672535bc1237246Timo Sirainen unsigned int i;
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen for (i = 0; i < N_ELEMENTS(fetch_fields); i++) {
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenstatic void print_fetch_fields(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen unsigned int i;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen fprintf(stderr, "Available fetch fields: %s", fetch_fields[0].name);
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen for (i = 1; i < N_ELEMENTS(fetch_fields); i++)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void parse_fetch_fields(struct fetch_cmd_context *ctx, const char *str)
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen (void)array_append_space(&ctx->header_fields);
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen ctx->print_field_prefix = array_count(&ctx->fields) > 1;
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainenstatic void cmd_fetch_mail(struct fetch_cmd_context *ctx)
318ef3683d67683173f1b552cf5f9af4375b3017Timo Sirainen if (ctx->print_field_prefix && field->print != fetch_hdr_field)
318ef3683d67683173f1b552cf5f9af4375b3017Timo Sirainen i_error("fetch(%s) failed for box=%s uid=%u: %s",
318ef3683d67683173f1b552cf5f9af4375b3017Timo Sirainen mail->uid, mail_storage_get_last_error(storage, NULL));
318ef3683d67683173f1b552cf5f9af4375b3017Timo Sirainencmd_fetch_box(struct fetch_cmd_context *ctx, const struct mailbox_info *info)
318ef3683d67683173f1b552cf5f9af4375b3017Timo Sirainen struct mailbox_header_lookup_ctx *headers = NULL;
318ef3683d67683173f1b552cf5f9af4375b3017Timo Sirainen if (doveadm_mail_iter_init(info, ctx->ctx.search_args,
unsigned int count;
case SEARCH_MAILBOX:
case SEARCH_MAILBOX_GUID:
case SEARCH_SEQSET:
case SEARCH_UIDSET:
} T_END;
const char *const args[])