}
m_getfld_state_destroy (&gstate);
- /*
- * Iterate through the list of headers and call the function to MIME-ify
- * them if required.
- */
-
- for (hp = ct->c_first_hf; hp != NULL; hp = hp->next) {
- if (encode_rfc2047(hp->name, &hp->value, header_encoding, NULL)) {
- adios(NULL, "Unable to encode header \"%s\"", hp->name);
- }
+ if (header_encoding != CE_8BIT) {
+ /*
+ * Iterate through the list of headers and call the function to MIME-ify
+ * them if required.
+ */
+
+ for (hp = ct->c_first_hf; hp != NULL; hp = hp->next) {
+ if (encode_rfc2047(hp->name, &hp->value, header_encoding, NULL)) {
+ adios(NULL, "Unable to encode header \"%s\"", hp->name);
+ }
+ }
}
/*
* Decide what to check while scanning this content. Note that
* for text content we always check for 8bit characters if the
* charset is unspecified, because that controls whether or not the
- * character set is us-ascii or retrieved from the locale.
+ * character set is us-ascii or retrieved from the locale. And
+ * we check even if the charset is specified, to allow setting
+ * the proper Content-Transfer-Encoding.
*/
if (ct->c_type == CT_TEXT) {
t = (struct text *) ct->c_ctparams;
if (t->tx_charset == CHARSET_UNSPECIFIED) {
- check8bit = 1;
checknul = 1;
}
+ check8bit = 1;
}
switch (ct->c_reqencoding) {
if (ct->c_descr) {
np = add (DESCR_FIELD, NULL);
vp = concat (" ", ct->c_descr, NULL);
- if (encode_rfc2047(DESCR_FIELD, &vp, header_encoding, NULL))
- adios(NULL, "Unable to encode %s header", DESCR_FIELD);
+ if (header_encoding != CE_8BIT) {
+ if (encode_rfc2047(DESCR_FIELD, &vp, header_encoding, NULL)) {
+ adios(NULL, "Unable to encode %s header", DESCR_FIELD);
+ }
+ }
add_header (ct, np, vp);
}
struct str2init *s2i;
CT reply_ct;
struct part *part;
+ int eightbit = 0;
int status;
type_p = getcpy (type);
return;
}
+ /* For text content only, see if it is 8-bit text. */
+ if (reply_ct->c_type == CT_TEXT) {
+ int fd;
+
+ if ((fd = open (reply_file, O_RDONLY)) == NOTOK ||
+ scan_input (fd, &eightbit) == NOTOK) {
+ free (reply_file);
+ admonish (NULL, "failed to read %s", reply_file);
+ return;
+ } else {
+ (void) close (fd);
+ }
+ }
+
/* This sets reply_ct->c_ctparams, and reply_ct->c_termproc if the
charset can't be handled natively. */
for (s2i = str2cts; s2i->si_key; s2i++) {
} else {
set_charset (reply_ct, -1);
charset = get_param (reply_ct->c_ctinfo.ci_first_pm, "charset", '?', 1);
- if (reply_ct->c_reqencoding == CE_UNKNOWN) {
- /* Assume that 8bit is sufficient (for text). */
- reply_ct->c_reqencoding =
- strcasecmp (charset, "US-ASCII") ? CE_8BIT : CE_7BIT;
+ if (reply_ct->c_reqencoding == CE_UNKNOWN &&
+ reply_ct->c_type == CT_TEXT) {
+ /* Assume that 8bit is sufficient (for text). In other words,
+ don't allow it to be encoded as quoted printable if lines
+ are too long. This also sidesteps the check for whether
+ it needs to be encoded as binary; instead, it relies on
+ the applicable mhbuild-convert-text directive to ensure
+ that the resultant text is not binary. */
+ reply_ct->c_reqencoding = eightbit ? CE_8BIT : CE_7BIT;
}
}
part. */
set_charset (*text_plain_ct, -1);
if ((*text_plain_ct)->c_reqencoding == CE_UNKNOWN) {
- /* Assume that 8bit is sufficient (for text). */
+ /* Assume that 8bit is sufficient (for text). In other words,
+ don't allow it to be encoded as quoted printable if lines
+ are too long. This also sidesteps the check for whether
+ it needs to be encoded as binary; instead, it relies on
+ the applicable mhbuild-convert-text directive to ensure
+ that the resultant text is not binary. */
(*text_plain_ct)->c_reqencoding =
- strcasecmp (charset, "US-ASCII") ? CE_8BIT : CE_7BIT;
+ eightbit ? CE_8BIT : CE_7BIT;
}
}
reply_file);
if (close (text_plain_reply) == OK &&
close (addl_reply) == OK) {
+ /* If appended text needed 8-bit but first text didn't,
+ propagate the 8-bit indication. */
+ if ((*text_plain_ct)->c_reqencoding == CE_7BIT &&
+ reply_ct->c_reqencoding == CE_8BIT) {
+ (*text_plain_ct)->c_reqencoding = CE_8BIT;
+ }
+
if (reply_fp) { fclose (reply_fp); }
free (reply_file);
free_content (reply_ct);
reply_ct->c_cefile.ce_fp = reply_fp;
reply_ct->c_cefile.ce_unlink = 1;
- /* Attach the new part to the parent mulitpart/mixed, "m". */
+ /* Attach the new part to the parent multipart/mixed, "m". */
part = (struct part *) mh_xcalloc (1, sizeof *part);
part->mp_part = reply_ct;
if (m->mp_parts) {