diff -up evolution-data-server-3.12.11/camel/camel-network-service.c.smtp-timeout-change evolution-data-server-3.12.11/camel/camel-network-service.c --- evolution-data-server-3.12.11/camel/camel-network-service.c.smtp-timeout-change 2015-01-12 14:23:00.000000000 +0100 +++ evolution-data-server-3.12.11/camel/camel-network-service.c 2015-05-28 11:29:50.007493148 +0200 @@ -659,8 +659,10 @@ network_service_connect_sync (CamelNetwo GSocket *socket; socket = g_socket_connection_get_socket (connection); - if (socket) + if (socket) { g_socket_set_timeout (socket, 90); + g_socket_set_keepalive (socket, TRUE); + } } return (connection != NULL) ? G_IO_STREAM (connection) : NULL; diff -up evolution-data-server-3.12.11/camel/camel-stream.c.smtp-timeout-change evolution-data-server-3.12.11/camel/camel-stream.c --- evolution-data-server-3.12.11/camel/camel-stream.c.smtp-timeout-change 2015-05-28 11:30:32.653491341 +0200 +++ evolution-data-server-3.12.11/camel/camel-stream.c 2015-05-28 11:30:37.965491116 +0200 @@ -149,20 +149,25 @@ stream_write (CamelStream *stream, GError **error) { GIOStream *base_stream; - gssize n_bytes_written = (gssize) n; + gssize n_bytes_written = -1; base_stream = camel_stream_ref_base_stream (stream); if (base_stream != NULL) { GOutputStream *output_stream; + gsize n_written = 0; output_stream = g_io_stream_get_output_stream (base_stream); stream->eos = FALSE; - n_bytes_written = g_output_stream_write ( - output_stream, buffer, n, cancellable, error); + if (g_output_stream_write_all (output_stream, buffer, n, &n_written, cancellable, error)) + n_bytes_written = (gssize) n_written; + else + n_bytes_written = -1; g_object_unref (base_stream); + } else { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot write with no base stream")); } return n_bytes_written; diff -up evolution-data-server-3.12.11/camel/providers/smtp/camel-smtp-transport.c.smtp-timeout-change evolution-data-server-3.12.11/camel/providers/smtp/camel-smtp-transport.c --- evolution-data-server-3.12.11/camel/providers/smtp/camel-smtp-transport.c.smtp-timeout-change 2014-10-14 15:32:01.000000000 +0200 +++ evolution-data-server-3.12.11/camel/providers/smtp/camel-smtp-transport.c 2015-05-28 11:29:50.007493148 +0200 @@ -1444,6 +1444,36 @@ smtp_rcpt (CamelSmtpTransport *transport return TRUE; } +static void +smtp_maybe_update_socket_timeout (CamelStream *strm, + gint timeout_seconds) +{ + GIOStream *base_strm = camel_stream_ref_base_stream (strm); + + if (G_IS_TLS_CONNECTION (base_strm)) { + GIOStream *base_io_stream = NULL; + + g_object_get (G_OBJECT (base_strm), "base-io-stream", &base_io_stream, NULL); + + g_object_unref (base_strm); + base_strm = base_io_stream; + } else if (base_strm) { + g_object_ref (base_strm); + } + + if (G_IS_SOCKET_CONNECTION (base_strm)) { + GSocket *socket; + + socket = g_socket_connection_get_socket (G_SOCKET_CONNECTION (base_strm)); + if (socket) { + if (timeout_seconds > g_socket_get_timeout (socket)) + g_socket_set_timeout (socket, timeout_seconds); + } + } + + g_clear_object (&base_strm); +} + static gboolean smtp_data (CamelSmtpTransport *transport, CamelMimeMessage *message, @@ -1532,6 +1562,9 @@ smtp_data (CamelSmtpTransport *transport CAMEL_DATA_WRAPPER (message), CAMEL_STREAM (null), NULL, NULL); + /* Set the upload timeout to an equal of 512 bytes per second */ + smtp_maybe_update_socket_timeout (transport->ostream, null->written / 512); + filtered_stream = camel_stream_filter_new (transport->ostream); /* setup progress reporting for message sending... */