Lines Matching refs:mail
17 #include "index-mail.h"
35 static void index_mail_parse_header_finish(struct index_mail *mail)
37 struct mail *_mail = &mail->mail.mail;
47 array_sort(&mail->header_lines, header_line_cmp);
49 lines = array_get(&mail->header_lines, &count);
50 match = array_get(&mail->header_match, &match_count);
51 header = mail->header_data->data;
60 if (HEADER_MATCH_USABLE(mail, match[match_idx]) &&
66 index_mail_cache_add_idx(mail, match_idx,
76 array_idx_set(&mail->header_match_lines, match_idx, &j);
121 index_mail_cache_add_idx(mail, lines[i].field_idx,
126 if (HEADER_MATCH_USABLE(mail, match[match_idx]) &&
132 index_mail_cache_add_idx(mail, match_idx, "", 0);
136 mail->data.dont_cache_field_idx = UINT_MAX;
137 mail->data.header_parser_initialized = FALSE;
156 bool index_mail_want_parse_headers(struct index_mail *mail)
158 if (mail->data.wanted_headers != NULL ||
159 mail->data.save_bodystructure_header)
162 if ((mail->data.cache_fetch_fields & MAIL_FETCH_DATE) != 0 &&
163 !mail->data.sent_date_parsed)
168 static void index_mail_parse_header_register_all_wanted(struct index_mail *mail)
170 struct mail *_mail = &mail->mail.mail;
184 array_idx_set(&mail->header_match, all_cache_fields[i].idx,
185 &mail->header_match_value);
189 void index_mail_parse_header_init(struct index_mail *mail,
192 struct index_mail_data *data = &mail->data;
196 i_assert(!mail->data.header_parser_initialized);
198 mail->header_seq = data->seq;
199 if (mail->header_data == NULL) {
200 mail->header_data = buffer_create_dynamic(default_pool, 4096);
201 i_array_init(&mail->header_lines, 32);
202 i_array_init(&mail->header_match, 32);
203 i_array_init(&mail->header_match_lines, 32);
204 mail->header_match_value = HEADER_MATCH_SKIP_COUNT;
206 buffer_set_used_size(mail->header_data, 0);
207 array_clear(&mail->header_lines);
208 array_clear(&mail->header_match_lines);
210 mail->header_match_value += HEADER_MATCH_SKIP_COUNT;
211 i_assert((mail->header_match_value &
213 if (mail->header_match_value == 0) {
215 array_clear(&mail->header_match);
216 mail->header_match_value = HEADER_MATCH_SKIP_COUNT;
222 array_idx_set(&mail->header_match, headers->idx[i],
223 &mail->header_match_value);
230 array_idx_set(&mail->header_match, headers->idx[i],
231 &mail->header_match_value);
237 index_mail_parse_header_register_all_wanted(mail);
244 field_idx = get_header_field_idx(mail->mail.mail.box, "Date",
246 match = array_get(&mail->header_match, &match_count);
248 match[field_idx] == mail->header_match_value) {
254 array_idx_set(&mail->header_match, field_idx,
255 &mail->header_match_value);
257 mail->data.header_parser_initialized = TRUE;
258 mail->data.parse_line_num = 0;
259 i_zero(&mail->data.parse_line);
262 static void index_mail_parse_finish_imap_envelope(struct index_mail *mail)
264 struct mail *_mail = &mail->mail.mail;
266 mail->ibox->cache_fields[MAIL_CACHE_IMAP_ENVELOPE].idx;
269 str = str_new(mail->mail.data_pool, 256);
270 imap_envelope_write(mail->data.envelope_data, str);
271 mail->data.envelope = str_c(str);
275 index_mail_cache_add_idx(mail, cache_field_envelope,
282 struct index_mail *mail)
284 struct mail *_mail = &mail->mail.mail;
285 struct index_mail_data *data = &mail->data;
295 message_part_data_parse_from_header(mail->mail.data_pool, part, hdr);
299 message_part_envelope_parse_from_header(mail->mail.data_pool,
303 index_mail_parse_finish_imap_envelope(mail);
308 if (mail->data.save_sent_date)
309 mail->data.sent_date_parsed = TRUE;
311 index_mail_parse_header_finish(mail);
331 match = array_get_modifiable(&mail->header_match, &count);
333 !HEADER_MATCH_USABLE(mail, match[field_idx])) {
340 data->parse_line.start_pos = str_len(mail->header_data);
342 str_append(mail->header_data, hdr->name);
343 str_append_n(mail->header_data, hdr->middle, hdr->middle_len);
349 str_append_n(mail->header_data, hdr->value, hdr->value_len);
351 str_append(mail->header_data, "\n");
353 data->parse_line.end_pos = str_len(mail->header_data);
354 array_append(&mail->header_lines, &data->parse_line, 1);
361 struct index_mail *mail)
363 index_mail_parse_header(part, hdr, mail);
368 struct index_mail *mail)
370 index_mail_parse_header(mail->data.parts, hdr, mail);
374 index_mail_cache_parse_init(struct mail *_mail, struct istream *input)
376 struct index_mail *mail = INDEX_MAIL(_mail);
379 i_assert(mail->data.tee_stream == NULL);
380 i_assert(mail->data.parser_ctx == NULL);
384 mail->data.save_sent_date = TRUE;
385 mail->data.save_bodystructure_header = TRUE;
386 mail->data.save_bodystructure_body = TRUE;
389 if (index_mail_want_cache(mail, MAIL_CACHE_BODY_SNIPPET))
390 mail->data.save_body_snippet = TRUE;
392 mail->data.tee_stream = tee_i_stream_create(input);
393 input = tee_i_stream_create_child(mail->data.tee_stream);
394 input2 = tee_i_stream_create_child(mail->data.tee_stream);
396 index_mail_parse_header_init(mail, NULL);
397 mail->data.parser_input = input;
398 mail->data.parser_ctx =
399 message_parser_init(mail->mail.data_pool, input,
405 static void index_mail_init_parser(struct index_mail *mail)
407 struct index_mail_data *data = &mail->data;
414 index_mail_set_message_parts_corrupted(&mail->mail.mail, error);
421 data->parser_ctx = message_parser_init(mail->mail.data_pool,
434 int index_mail_parse_headers(struct index_mail *mail,
438 struct index_mail_data *data = &mail->data;
444 if (mail_get_hdr_stream_because(&mail->mail.mail, NULL, reason, &input) < 0)
449 index_mail_parse_header_init(mail, headers);
454 index_mail_init_parser(mail);
457 mail);
464 index_mail_parse_header_cb, mail);
466 if (index_mail_stream_check_failure(mail) < 0)
477 struct index_mail *mail)
479 message_part_envelope_parse_from_header(mail->mail.data_pool,
480 &mail->data.envelope_data, hdr);
483 index_mail_parse_finish_imap_envelope(mail);
486 int index_mail_headers_get_envelope(struct index_mail *mail)
489 mail->ibox->cache_fields[MAIL_CACHE_IMAP_ENVELOPE].idx;
495 str = str_new(mail->mail.data_pool, 256);
496 if (index_mail_cache_lookup_field(mail, str,
498 mail->data.envelope = str_c(str);
503 old_offset = mail->data.stream == NULL ? 0 :
504 mail->data.stream->v_offset;
506 mail->data.save_envelope = TRUE;
507 header_ctx = mailbox_header_lookup_init(mail->mail.mail.box,
509 if (mail_get_header_stream(&mail->mail.mail, header_ctx, &stream) < 0) {
515 if (mail->data.envelope == NULL && stream != NULL) {
519 imap_envelope_parse_callback, mail);
521 index_mail_stream_log_failure_for(mail, stream);
524 mail->data.save_envelope = FALSE;
527 if (mail->data.stream != NULL)
528 i_stream_seek(mail->data.stream, old_offset);
549 static int index_mail_header_is_parsed(struct index_mail *mail,
555 match = array_get(&mail->header_match, &count);
556 if (field_idx < count && HEADER_MATCH_USABLE(mail, match[field_idx]))
583 index_mail_get_parsed_header(struct index_mail *mail, unsigned int field_idx)
592 line_idx = array_idx(&mail->header_match_lines, field_idx);
596 p_array_init(&header_values, mail->mail.data_pool, 4);
597 header = mail->header_data->data;
599 lines = array_get(&mail->header_lines, &lines_count);
610 value = p_strndup(mail->mail.data_pool, value_start,
621 index_mail_get_raw_headers(struct index_mail *mail, const char *field,
624 struct mail *_mail = &mail->mail.mail;
639 dest = str_new(mail->mail.data_pool, 128);
643 p_free(mail->mail.data_pool, dest);
644 if (mail->data.header_parser_initialized) {
646 because message size was wrong and istream-mail
648 i_assert(mail->mail.mail.lookup_abort == MAIL_LOOKUP_ABORT_NOT_IN_CACHE);
649 mail_set_aborted(&mail->mail.mail);
652 if (mail->header_seq != mail->data.seq ||
653 index_mail_header_is_parsed(mail, field_idx) < 0) {
660 ret = index_mail_parse_headers(mail, headers_ctx, reason);
666 if ((ret = index_mail_header_is_parsed(mail, field_idx)) <= 0) {
669 *value_r = p_new(mail->mail.data_pool, const char *, 1);
672 *value_r = index_mail_get_parsed_header(mail, field_idx);
680 *value_r = p_new(mail->mail.data_pool, const char *, 1);
684 p_array_init(&header_values, mail->mail.data_pool, 4);
755 index_mail_headers_decode(struct index_mail *mail, const char *const **_list,
766 decoded_list = p_new(mail->mail.data_pool, const char *, count + 1);
773 if (unfold_header(mail->mail.data_pool, &input) < 0)
784 input = p_strdup(mail->mail.data_pool, str_c(str));
792 int index_mail_get_headers(struct mail *_mail, const char *field,
795 struct index_mail *mail = INDEX_MAIL(_mail);
800 if (index_mail_get_raw_headers(mail, field, value_r) < 0)
808 ret = index_mail_headers_decode(mail, value_r, UINT_MAX);
819 i_panic("BUG: Broken header %s for mail UID %u "
826 int index_mail_get_first_header(struct mail *_mail, const char *field,
829 struct index_mail *mail = INDEX_MAIL(_mail);
835 if (index_mail_get_raw_headers(mail, field, &list) < 0)
843 ret = index_mail_headers_decode(mail, &list, 1);
855 i_panic("BUG: Broken header %s for mail UID %u "
866 bool *matched ATTR_UNUSED, struct index_mail *mail)
868 index_mail_parse_header(NULL, hdr, mail);
871 int index_mail_get_header_stream(struct mail *_mail,
875 struct index_mail *mail = INDEX_MAIL(_mail);
879 if (mail->data.filter_stream != NULL) {
887 while (i_stream_read_more(mail->data.filter_stream, &data, &size) > 0)
888 i_stream_skip(mail->data.filter_stream, size);
889 i_stream_destroy(&mail->data.filter_stream);
892 if (mail->data.save_bodystructure_header) {
896 if (index_mail_parse_headers(mail, headers, reason) < 0)
900 dest = str_new(mail->mail.data_pool, 256);
906 mail->data.filter_stream =
909 *stream_r = mail->data.filter_stream;
913 p_free(mail->mail.data_pool, dest);
936 index_mail_parse_header_init(mail, headers);
937 mail->data.filter_stream =
938 i_stream_create_header_filter(mail->data.stream,
943 header_cache_callback, mail);
944 *stream_r = mail->data.filter_stream;