dovecot-2.2: lib-lda: Fixed mai forward/reject to work with the ...
dovecot at dovecot.org
dovecot at dovecot.org
Tue Feb 28 05:27:16 EET 2012
details: http://hg.dovecot.org/dovecot-2.2/rev/df631445f150
changeset: 14227:df631445f150
user: Timo Sirainen <tss at iki.fi>
date: Tue Feb 28 05:27:03 2012 +0200
description:
lib-lda: Fixed mai forward/reject to work with the new smtp_client_open() API.
diffstat:
src/lib-lda/mail-send.c | 116 +++++++++++++++++++++--------------------------
1 files changed, 53 insertions(+), 63 deletions(-)
diffs (202 lines):
diff -r 864187d19761 -r df631445f150 src/lib-lda/mail-send.c
--- a/src/lib-lda/mail-send.c Tue Feb 28 05:21:19 2012 +0200
+++ b/src/lib-lda/mail-send.c Tue Feb 28 05:27:03 2012 +0200
@@ -4,6 +4,7 @@
#include "ioloop.h"
#include "hostpid.h"
#include "istream.h"
+#include "ostream.h"
#include "str.h"
#include "str-sanitize.h"
#include "var-expand.h"
@@ -55,12 +56,10 @@
struct mail *mail = ctx->src_mail;
struct istream *input;
struct smtp_client *smtp_client;
- FILE *f;
+ struct ostream *output;
const char *return_addr, *hdr;
- const unsigned char *data;
const char *value, *msgid, *orig_msgid, *boundary;
string_t *str;
- size_t size;
int ret;
if (mail_get_first_header(mail, "Message-ID", &orig_msgid) < 0)
@@ -87,76 +86,75 @@
str_sanitize(reason, 512));
}
- smtp_client = smtp_client_open(ctx->set, return_addr, NULL, &f);
+ smtp_client = smtp_client_open(ctx->set, return_addr, NULL, &output);
msgid = mail_deliver_get_new_message_id(ctx);
boundary = t_strdup_printf("%s/%s", my_pid, ctx->set->hostname);
- fprintf(f, "Message-ID: %s\r\n", msgid);
- fprintf(f, "Date: %s\r\n", message_date_create(ioloop_time));
- fprintf(f, "From: Mail Delivery Subsystem <%s>\r\n",
- ctx->set->postmaster_address);
- fprintf(f, "To: <%s>\r\n", return_addr);
- fprintf(f, "MIME-Version: 1.0\r\n");
- fprintf(f, "Content-Type: "
- "multipart/report; report-type=%s;\r\n"
- "\tboundary=\"%s\"\r\n",
- ctx->dsn ? "delivery-status" : "disposition-notification",
- boundary);
-
- str = t_str_new(256);
+ str = t_str_new(512);
+ str_printfa(str, "Message-ID: %s\r\n", msgid);
+ str_printfa(str, "Date: %s\r\n", message_date_create(ioloop_time));
+ str_printfa(str, "From: Mail Delivery Subsystem <%s>\r\n",
+ ctx->set->postmaster_address);
+ str_printfa(str, "To: <%s>\r\n", return_addr);
+ str_append(str, "MIME-Version: 1.0\r\n");
+ str_printfa(str, "Content-Type: "
+ "multipart/report; report-type=%s;\r\n"
+ "\tboundary=\"%s\"\r\n",
+ ctx->dsn ? "delivery-status" : "disposition-notification",
+ boundary);
+ str_append(str, "Subject: ");
var_expand(str, ctx->set->rejection_subject,
get_var_expand_table(mail, reason, recipient));
- fprintf(f, "Subject: %s\r\n", str_c(str));
+ str_append(str, "\r\n");
- fprintf(f, "Auto-Submitted: auto-replied (rejected)\r\n");
- fprintf(f, "Precedence: bulk\r\n");
- fprintf(f, "\r\nThis is a MIME-encapsulated message\r\n\r\n");
+ str_append(str, "Auto-Submitted: auto-replied (rejected)\r\n");
+ str_append(str, "Precedence: bulk\r\n");
+ str_append(str, "\r\nThis is a MIME-encapsulated message\r\n\r\n");
/* human readable status report */
- fprintf(f, "--%s\r\n", boundary);
- fprintf(f, "Content-Type: text/plain; charset=utf-8\r\n");
- fprintf(f, "Content-Disposition: inline\r\n");
- fprintf(f, "Content-Transfer-Encoding: 8bit\r\n\r\n");
+ str_printfa(str, "--%s\r\n", boundary);
+ str_append(str, "Content-Type: text/plain; charset=utf-8\r\n");
+ str_append(str, "Content-Disposition: inline\r\n");
+ str_append(str, "Content-Transfer-Encoding: 8bit\r\n\r\n");
- str_truncate(str, 0);
var_expand(str, ctx->set->rejection_reason,
get_var_expand_table(mail, reason, recipient));
- fprintf(f, "%s\r\n", str_c(str));
+ str_append(str, "\r\n");
if (ctx->dsn) {
/* DSN status report: For LDA rejects. currently only used when
user is out of quota */
- fprintf(f, "--%s\r\n"
- "Content-Type: message/delivery-status\r\n\r\n",
- boundary);
- fprintf(f, "Reporting-MTA: dns; %s\r\n",
- ctx->set->hostname);
+ str_printfa(str, "--%s\r\n"
+ "Content-Type: message/delivery-status\r\n\r\n",
+ boundary);
+ str_printfa(str, "Reporting-MTA: dns; %s\r\n", ctx->set->hostname);
if (mail_get_first_header(mail, "Original-Recipient", &hdr) > 0)
- fprintf(f, "Original-Recipient: rfc822; %s\r\n", hdr);
- fprintf(f, "Final-Recipient: rfc822; %s\r\n", recipient);
- fprintf(f, "Action: failed\r\n");
- fprintf(f, "Status: %s\r\n", ctx->mailbox_full ? "5.2.2" : "5.2.0");
+ str_printfa(str, "Original-Recipient: rfc822; %s\r\n", hdr);
+ str_printfa(str, "Final-Recipient: rfc822; %s\r\n", recipient);
+ str_append(str, "Action: failed\r\n");
+ str_printfa(str, "Status: %s\r\n", ctx->mailbox_full ? "5.2.2" : "5.2.0");
} else {
/* MDN status report: For Sieve "reject" */
- fprintf(f, "--%s\r\n"
- "Content-Type: message/disposition-notification\r\n\r\n",
- boundary);
- fprintf(f, "Reporting-UA: %s; Dovecot Mail Delivery Agent\r\n",
- ctx->set->hostname);
+ str_printfa(str, "--%s\r\n"
+ "Content-Type: message/disposition-notification\r\n\r\n",
+ boundary);
+ str_printfa(str, "Reporting-UA: %s; Dovecot Mail Delivery Agent\r\n",
+ ctx->set->hostname);
if (mail_get_first_header(mail, "Original-Recipient", &hdr) > 0)
- fprintf(f, "Original-Recipient: rfc822; %s\r\n", hdr);
- fprintf(f, "Final-Recipient: rfc822; %s\r\n", recipient);
+ str_printfa(str, "Original-Recipient: rfc822; %s\r\n", hdr);
+ str_printfa(str, "Final-Recipient: rfc822; %s\r\n", recipient);
if (orig_msgid != NULL)
- fprintf(f, "Original-Message-ID: %s\r\n", orig_msgid);
- fprintf(f, "Disposition: "
- "automatic-action/MDN-sent-automatically; deleted\r\n");
+ str_printfa(str, "Original-Message-ID: %s\r\n", orig_msgid);
+ str_append(str, "Disposition: "
+ "automatic-action/MDN-sent-automatically; deleted\r\n");
}
- fprintf(f, "\r\n");
+ str_append(str, "\r\n");
/* original message's headers */
- fprintf(f, "--%s\r\nContent-Type: message/rfc822\r\n\r\n", boundary);
+ str_printfa(str, "--%s\r\nContent-Type: message/rfc822\r\n\r\n", boundary);
+ o_stream_send(output, str_data(str), str_len(str));
if (mail_get_hdr_stream(mail, NULL, &input) == 0) {
/* Note: If you add more headers, they need to be sorted.
@@ -173,17 +171,15 @@
N_ELEMENTS(exclude_headers),
null_header_filter_callback, NULL);
- while ((ret = i_stream_read_data(input, &data, &size, 0)) > 0) {
- if (fwrite(data, size, 1, f) == 0)
- break;
- i_stream_skip(input, size);
- }
+ ret = o_stream_send_istream(output, input);
i_stream_unref(&input);
i_assert(ret != 0);
}
- fprintf(f, "\r\n\r\n--%s--\r\n", boundary);
+ str_truncate(str, 0);
+ str_printfa(str, "\r\n\r\n--%s--\r\n", boundary);
+ o_stream_send(output, str_data(str), str_len(str));
return smtp_client_close(smtp_client);
}
@@ -193,11 +189,9 @@
"Return-Path"
};
struct istream *input;
+ struct ostream *output;
struct smtp_client *smtp_client;
- FILE *f;
- const unsigned char *data;
const char *return_path;
- size_t size;
if (mail_get_stream(ctx->src_mail, NULL, NULL, &input) < 0)
return -1;
@@ -208,18 +202,14 @@
forwardto, return_path);
}
- smtp_client = smtp_client_open(ctx->set, forwardto, return_path, &f);
+ smtp_client = smtp_client_open(ctx->set, forwardto, return_path, &output);
input = i_stream_create_header_filter(input, HEADER_FILTER_EXCLUDE |
HEADER_FILTER_NO_CR, hide_headers,
N_ELEMENTS(hide_headers),
null_header_filter_callback, NULL);
- while (i_stream_read_data(input, &data, &size, 0) > 0) {
- if (fwrite(data, size, 1, f) == 0)
- break;
- i_stream_skip(input, size);
- }
+ o_stream_send_istream(output, input);
i_stream_unref(&input);
return smtp_client_close(smtp_client);
More information about the dovecot-cvs
mailing list