QMail is strict regarding the format of emails. It rejects emails not conforming to 822bis section 2.3, which prohibits all bare LFs. Unfortunately this is what xsane-email sends in its message body. The patch below corrects this. It shouldnt break operation with any other mail daemons although I'm not in a position to check specifically.
Hopefully it can be included in the next release. Dave diff -Naur xsane-0.991/src/xsane-email-project.c xsane-0.991a/src/xsane-email-project.c --- xsane-0.991/src/xsane-email-project.c 2006-01-10 18:07:44.000000000 +0000 +++ xsane-0.991a/src/xsane-email-project.c 2006-11-03 22:03:39.000000000 +0000 @@ -1595,7 +1595,7 @@ /* doc files like ps and pdf can not be displayed inline in html email */ if (display_images_inline) { - snprintf(buf, sizeof(buf), "<p><img SRC=\"cid:%s\">\n", content_id); + snprintf(buf, sizeof(buf), "<p><img SRC=\"cid:%s\">\r\n", content_id); } write(fd, buf, strlen(buf)); } @@ -1605,7 +1605,7 @@ } else if (*email_text_pos == 10) /* new line */ { - snprintf(buf, sizeof(buf), "<br>\n"); + snprintf(buf, sizeof(buf), "<br>\r\n"); write(fd, buf, strlen(buf)); } else @@ -1624,12 +1624,12 @@ /* doc files like ps and pdf can not be displayed inline in html email */ if (display_images_inline) { - snprintf(buf, sizeof(buf), "<p><img SRC=\"cid:%s\">\n", content_id); + snprintf(buf, sizeof(buf), "<p><img SRC=\"cid:%s\">\r\n", content_id); } write(fd, buf, strlen(buf)); } - snprintf(buf, sizeof(buf), "</html>\n"); + snprintf(buf, sizeof(buf), "</html>\r\n"); write(fd, buf, strlen(buf)); @@ -1666,7 +1666,7 @@ write_email_mime_ascii(fd, boundary); write(fd, email_text, strlen(email_text)); - write(fd, "\n\n", 2); + write(fd, "\r\n\r\n", 4); for (i=0; i<attachments; i++) { diff -Naur xsane-0.991/src/xsane-save.c xsane-0.991a/src/xsane-save.c --- xsane-0.991/src/xsane-save.c 2006-01-10 17:46:32.000000000 +0000 +++ xsane-0.991a/src/xsane-save.c 2006-11-03 22:03:39.000000000 +0000 @@ -5477,7 +5477,7 @@ pos += 4; if (pos > 71) { - write(fd_socket, "\n", 1); + write(fd_socket, "\r\n", 2); pos = 0; } @@ -5492,7 +5492,7 @@ if (pos) { - write(fd_socket, "\n", 1); + write(fd_socket, "\r\n", 2); } xsane.email_progress_val = 1.0; @@ -5505,33 +5505,33 @@ { char buf[1024]; - snprintf(buf, sizeof(buf), "From: %s\n", from); + snprintf(buf, sizeof(buf), "From: %s\r\n", from); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Reply-To: %s\n", reply_to); + snprintf(buf, sizeof(buf), "Reply-To: %s\r\n", reply_to); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "To: %s\n", to); + snprintf(buf, sizeof(buf), "To: %s\r\n", to); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Subject: %s\n", subject); + snprintf(buf, sizeof(buf), "Subject: %s\r\n", subject); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "MIME-Version: 1.0\n"); + snprintf(buf, sizeof(buf), "MIME-Version: 1.0\r\n"); write(fd_socket, buf, strlen(buf)); if (related) /* related means that we need a special link in the html part to display the image */ { - snprintf(buf, sizeof(buf), "Content-Type: multipart/related;\n"); + snprintf(buf, sizeof(buf), "Content-Type: multipart/related;\r\n"); write(fd_socket, buf, strlen(buf)); } else { - snprintf(buf, sizeof(buf), "Content-Type: multipart/mixed;\n"); + snprintf(buf, sizeof(buf), "Content-Type: multipart/mixed;\r\n"); write(fd_socket, buf, strlen(buf)); } - snprintf(buf, sizeof(buf), " boundary=\"%s\"\n\n", boundary); + snprintf(buf, sizeof(buf), " boundary=\"%s\"\r\n\r\n", boundary); write(fd_socket, buf, strlen(buf)); } @@ -5541,7 +5541,7 @@ { char buf[1024]; - snprintf(buf, sizeof(buf), "--%s--\n", boundary); + snprintf(buf, sizeof(buf), "--%s--\r\n", boundary); write(fd_socket, buf, strlen(buf)); } @@ -5551,16 +5551,16 @@ { char buf[1024]; - snprintf(buf, sizeof(buf), "--%s\n", boundary); + snprintf(buf, sizeof(buf), "--%s\r\n", boundary); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Type: text/plain;\n"); + snprintf(buf, sizeof(buf), "Content-Type: text/plain;\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), " charset=\"iso-8859-1\"\n"); + snprintf(buf, sizeof(buf), " charset=\"iso-8859-1\"\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: 8bit\n\n"); + snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: 8bit\r\n\r\n"); write(fd_socket, buf, strlen(buf)); } @@ -5570,22 +5570,22 @@ { char buf[1024]; - snprintf(buf, sizeof(buf), "--%s\n", boundary); + snprintf(buf, sizeof(buf), "--%s\r\n", boundary); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Type: text/html;\n"); + snprintf(buf, sizeof(buf), "Content-Type: text/html;\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), " charset=\"us-ascii\"\n"); + snprintf(buf, sizeof(buf), " charset=\"us-ascii\"\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: 7bit\n\n"); + snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: 7bit\r\n\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">\n"); + snprintf(buf, sizeof(buf), "<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "<html>\n"); + snprintf(buf, sizeof(buf), "<html>\r\n"); write(fd_socket, buf, strlen(buf)); } @@ -5595,28 +5595,28 @@ { char buf[1024]; - snprintf(buf, sizeof(buf), "--%s\n", boundary); + snprintf(buf, sizeof(buf), "--%s\r\n", boundary); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Type: %s\n", content_type); + snprintf(buf, sizeof(buf), "Content-Type: %s\r\n", content_type); write(fd_socket, buf, strlen(buf)); if (content_id) { - snprintf(buf, sizeof(buf), "Content-ID: <%s>\n", content_id); + snprintf(buf, sizeof(buf), "Content-ID: <%s>\r\n", content_id); write(fd_socket, buf, strlen(buf)); } - snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: base64\n"); + snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: base64\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Disposition: inline;\n"); + snprintf(buf, sizeof(buf), "Content-Disposition: inline;\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), " filename=\"%s\"\n", filename); + snprintf(buf, sizeof(buf), " filename=\"%s\"\r\n", filename); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "\n"); + snprintf(buf, sizeof(buf), "\r\n"); write(fd_socket, buf, strlen(buf)); write_base64(fd_socket, infile); @@ -5628,25 +5628,25 @@ { char buf[1024]; - snprintf(buf, sizeof(buf), "--%s\n", boundary); + snprintf(buf, sizeof(buf), "--%s\r\n", boundary); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Type: application/octet-stream\n"); + snprintf(buf, sizeof(buf), "Content-Type: application/octet-stream\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), " name=\"%s\"\n", filename); + snprintf(buf, sizeof(buf), " name=\"%s\"\r\n", filename); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: base64\n"); + snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: base64\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Disposition: attachment;\n"); + snprintf(buf, sizeof(buf), "Content-Disposition: attachment;\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), " filename=\"%s\"\n", filename); + snprintf(buf, sizeof(buf), " filename=\"%s\"\r\n", filename); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "\n"); + snprintf(buf, sizeof(buf), "\r\n"); write(fd_socket, buf, strlen(buf)); write_base64(fd_socket, infile); diff -Naur xsane-0.991/src/xsane-save.c.orig xsane-0.991a/src/xsane-save.c.orig --- xsane-0.991/src/xsane-save.c.orig 2005-12-17 12:37:25.000000000 +0000 +++ xsane-0.991a/src/xsane-save.c.orig 2006-11-03 22:03:38.000000000 +0000 @@ -5366,7 +5366,7 @@ pos += 4; if (pos > 71) { - write(fd_socket, "\n", 1); + write(fd_socket, "\r\n", 2); pos = 0; } @@ -5381,7 +5381,7 @@ if (pos) { - write(fd_socket, "\n", 1); + write(fd_socket, "\r\n", 2); } xsane.mail_progress_val = 1.0; @@ -5394,33 +5394,33 @@ { char buf[1024]; - snprintf(buf, sizeof(buf), "From: %s\n", from); + snprintf(buf, sizeof(buf), "From: %s\r\n", from); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Reply-To: %s\n", reply_to); + snprintf(buf, sizeof(buf), "Reply-To: %s\r\n", reply_to); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "To: %s\n", to); + snprintf(buf, sizeof(buf), "To: %s\r\n", to); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Subject: %s\n", subject); + snprintf(buf, sizeof(buf), "Subject: %s\r\n", subject); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "MIME-Version: 1.0\n"); + snprintf(buf, sizeof(buf), "MIME-Version: 1.0\r\n"); write(fd_socket, buf, strlen(buf)); if (related) /* related means that we need a special link in the html part to display the image */ { - snprintf(buf, sizeof(buf), "Content-Type: multipart/related;\n"); + snprintf(buf, sizeof(buf), "Content-Type: multipart/related;\r\n"); write(fd_socket, buf, strlen(buf)); } else { - snprintf(buf, sizeof(buf), "Content-Type: multipart/mixed;\n"); + snprintf(buf, sizeof(buf), "Content-Type: multipart/mixed;\r\n"); write(fd_socket, buf, strlen(buf)); } - snprintf(buf, sizeof(buf), " boundary=\"%s\"\n\n", boundary); + snprintf(buf, sizeof(buf), " boundary=\"%s\"\r\n\r\n", boundary); write(fd_socket, buf, strlen(buf)); } @@ -5430,7 +5430,7 @@ { char buf[1024]; - snprintf(buf, sizeof(buf), "--%s--\n", boundary); + snprintf(buf, sizeof(buf), "--%s--\r\n", boundary); write(fd_socket, buf, strlen(buf)); } @@ -5440,16 +5440,16 @@ { char buf[1024]; - snprintf(buf, sizeof(buf), "--%s\n", boundary); + snprintf(buf, sizeof(buf), "--%s\r\n", boundary); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Type: text/plain;\n"); + snprintf(buf, sizeof(buf), "Content-Type: text/plain;\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), " charset=\"iso-8859-1\"\n"); + snprintf(buf, sizeof(buf), " charset=\"iso-8859-1\"\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: 8bit\n\n"); + snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: 8bit\r\n\r\n"); write(fd_socket, buf, strlen(buf)); } @@ -5459,22 +5459,22 @@ { char buf[1024]; - snprintf(buf, sizeof(buf), "--%s\n", boundary); + snprintf(buf, sizeof(buf), "--%s\r\n", boundary); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Type: text/html;\n"); + snprintf(buf, sizeof(buf), "Content-Type: text/html;\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), " charset=\"us-ascii\"\n"); + snprintf(buf, sizeof(buf), " charset=\"us-ascii\"\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: 7bit\n\n"); + snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: 7bit\r\n\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">\n"); + snprintf(buf, sizeof(buf), "<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "<html>\n"); + snprintf(buf, sizeof(buf), "<html>\r\n"); write(fd_socket, buf, strlen(buf)); } @@ -5484,28 +5484,28 @@ { char buf[1024]; - snprintf(buf, sizeof(buf), "--%s\n", boundary); + snprintf(buf, sizeof(buf), "--%s\r\n", boundary); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Type: %s\n", content_type); + snprintf(buf, sizeof(buf), "Content-Type: %s\r\n", content_type); write(fd_socket, buf, strlen(buf)); if (content_id) { - snprintf(buf, sizeof(buf), "Content-ID: <%s>\n", content_id); + snprintf(buf, sizeof(buf), "Content-ID: <%s>\r\n", content_id); write(fd_socket, buf, strlen(buf)); } - snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: base64\n"); + snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: base64\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Disposition: inline;\n"); + snprintf(buf, sizeof(buf), "Content-Disposition: inline;\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), " filename=\"%s\"\n", filename); + snprintf(buf, sizeof(buf), " filename=\"%s\"\r\n", filename); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "\n"); + snprintf(buf, sizeof(buf), "\r\n"); write(fd_socket, buf, strlen(buf)); write_base64(fd_socket, infile); @@ -5517,25 +5517,25 @@ { char buf[1024]; - snprintf(buf, sizeof(buf), "--%s\n", boundary); + snprintf(buf, sizeof(buf), "--%s\r\n", boundary); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Type: application/octet-stream\n"); + snprintf(buf, sizeof(buf), "Content-Type: application/octet-stream\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), " name=\"%s\"\n", filename); + snprintf(buf, sizeof(buf), " name=\"%s\"\r\n", filename); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: base64\n"); + snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: base64\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "Content-Disposition: attachment;\n"); + snprintf(buf, sizeof(buf), "Content-Disposition: attachment;\r\n"); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), " filename=\"%s\"\n", filename); + snprintf(buf, sizeof(buf), " filename=\"%s\"\r\n", filename); write(fd_socket, buf, strlen(buf)); - snprintf(buf, sizeof(buf), "\n"); + snprintf(buf, sizeof(buf), "\r\n"); write(fd_socket, buf, strlen(buf)); write_base64(fd_socket, infile);