diff --git a/src/com/fsck/k9/activity/MessageCompose.java b/src/com/fsck/k9/activity/MessageCompose.java index 5952c8ccc..75805e9b6 100644 --- a/src/com/fsck/k9/activity/MessageCompose.java +++ b/src/com/fsck/k9/activity/MessageCompose.java @@ -36,6 +36,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.StringTokenizer; +import org.apache.james.mime4j.codec.EncoderUtil; public class MessageCompose extends K9Activity implements OnClickListener, OnFocusChangeListener { @@ -747,10 +748,41 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc for (int i = 0, count = mAttachments.getChildCount(); i < count; i++) { Attachment attachment = (Attachment) mAttachments.getChildAt(i).getTag(); - MimeBodyPart bp = new MimeBodyPart(new LocalStore.LocalAttachmentBody(attachment.uri, getApplication())); - bp.addHeader(MimeHeader.HEADER_CONTENT_TYPE, String.format("%s;\n name=\"%s\"", attachment.contentType, attachment.name)); + + MimeBodyPart bp = new MimeBodyPart( + new LocalStore.LocalAttachmentBody(attachment.uri, getApplication())); + + /* + * Correctly encode the filename here. Otherwise the whole + * header value (all parameters at once) will be encoded by + * MimeHeader.writeTo(). + */ + bp.addHeader(MimeHeader.HEADER_CONTENT_TYPE, String.format("%s;\n name=\"%s\"", + attachment.contentType, + EncoderUtil.encodeIfNecessary(attachment.name, + EncoderUtil.Usage.WORD_ENTITY, 7))); + bp.addHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, "base64"); - bp.addHeader(MimeHeader.HEADER_CONTENT_DISPOSITION, String.format("attachment;\n filename=\"%s\";\n size=%d", attachment.name, attachment.size)); + + /* + * TODO: Oh the joys of MIME... + * + * From RFC 2183 (The Content-Disposition Header Field): + * "Parameter values longer than 78 characters, or which + * contain non-ASCII characters, MUST be encoded as specified + * in [RFC 2184]." + * + * Example: + * + * Content-Type: application/x-stuff + * title*1*=us-ascii'en'This%20is%20even%20more%20 + * title*2*=%2A%2A%2Afun%2A%2A%2A%20 + * title*3="isn't it!" + */ + bp.addHeader(MimeHeader.HEADER_CONTENT_DISPOSITION, String.format( + "attachment;\n filename=\"%s\";\n size=%d", + attachment.name, attachment.size)); + mp.addBodyPart(bp); }