]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-client - Add support for proxying MAIL command with broken path.
authorStephan Bosch <stephan.bosch@open-xchange.com>
Fri, 13 Sep 2019 20:33:05 +0000 (22:33 +0200)
committerStephan Bosch <stephan.bosch@open-xchange.com>
Fri, 4 Oct 2019 21:25:54 +0000 (23:25 +0200)
src/lib-smtp/smtp-client-command.c
src/lib-smtp/smtp-client-connection.c
src/lib-smtp/smtp-client-transaction.c
src/lib-smtp/smtp-client.h

index e9a4a3b6f883a960179e54d16a3763e896a7d744..87f13fba5335f6008d2fa3e8b28f4f738a634247 100644 (file)
@@ -1117,8 +1117,15 @@ smtp_client_command_mail_submit(struct smtp_client_connection *conn,
 
        flags |= SMTP_CLIENT_COMMAND_FLAG_PIPELINE;
        cmd = smtp_client_command_new(conn, flags, callback, context);
-       smtp_client_command_printf(cmd, "MAIL FROM:<%s>",
-                                  smtp_address_encode(from));
+       if (!conn->set.mail_send_broken_path || !smtp_address_is_broken(from)) {
+               /* Compose MAIL command with normalized path. */
+               smtp_client_command_printf(cmd, "MAIL FROM:<%s>",
+                                          smtp_address_encode(from));
+       } else {
+               /* Compose MAIL command with broken path (for proxy). */
+               smtp_client_command_printf(cmd, "MAIL FROM:<%s>",
+                                          smtp_address_encode_raw(from));
+       }
        if (params != NULL) {
                size_t orig_len = str_len(cmd->data);
                str_append_c(cmd->data, ' ');
index d177f962e0e64abf9f6eec5bc134bae4bc746db6..610cca0ef576c66c7ce3c90c640dcdd1870cf7b2 100644 (file)
@@ -1803,6 +1803,8 @@ smtp_client_connection_do_create(struct smtp_client *client, const char *name,
                                      &set->proxy_data);
                conn->set.xclient_defer = set->xclient_defer;
                conn->set.peer_trusted = set->peer_trusted;
+
+               conn->set.mail_send_broken_path = set->mail_send_broken_path;
        }
 
 
index 39b9b353768c12d98398cf58315003b54d2b268f..9968030b8490ce8b48cf4fa08dab08d917c541d0 100644 (file)
@@ -940,6 +940,8 @@ void smtp_client_transaction_start(
        i_assert(mail != NULL);
        event_add_str(trans->event, "mail_from",
                      smtp_address_encode(mail->mail_from));
+       event_add_str(trans->event, "mail_from_raw",
+                     smtp_address_encode_raw(mail->mail_from));
        smtp_params_mail_add_to_event(&mail->mail_params,
                                      trans->event);
 
index 489cdb44df66e18aa6e8c209ee064618eda962c0..eb68d2f892d3f5f41ad91b5cd8a8d2bbf28abfe1 100644 (file)
@@ -103,6 +103,9 @@ struct smtp_client_settings {
        bool xclient_defer;
        /* don't clear password after first successful authentication */
        bool remember_password;
+       /* sending even broken MAIL command path (otherwise a broken address
+          is sent as <>) */
+       bool mail_send_broken_path;
 };
 
 struct smtp_client *smtp_client_init(const struct smtp_client_settings *set);