vtable = get_var_expand_table(mail, recipient, reason);
- smtp_submit = smtp_submit_init_simple(ctx->smtp_set, NULL);
+ smtp_submit = smtp_submit_init_simple(ctx->smtp_set, NULL, NULL);
smtp_submit_add_rcpt(smtp_submit, return_addr);
output = smtp_submit_send(smtp_submit);
DEF(SET_STR_VARS, sendmail_path),
DEF(SET_TIME, submission_timeout),
+ DEF(SET_ENUM, submission_ssl),
+
SETTING_DEFINE_LIST_END
};
.submission_host = "",
.sendmail_path = "/usr/sbin/sendmail",
.submission_timeout = 30,
+
+ .submission_ssl = "no:smtps:submissions:starttls",
};
const struct setting_parser_info smtp_submit_setting_parser_info = {
const char *submission_host;
const char *sendmail_path;
unsigned int submission_timeout;
+
+ const char *submission_ssl;
};
extern const struct setting_parser_info smtp_submit_setting_parser_info;
#include "istream.h"
#include "ostream.h"
#include "iostream-temp.h"
+#include "iostream-ssl.h"
#include "master-service.h"
#include "program-client.h"
#include "smtp-client.h"
struct smtp_submit_session {
pool_t pool;
struct smtp_submit_settings set;
+ struct ssl_iostream_settings ssl_set;
};
struct smtp_submit {
};
struct smtp_submit_session *
-smtp_submit_session_init(const struct smtp_submit_settings *set)
+smtp_submit_session_init(const struct smtp_submit_settings *set,
+ const struct ssl_iostream_settings *ssl_set)
{
struct smtp_submit_session *session;
pool_t pool;
session->pool = pool;
session->set = *set;
- session->set.hostname = p_strdup_empty(pool, set->hostname);
- session->set.submission_host = p_strdup_empty(pool, set->submission_host);
- session->set.sendmail_path = p_strdup_empty(pool, set->sendmail_path);
+ session->set.hostname =
+ p_strdup_empty(pool, set->hostname);
+ session->set.submission_host =
+ p_strdup_empty(pool, set->submission_host);
+ session->set.sendmail_path =
+ p_strdup_empty(pool, set->sendmail_path);
+ session->set.submission_ssl =
+ p_strdup_empty(pool, set->submission_ssl);
+
+ if (ssl_set != NULL)
+ ssl_iostream_settings_init_from(pool, &session->ssl_set, ssl_set);
+
return session;
}
struct smtp_submit *
smtp_submit_init_simple(const struct smtp_submit_settings *set,
+ const struct ssl_iostream_settings *ssl_set,
const struct smtp_address *mail_from)
{
struct smtp_submit_session *session;
struct smtp_submit *subm;
- session = smtp_submit_session_init(set);
+ session = smtp_submit_session_init(set, ssl_set);
subm = smtp_submit_init(session, mail_from);
subm->simple = TRUE;
return subm;
struct smtp_client *smtp_client;
struct smtp_client_connection *smtp_conn;
struct smtp_client_transaction *smtp_trans;
+ enum smtp_client_connection_ssl_mode ssl_mode;
struct smtp_address *const *rcptp;
const char *host;
in_port_t port;
smtp_set.connect_timeout_msecs = set->submission_timeout*1000;
smtp_set.command_timeout_msecs = set->submission_timeout*1000;
smtp_set.debug = set->mail_debug;
+ smtp_set.ssl = &subm->session->ssl_set;
+
+ ssl_mode = SMTP_CLIENT_SSL_MODE_NONE;
+ if (set->submission_ssl != NULL) {
+ if (strcasecmp(set->submission_ssl, "smtps") == 0 ||
+ strcasecmp(set->submission_ssl, "submissions") == 0)
+ ssl_mode = SMTP_CLIENT_SSL_MODE_IMMEDIATE;
+ else if (strcasecmp(set->submission_ssl, "starttls") == 0)
+ ssl_mode = SMTP_CLIENT_SSL_MODE_STARTTLS;
+ }
smtp_client = smtp_client_init(&smtp_set);
smtp_conn = smtp_client_connection_create(smtp_client,
- SMTP_PROTOCOL_SMTP, host, port,
- SMTP_CLIENT_SSL_MODE_NONE, NULL);
+ SMTP_PROTOCOL_SMTP, host, port, ssl_mode, NULL);
smtp_trans = smtp_client_transaction_create(smtp_conn,
subm->mail_from, NULL, smtp_submit_send_host_finished, subm);
#include "smtp-submit-settings.h"
+struct ssl_iostream_settings;
struct smtp_address;
struct smtp_submit_settings;
struct smtp_submit_session;
/* Use submit session to reuse resources (e.g. SMTP connections) between
submissions (FIXME: actually implement this) */
struct smtp_submit_session *
-smtp_submit_session_init(const struct smtp_submit_settings *set);
+smtp_submit_session_init(const struct smtp_submit_settings *set,
+ const struct ssl_iostream_settings *ssl_set) ATTR_NULL(2);
void smtp_submit_session_deinit(struct smtp_submit_session **_session);
struct smtp_submit *
const struct smtp_address *mail_from);
struct smtp_submit *
smtp_submit_init_simple(const struct smtp_submit_settings *set,
- const struct smtp_address *mail_from);
+ const struct ssl_iostream_settings *ssl_set,
+ const struct smtp_address *mail_from) ATTR_NULL(2);
void smtp_submit_deinit(struct smtp_submit **_submit);
/* Add a new recipient */
t_strdup_printf("127.0.0.1:%u", bind_ports[0]);
smtp_submit_set.submission_timeout = 1000;
- smtp_submit = smtp_submit_init_simple(&smtp_submit_set,
+ smtp_submit = smtp_submit_init_simple(&smtp_submit_set, NULL,
SMTP_ADDRESS_LITERAL("sender", "example.com"));
smtp_submit_add_rcpt(smtp_submit,
/* submit 1 */
smtp_submit_set.submission_host =
t_strdup_printf("127.0.0.1:%u", bind_ports[0]);
- smtp_submit1 = smtp_submit_init_simple(&smtp_submit_set,
+ smtp_submit1 = smtp_submit_init_simple(&smtp_submit_set, NULL,
SMTP_ADDRESS_LITERAL("sender", "example.com"));
smtp_submit_add_rcpt(smtp_submit1,
/* submit 2 */
smtp_submit_set.submission_host =
t_strdup_printf("127.0.0.1:%u", bind_ports[1]);
- smtp_submit2 = smtp_submit_init_simple(&smtp_submit_set,
+ smtp_submit2 = smtp_submit_init_simple(&smtp_submit_set, NULL,
SMTP_ADDRESS_LITERAL("sender", "example.com"));
smtp_submit_add_rcpt(smtp_submit2,
smtp_submit_set.sendmail_path = sendmail_path;
smtp_submit_set.submission_timeout = 5;
- smtp_submit = smtp_submit_init_simple(&smtp_submit_set,
+ smtp_submit = smtp_submit_init_simple(&smtp_submit_set, NULL,
SMTP_ADDRESS_LITERAL("sender", "example.com"));
smtp_submit_add_rcpt(smtp_submit,
smtp_submit_set.sendmail_path = sendmail_path;
smtp_submit_set.submission_timeout = 5;
- smtp_submit = smtp_submit_init_simple(&smtp_submit_set,
+ smtp_submit = smtp_submit_init_simple(&smtp_submit_set, NULL,
SMTP_ADDRESS_LITERAL("sender", "example.com"));
smtp_submit_add_rcpt(smtp_submit,
/* submit 1 */
smtp_submit_set.sendmail_path = sendmail_path1;
- smtp_submit1 = smtp_submit_init_simple(&smtp_submit_set,
+ smtp_submit1 = smtp_submit_init_simple(&smtp_submit_set, NULL,
SMTP_ADDRESS_LITERAL("sender", "example.com"));
smtp_submit_add_rcpt(smtp_submit1,
/* submit 2 */
smtp_submit_set.sendmail_path = sendmail_path2;
- smtp_submit2 = smtp_submit_init_simple(&smtp_submit_set,
+ smtp_submit2 = smtp_submit_init_simple(&smtp_submit_set, NULL,
SMTP_ADDRESS_LITERAL("sender", "example.com"));
smtp_submit_add_rcpt(smtp_submit2,
smtp_submit_set = *smtp_set;
smtp_submit_set.submission_host = host,
- smtp_submit = smtp_submit_init_simple(&smtp_submit_set,
+ smtp_submit = smtp_submit_init_simple(&smtp_submit_set, NULL,
SMTP_ADDRESS_LITERAL("sender", "example.com"));
smtp_submit_add_rcpt(smtp_submit,