test/format/test-dp test/format/test-fmtdump \
test/format/test-localmbox test/format/test-myname \
test/format/test-myhost test/format/test-mymbox \
- test/forw/test-forw-digest \
- test/forw/test-forw-format \
+ test/forw/test-forw-digest test/forw/test-forw-format \
test/inc/test-deb359167 test/inc/test-eom-align \
test/inc/test-inc-scanout test/install-mh/test-install-mh \
- test/manpages/test-manpages test/mhbuild/test-forw \
+ test/manpages/test-manpages \
+ test/mhbuild/test-forw test/mhbuild/test-utf8-body \
test/mhlist/test-mhlist test/mhmail/test-mhmail \
test/mhparam/test-mhparam test/mhpath/test-mhpath \
test/mhshow/test-cte-binary test/mhshow/test-qp \
--- /dev/null
+#!/bin/sh
+######################################################
+#
+# Test UTF-8 body along with an attachment
+#
+######################################################
+
+set -e
+
+if test -z "${MH_OBJ_DIR}"; then
+ srcdir=`dirname "$0"`/../..
+ MH_OBJ_DIR=`cd "$srcdir" && pwd`; export MH_OBJ_DIR
+fi
+
+. "${MH_OBJ_DIR}/test/common.sh"
+
+setup_test
+testname="${MH_TEST_DIR}/$$"
+
+
+#### Rely on sendmail/pipe below to override default mts.
+mts_fakesendmail="${MHMTSCONF}-fakesendmail"
+cp "${MHMTSCONF}" "$mts_fakesendmail"
+printf "%s\n" "sendmail: ${srcdir}/test/fakesendmail" >>"$mts_fakesendmail"
+MHMTSCONF="$mts_fakesendmail"
+
+# argument: expected output
+test_attachment ()
+{
+ send -draft -mts sendmail/pipe
+
+ # fakesendmail drops the message and any cc's into this mbox.
+ mbox="${MH_TEST_DIR}"/Mail/fakesendmail.mbox
+ inc -silent -file "$mbox"
+ rm -f "$mbox" "$mbox.map"
+
+ cur=`mhpath cur`
+
+ #
+ # It's hard to calculate the exact Date: header post is going to
+ # use, so we'll just use sed to remove the actual date so we can easily
+ # compare it against our "correct" output. And same for
+ # Content-ID and charset.
+ #
+ sed -e 's/^Date:.*/Date:/' \
+ -e 's/^Content-ID:.*/Content-ID:/' \
+ -e 's/; charset=".*//' \
+ "$cur" > "${testname}.actual"
+
+ check "${testname}.actual" "$1"
+}
+
+# check that 7-bit body isn't encoded
+cat > "${MH_TEST_DIR}/attachment.txt" <<EOF
+this is an attachment
+EOF
+
+cat > "${MH_TEST_DIR}/Mail/draft" <<EOF
+From: Mr Nobody <nobody@example.com>
+To: Somebody Else <somebody@example.com>
+Subject: Test
+Nmh-Attachment: $MH_TEST_DIR/attachment.txt
+
+This is a test.
+EOF
+
+cat > "${testname}.expected" <<EOF
+From: Mr Nobody <nobody@example.com>
+To: Somebody Else <somebody@example.com>
+Subject: Test
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0"
+Content-ID:
+Date:
+
+------- =_aaaaaaaaaa0
+Content-Type: text/plain
+
+This is a test.
+
+------- =_aaaaaaaaaa0
+Content-Type: text/plain; name="attachment.txt"
+Content-Description: attachment.txt
+Content-Disposition: attachment; filename="attachment.txt"
+
+this is an attachment
+
+------- =_aaaaaaaaaa0--
+EOF
+
+test_attachment "${testname}.expected"
+
+# check that 8-bit body is still encoded as quoted-printable
+# text/plain, even with an attachment
+
+cat > "${MH_TEST_DIR}/Mail/draft" <<EOF
+From: Mr Nobody <nobody@example.com>
+To: Somebody Else <somebody@example.com>
+Subject: Test
+Nmh-Attachment: $MH_TEST_DIR/attachment.txt
+
+¡Ay, caramba!
+EOF
+
+cat > "${testname}.expected" <<EOF
+From: Mr Nobody <nobody@example.com>
+To: Somebody Else <somebody@example.com>
+Subject: Test
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0"
+Content-ID:
+Date:
+
+------- =_aaaaaaaaaa0
+Content-Type: text/plain
+Content-Transfer-Encoding: quoted-printable
+
+=A1Ay, caramba!
+
+------- =_aaaaaaaaaa0
+Content-Type: text/plain; name="attachment.txt"
+Content-Description: attachment.txt
+Content-Disposition: attachment; filename="attachment.txt"
+
+this is an attachment
+
+------- =_aaaaaaaaaa0--
+EOF
+
+test_attachment "${testname}.expected"
+
+rm -f ${MHMTSCONF} "${MH_TEST_DIR}/attachment.txt"
+
+exit ${failed:-0}
static int attach(char *, char *, int);
static void clean_up_temporary_files(void);
static int get_line(void);
-static void make_mime_composition_file_entry(char *, int);
+static void make_mime_composition_file_entry(char *, int, char *);
/*
/*
* Add a mhbuild MIME composition file line for the body if there was one.
+ * Set the default content type to text/plain so that mhbuild takes care
+ * of any necessary encoding.
*/
if (has_body)
- make_mime_composition_file_entry(body_file_name, attachformat);
+ make_mime_composition_file_entry(body_file_name, attachformat,
+ "text/plain");
/*
* Now, go back to the beginning of the draft file and look for header fields
for (p = field + length + 1; *p == ' ' || *p == '\t'; p++)
;
- make_mime_composition_file_entry(p, attachformat);
+ /* Don't set the default content type so take
+ make_mime_composition_file_entry() will try to infer it
+ from the file type. */
+ make_mime_composition_file_entry(p, attachformat, 0);
}
}
}
static void
-make_mime_composition_file_entry(char *file_name, int attachformat)
+make_mime_composition_file_entry(char *file_name, int attachformat,
+ char *default_content_type)
{
int binary; /* binary character found flag */
int c; /* current character */
char *p; /* miscellaneous string pointer */
struct stat st; /* file status buffer */
- content_type = (char *)0;
+ content_type = default_content_type;
/*
* Check the file name for a suffix. Scan the context for that suffix on a