diff options
Diffstat (limited to 'camel/providers')
-rw-r--r-- | camel/providers/sendmail/camel-sendmail-transport.c | 121 | ||||
-rw-r--r-- | camel/providers/smtp/camel-smtp-transport.c | 54 |
2 files changed, 39 insertions, 136 deletions
diff --git a/camel/providers/sendmail/camel-sendmail-transport.c b/camel/providers/sendmail/camel-sendmail-transport.c index 5d5df59a7c..604d7f293d 100644 --- a/camel/providers/sendmail/camel-sendmail-transport.c +++ b/camel/providers/sendmail/camel-sendmail-transport.c @@ -41,10 +41,8 @@ static char *get_name (CamelService *service, gboolean brief); -static gboolean sendmail_can_send (CamelTransport *transport, CamelMedium *message); -static gboolean sendmail_send (CamelTransport *transport, CamelMedium *message, - CamelException *ex); -static gboolean sendmail_send_to (CamelTransport *transport, CamelMedium *message, +static gboolean sendmail_send_to (CamelTransport *transport, + CamelMimeMessage *message, CamelAddress *from, CamelAddress *recipients, CamelException *ex); @@ -59,9 +57,6 @@ camel_sendmail_transport_class_init (CamelSendmailTransportClass *camel_sendmail /* virtual method overload */ camel_service_class->get_name = get_name; - - camel_transport_class->can_send = sendmail_can_send; - camel_transport_class->send = sendmail_send; camel_transport_class->send_to = sendmail_send_to; } @@ -86,22 +81,40 @@ camel_sendmail_transport_get_type (void) static gboolean -sendmail_can_send (CamelTransport *transport, CamelMedium *message) -{ - return CAMEL_IS_MIME_MESSAGE (message); -} - - -static gboolean -sendmail_send_internal (CamelMedium *message, const char **argv, CamelException *ex) +sendmail_send_to (CamelTransport *transport, CamelMimeMessage *message, + CamelAddress *from, CamelAddress *recipients, + CamelException *ex) { - int fd[2], nullfd, wstat; + const char *from_addr, *addr, **argv; + int i, len, fd[2], nullfd, wstat; sigset_t mask, omask; CamelStream *out; pid_t pid; - g_assert (CAMEL_IS_MIME_MESSAGE (message)); - + if (!camel_internet_address_get (CAMEL_INTERNET_ADDRESS (from), 0, NULL, &from_addr)) + return FALSE; + + len = camel_address_length (recipients); + argv = g_malloc ((len + 6) * sizeof (char *)); + argv[0] = "sendmail"; + argv[1] = "-i"; + argv[2] = "-f"; + argv[3] = from_addr; + argv[4] = "--"; + + for (i = 0; i < len; i++) { + if (!camel_internet_address_get (CAMEL_INTERNET_ADDRESS (recipients), i, NULL, &addr)) { + camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, + _("Could not parse recipient list")); + g_free (argv); + return FALSE; + } + + argv[i + 5] = addr; + } + + argv[i + 5] = NULL; + if (pipe (fd) == -1) { camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, _("Could not create pipe to sendmail: " @@ -125,6 +138,7 @@ sendmail_send_internal (CamelMedium *message, const char **argv, CamelException "%s: mail not sent"), g_strerror (errno)); sigprocmask (SIG_SETMASK, &omask, NULL); + g_free (argv); return FALSE; case 0: @@ -139,6 +153,7 @@ sendmail_send_internal (CamelMedium *message, const char **argv, CamelException execv (SENDMAIL_PATH, (char **)argv); _exit (255); } + g_free (argv); /* Parent process. Write the message out. */ close (fd[0]); @@ -182,76 +197,6 @@ sendmail_send_internal (CamelMedium *message, const char **argv, CamelException return TRUE; } -static const char * -get_from (CamelMedium *message, CamelException *ex) -{ - const CamelInternetAddress *from; - const char *name, *address; - - from = camel_mime_message_get_from (CAMEL_MIME_MESSAGE (message)); - if (!from || !camel_internet_address_get (from, 0, &name, &address)) { - camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("Could not find 'From' address in message")); - return NULL; - } - return address; -} - -static gboolean -sendmail_send_to (CamelTransport *transport, CamelMedium *message, - CamelAddress *from, CamelAddress *recipients, - CamelException *ex) -{ - const char *from_addr, *addr, **argv; - gboolean status; - int i, len; - - if (!from) - return FALSE; - - if (!camel_internet_address_get (CAMEL_INTERNET_ADDRESS (from), 0, NULL, &from_addr)) - return FALSE; - - len = camel_address_length (recipients); - argv = g_malloc ((len + 6) * sizeof (char *)); - argv[0] = "sendmail"; - argv[1] = "-i"; - argv[2] = "-f"; - argv[3] = from_addr; - argv[4] = "--"; - - for (i = 0; i < len; i++) { - if (!camel_internet_address_get (CAMEL_INTERNET_ADDRESS (recipients), i, NULL, &addr)) { - camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not parse recipient list")); - g_free (argv); - return FALSE; - } - - argv[i + 5] = addr; - } - - argv[i + 5] = NULL; - - status = sendmail_send_internal (message, argv, ex); - g_free (argv); - - return status; -} - -static gboolean -sendmail_send (CamelTransport *transport, CamelMedium *message, - CamelException *ex) -{ - const char *argv[6] = { "sendmail", "-t", "-i", "-f", NULL, NULL }; - - argv[4] = get_from (message, ex); - if (!argv[4]) - return FALSE; - - return sendmail_send_internal (message, argv, ex); -} - static char * get_name (CamelService *service, gboolean brief) { diff --git a/camel/providers/smtp/camel-smtp-transport.c b/camel/providers/smtp/camel-smtp-transport.c index 7807e87593..f71f8b4050 100644 --- a/camel/providers/smtp/camel-smtp-transport.c +++ b/camel/providers/smtp/camel-smtp-transport.c @@ -63,9 +63,7 @@ #define SMTP_PORT 25 /* camel smtp transport class prototypes */ -static gboolean smtp_can_send (CamelTransport *transport, CamelMedium *message); -static gboolean smtp_send (CamelTransport *transport, CamelMedium *message, CamelException *ex); -static gboolean smtp_send_to (CamelTransport *transport, CamelMedium *message, +static gboolean smtp_send_to (CamelTransport *transport, CamelMimeMessage *message, CamelAddress *from, CamelAddress *recipients, CamelException *ex); /* support prototypes */ @@ -83,7 +81,7 @@ static gboolean smtp_auth (CamelSmtpTransport *transport, const char *mech, Came static gboolean smtp_mail (CamelSmtpTransport *transport, const char *sender, gboolean has_8bit_parts, CamelException *ex); static gboolean smtp_rcpt (CamelSmtpTransport *transport, const char *recipient, CamelException *ex); -static gboolean smtp_data (CamelSmtpTransport *transport, CamelMedium *message, +static gboolean smtp_data (CamelSmtpTransport *transport, CamelMimeMessage *message, gboolean has_8bit_parts, CamelException *ex); static gboolean smtp_rset (CamelSmtpTransport *transport, CamelException *ex); static gboolean smtp_quit (CamelSmtpTransport *transport, CamelException *ex); @@ -111,8 +109,6 @@ camel_smtp_transport_class_init (CamelSmtpTransportClass *camel_smtp_transport_c camel_service_class->query_auth_types = query_auth_types; camel_service_class->get_name = get_name; - camel_transport_class->can_send = smtp_can_send; - camel_transport_class->send = smtp_send; camel_transport_class->send_to = smtp_send_to; } @@ -651,13 +647,7 @@ get_name (CamelService *service, gboolean brief) } static gboolean -smtp_can_send (CamelTransport *transport, CamelMedium *message) -{ - return CAMEL_IS_MIME_MESSAGE (message); -} - -static gboolean -smtp_send_to (CamelTransport *transport, CamelMedium *message, +smtp_send_to (CamelTransport *transport, CamelMimeMessage *message, CamelAddress *from, CamelAddress *recipients, CamelException *ex) { @@ -667,13 +657,6 @@ smtp_send_to (CamelTransport *transport, CamelMedium *message, const char *addr; int i, len; - if (!from) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Cannot send message: " - "sender address not defined.")); - return FALSE; - } - if (!camel_internet_address_get (CAMEL_INTERNET_ADDRESS (from), 0, NULL, &addr)) { camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot send message: " @@ -684,7 +667,7 @@ smtp_send_to (CamelTransport *transport, CamelMedium *message, camel_operation_start (NULL, _("Sending message")); /* find out if the message has 8bit mime parts */ - has_8bit_parts = camel_mime_message_has_8bit_parts (CAMEL_MIME_MESSAGE (message)); + has_8bit_parts = camel_mime_message_has_8bit_parts (message); /* rfc1652 (8BITMIME) requires that you notify the ESMTP daemon that you'll be sending an 8bit mime message at "MAIL FROM:" time. */ @@ -729,31 +712,6 @@ smtp_send_to (CamelTransport *transport, CamelMedium *message, return TRUE; } -static gboolean -smtp_send (CamelTransport *transport, CamelMedium *message, CamelException *ex) -{ - const CamelInternetAddress *from, *to, *cc, *bcc; - CamelInternetAddress *recipients = NULL; - gboolean status; - - from = camel_mime_message_get_from (CAMEL_MIME_MESSAGE (message)); - - to = camel_mime_message_get_recipients (CAMEL_MIME_MESSAGE (message), CAMEL_RECIPIENT_TYPE_TO); - cc = camel_mime_message_get_recipients (CAMEL_MIME_MESSAGE (message), CAMEL_RECIPIENT_TYPE_CC); - bcc = camel_mime_message_get_recipients (CAMEL_MIME_MESSAGE (message), CAMEL_RECIPIENT_TYPE_BCC); - - recipients = camel_internet_address_new (); - camel_address_cat (CAMEL_ADDRESS (recipients), CAMEL_ADDRESS (to)); - camel_address_cat (CAMEL_ADDRESS (recipients), CAMEL_ADDRESS (cc)); - camel_address_cat (CAMEL_ADDRESS (recipients), CAMEL_ADDRESS (bcc)); - - status = smtp_send_to (transport, message, CAMEL_ADDRESS (from), CAMEL_ADDRESS (recipients), ex); - - camel_object_unref (CAMEL_OBJECT (recipients)); - - return status; -} - static const char * smtp_next_token (const char *buf) { @@ -1169,7 +1127,7 @@ smtp_rcpt (CamelSmtpTransport *transport, const char *recipient, CamelException } static gboolean -smtp_data (CamelSmtpTransport *transport, CamelMedium *message, gboolean has_8bit_parts, CamelException *ex) +smtp_data (CamelSmtpTransport *transport, CamelMimeMessage *message, gboolean has_8bit_parts, CamelException *ex) { /* now we can actually send what's important :p */ char *cmdbuf, *respbuf = NULL; @@ -1183,7 +1141,7 @@ smtp_data (CamelSmtpTransport *transport, CamelMedium *message, gboolean has_8bi doesn't support it, encode 8bit parts to the best encoding. This will also enforce an encoding to keep the lines in limit */ if (has_8bit_parts && !(transport->flags & CAMEL_SMTP_TRANSPORT_8BITMIME)) - camel_mime_message_encode_8bit_parts (CAMEL_MIME_MESSAGE (message)); + camel_mime_message_encode_8bit_parts (message); cmdbuf = g_strdup ("DATA\r\n"); |