This way, the EHLO response prior to AUTH will better match the EHLO response after AUTH.
struct smtp_server_cmd_helo *data)
{
struct client *client = &subm_client->common;
+ enum smtp_capability backend_caps = subm_client->backend_capabilities;
struct smtp_server_reply *reply;
reply = smtp_server_reply_create_ehlo(cmd->cmd);
if (!data->helo.old_smtp) {
- smtp_server_reply_ehlo_add(reply, "8BITMIME");
+ if ((backend_caps & SMTP_CAPABILITY_8BITMIME) != 0)
+ smtp_server_reply_ehlo_add(reply, "8BITMIME");
if (client->secured ||
strcmp(client->ssl_set->ssl, "required") != 0) {
"AUTH", "%s", str_c(param));
}
+ if ((backend_caps & SMTP_CAPABILITY_BINARYMIME) != 0 &&
+ (backend_caps & SMTP_CAPABILITY_CHUNKING) != 0)
+ smtp_server_reply_ehlo_add(reply, "BINARYMIME");
smtp_server_reply_ehlo_add_param(reply,
"BURL", "imap");
smtp_server_reply_ehlo_add(reply,
"CHUNKING");
+ if ((backend_caps & SMTP_CAPABILITY_DSN) != 0)
+ smtp_server_reply_ehlo_add(reply, "DSN");
smtp_server_reply_ehlo_add(reply,
"ENHANCEDSTATUSCODES");
static struct smtp_server *smtp_server = NULL;
+static void
+client_parse_backend_capabilities(struct submission_client *subm_client )
+{
+ const struct submission_login_settings *set = subm_client->set;
+ const char *const *str;
+
+ if (set->submission_backend_capabilities == NULL) {
+ subm_client->backend_capabilities = SMTP_CAPABILITY_8BITMIME;
+ return;
+ }
+
+ subm_client->backend_capabilities = SMTP_CAPABILITY_NONE;
+ str = t_strsplit_spaces(set->submission_backend_capabilities, " ,");
+ for (; *str != NULL; str++) {
+ enum smtp_capability cap = smtp_capability_find_by_name(*str);
+
+ if (cap == SMTP_CAPABILITY_NONE) {
+ i_warning("Unknown SMTP capability in submission_backend_capabilities: "
+ "%s", *str);
+ continue;
+ }
+
+ subm_client->backend_capabilities |= cap;
+ }
+}
+
static int submission_login_start_tls(void *conn_ctx,
struct istream **input, struct ostream **output)
{
struct smtp_server_settings smtp_set;
subm_client->set = other_sets[0];
+ client_parse_backend_capabilities(subm_client);
i_zero(&smtp_set);
smtp_set.capabilities = SMTP_CAPABILITY_SIZE |
struct submission_client {
struct client common;
const struct submission_login_settings *set;
+ enum smtp_capability backend_capabilities;
struct smtp_server_connection *conn;
struct smtp_server_cmd_ctx *pending_auth, *pending_starttls;
DEF(SET_STR, hostname),
DEF(SET_SIZE, submission_max_mail_size),
+ DEF(SET_STR, submission_backend_capabilities),
SETTING_DEFINE_LIST_END
};
.hostname = "",
.submission_max_mail_size = 0,
+ .submission_backend_capabilities = NULL
};
static const struct setting_parser_info *submission_login_setting_dependencies[] = {
/* submission: */
size_t submission_max_mail_size;
+ const char *submission_backend_capabilities;
};
extern const struct setting_parser_info *submission_login_setting_roots[];