Additional top-level class in compilation unit: AsciiOutputStream.
There are a set of methods to encode and decode MIME headers as
per RFC 2047. Note that, in general, these methods are
not needed when using methods such as
setSubject and setRecipients; JavaMail
will automatically encode and decode data when using these "higher
level" methods. The methods below are only needed when maniuplating
raw MIME headers using setHeader and getHeader
methods. A brief description on handling such headers is given below:
RFC 822 mail headers must contain only US-ASCII characters. Headers that contain non US-ASCII characters must be encoded so that they contain only US-ASCII characters. Basically, this process involves using either BASE64 or QP to encode certain characters. RFC 2047 describes this in detail.
In Java, Strings contain (16 bit) Unicode characters. ASCII is a subset of Unicode (and occupies the range 0 - 127). A String that contains only ASCII characters is already mail-safe. If the String contains non US-ASCII characters, it must be encoded. An additional complexity in this step is that since Unicode is not yet a widely used charset, one might want to first charset-encode the String into another charset and then do the transfer-encoding.
Note that to get the actual bytes of a mail-safe String (say, for sending over SMTP), one must do
byte[] bytes = string.getBytes("iso-8859-1");
The setHeader and addHeader methods
on MimeMessage and MimeBodyPart assume that the given header values
are Unicode strings that contain only US-ASCII characters. Hence
the callers of those methods must insure that the values they pass
do not contain non US-ASCII characters. The methods in this class
help do this.
The getHeader family of methods on MimeMessage and
MimeBodyPart return the raw header value. These might be encoded
as per RFC 2047, and if so, must be decoded into Unicode Strings.
The methods in this class help to do this.
Several System properties control strict conformance to the MIME spec. Note that these are not session properties but must be set globally as System properties.
The mail.mime.decodetext.strict property controls
decoding of MIME encoded words. The MIME spec requires that encoded
words start at the beginning of a whitespace separated word. Some
mailers incorrectly include encoded words in the middle of a word.
If the mail.mime.decodetext.strict System property is
set to "false", an attempt will be made to decode these
illegal encoded words. The default is true.
The mail.mime.encodeeol.strict property controls the
choice of Content-Transfer-Encoding for MIME parts that are not of
type "text". Often such parts will contain textual data for which
an encoding that allows normal end of line conventions is appropriate.
In rare cases, such a part will appear to contain entirely textual
data, but will require an encoding that preserves CR and LF characters
without change. If the mail.mime.encodeeol.strict
System property is set to "true", such an encoding will
be used when necessary. The default is false.
In addition, the mail.mime.charset System property can
be used to specify the default MIME charset to use for encoded words
and text parts that don't otherwise specify a charset. Normally, the
default MIME charset is derived from the default Java charset, as
specified in the file.encoding System property. Most
applications will have no need to explicitly set the default MIME
charset. In cases where the default MIME charset to be used for
mail messages is different than the charset used for files stored on
the system, this property should be set.
The current implementation also supports the following System property.
The mail.mime.ignoreunknownencoding property controls
whether unknown values in the Content-Transfer-Encoding
header, as passed to the decode method, cause an exception.
If set to "true", unknown values are ignored and 8bit
encoding is assumed. Otherwise, unknown values cause a MessagingException
to be thrown.
| Modifier and Type | Field and Description |
|---|---|
| public static final int | |
| pack-priv static final int | |
| private static final boolean | |
| private static final boolean | |
| private static String | |
| private static String | |
| private static final boolean | |
| private static final boolean | |
| private static final boolean | |
| private static final boolean | |
| private static Map | |
| private static Map | |
| pack-priv static final int | |
| pack-priv static final int | |
| private static final Map |
| Access | Constructor and Description |
|---|---|
| private |
| Modifier and Type | Method and Description |
|---|---|
| pack-priv static int | Returns: ALL_ASCII if all characters in the string belong to the US-ASCII charset. MOSTLY_ASCII if more than half of the available characters are US-ASCII characters. Else MOSTLY_NONASCII.string s)Check if the given string contains non US-ASCII characters. |
| pack-priv static int | Returns: ALL_ASCII if all characters in the string belong to the US-ASCII charset. MOSTLY_ASCII if more than half of the available characters are US-ASCII characters. Else MOSTLY_NONASCII. XXX - this method is no longer usedbyte array b)Check if the given byte array contains non US-ASCII characters. |
| pack-priv static int | Returns: ALL_ASCII if all characters in the string belong to the US-ASCII charset. MOSTLY_ASCII if more than half of the available characters are US-ASCII characters. Else MOSTLY_NONASCII.the input stream is, int maximum bytes to check for. The special value
ALL indicates that all the bytes in this input
stream must be checked. max, boolean if breakOnNonAscii)true, then terminate the
the check when the first non-US-ASCII character
is found.Check if the given input stream contains non US-ASCII characters. |
| public static InputStream | Returns: decoded input stream.input stream is, String the encoding of the stream. encoding)Decode the given input stream. |
| private static String | |
| public static String | Returns: the decoded textthe possibly encoded value etext)Decode "unstructured" headers, that is, headers that are defined as '*text' as per RFC 822. |
| public static String | Returns: the decoded wordthe encoded value eword)The string is parsed using the rules in RFC 2047 and RFC 2231 for parsing an "encoded-word". |
| private static void | doEncode(String string, boolean b64, String jcharset, int avail, String prefix, boolean first, boolean encodingWord, StringBuilder buf)
|
| public static OutputStream | Returns: output stream that applies the specified encoding.output stream os, String the encoding of the stream. encoding)Wrap an encoder around the given output stream. |
| public static OutputStream | Returns: output stream that applies the specified encoding.output stream os, String the encoding of the stream. encoding, String name for the file being encoded (only used
with uuencode) filename)Wrap an encoder around the given output stream. |
| public static String | Returns: Unicode string containing only US-ASCII charactersUnicode string text)Encode a RFC 822 "text" token into mail-safe form as per RFC 2047. |
| public static String | Returns: Unicode string containing only US-ASCII charactersthe header value text, String the charset. If this parameter is null, the
platform's default chatset is used. charset, String the encoding to be used. Currently supported
values are "B" and "Q". If this parameter is null, then
the "Q" encoding is used if most of characters to be
encoded are in the ASCII charset, otherwise "B" encoding
is used. encoding)Encode a RFC 822 "text" token into mail-safe form as per RFC 2047. |
| public static String | Returns: Array of Unicode strings containing only US-ASCII characters.Unicode string word)Encode a RFC 822 "word" token into mail-safe form as per RFC 2047. |
| public static String | Returns: Unicode string containing only US-ASCII charactersUnicode string word, String the MIME charset charset, String the encoding to be used. Currently supported
values are "B" and "Q". If this parameter is null, then
the "Q" encoding is used if most of characters to be
encoded are in the ASCII charset, otherwise "B" encoding
is used. encoding)Encode a RFC 822 "word" token into mail-safe form as per RFC 2047. |
| private static String | |
| public static String | |
| public static String | Returns: the default charset of the system's default locale, as a Java charset. (NOT a MIME charset)Get the default charset corresponding to the system's current default locale. |
| pack-priv static String | |
| public static String | Returns: the encoding. This is either "7bit", "quoted-printable" or "base64"the DataSource ds)Get the Content-Transfer-Encoding that should be applied to the input stream of this DataSource, to make it mail-safe. |
| public static String | Returns: the Content-Transfer-Encodingthe DataHandler dh)Same as |
| private static int | indexOfAny(String s, String any)
Return the first index of any of the characters in "any" in "s", or -1 if none are found. |
| private static int | |
| public static String | Returns: the Java charset equivalent. If a suitable mapping is not available, the passed in charset is itself returned.the MIME charset name charset)Convert a MIME charset name into a valid Java charset name. |
| private static void | |
| private static String | makesafe(CharSequence s)
If the String or StringBuilder has any embedded newlines, make sure they're followed by whitespace, to prevent header injection errors. |
| public static String | Returns: the MIME/IANA equivalent. If a mapping is not possible, the passed in charset itself is returned.the JDK charset charset)Convert a java charset into its MIME charset name. |
| pack-priv static final boolean | |
| private static boolean | nonAsciiCharset(ContentType ct)
Determine whether the charset in the Content-Type is compatible with ASCII or not. |
| public static String | |
| public static String |
| ALL | back to summary |
|---|---|
| public static final int ALL | |
| ALL_ASCII | back to summary |
|---|---|
| pack-priv static final int ALL_ASCII | |
| allowUtf8 | back to summary |
|---|---|
| private static final boolean allowUtf8 | |
| decodeStrict | back to summary |
|---|---|
| private static final boolean decodeStrict | |
| defaultJavaCharset | back to summary |
|---|---|
| private static String defaultJavaCharset | |
| defaultMIMECharset | back to summary |
|---|---|
| private static String defaultMIMECharset | |
| encodeEolStrict | back to summary |
|---|---|
| private static final boolean encodeEolStrict | |
| foldEncodedWords | back to summary |
|---|---|
| private static final boolean foldEncodedWords | |
| foldText | back to summary |
|---|---|
| private static final boolean foldText | |
| ignoreUnknownEncoding | back to summary |
|---|---|
| private static final boolean ignoreUnknownEncoding | |
| java2mime | back to summary |
|---|---|
| private static Map<String, String> java2mime | |
| mime2java | back to summary |
|---|---|
| private static Map<String, String> mime2java | |
| MOSTLY_ASCII | back to summary |
|---|---|
| pack-priv static final int MOSTLY_ASCII | |
| MOSTLY_NONASCII | back to summary |
|---|---|
| pack-priv static final int MOSTLY_NONASCII | |
| nonAsciiCharsetMap | back to summary |
|---|---|
| private static final Map<String, Boolean> nonAsciiCharsetMap | |
| MimeUtility | back to summary |
|---|---|
| private MimeUtility() | |
| checkAscii | back to summary |
|---|---|
| pack-priv static int checkAscii(String s) Check if the given string contains non US-ASCII characters.
| |
| checkAscii | back to summary |
|---|---|
| pack-priv static int checkAscii(byte[] b) Check if the given byte array contains non US-ASCII characters.
| |
| checkAscii | back to summary |
|---|---|
| pack-priv static int checkAscii(InputStream is, int max, boolean breakOnNonAscii) Check if the given input stream contains non US-ASCII characters.
Upto
| |
| decode | back to summary |
|---|---|
| public static InputStream decode(InputStream is, String encoding) throws MessagingException Decode the given input stream. The Input stream returned is the decoded input stream. All the encodings defined in RFC 2045 are supported here. They include "base64", "quoted-printable", "7bit", "8bit", and "binary". In addition, "uuencode" is also supported.
In the current implementation, if the
| |
| decodeInnerWords | back to summary |
|---|---|
| private static String decodeInnerWords(String word) throws UnsupportedEncodingException Look for encoded words within a word. The MIME spec doesn't allow this, but many broken mailers, especially Japanese mailers, produce such incorrect encodings. | |
| decodeText | back to summary |
|---|---|
| public static String decodeText(String etext) throws UnsupportedEncodingException Decode "unstructured" headers, that is, headers that are defined as '*text' as per RFC 822. The string is decoded using the algorithm specified in RFC 2047, Section 6.1. If the charset-conversion fails for any sequence, an UnsupportedEncodingException is thrown. If the String is not an RFC 2047 style encoded header, it is returned as-is Example of usage:
| |
| decodeWord | back to summary |
|---|---|
| public static String decodeWord(String eword) throws ParseException, UnsupportedEncodingException The string is parsed using the rules in RFC 2047 and RFC 2231 for parsing an "encoded-word". If the parse fails, a ParseException is thrown. Otherwise, it is transfer-decoded, and then charset-converted into Unicode. If the charset-conversion fails, an UnsupportedEncodingException is thrown.
| |
| doEncode | back to summary |
|---|---|
| private static void doEncode(String string, boolean b64, String jcharset, int avail, String prefix, boolean first, boolean encodingWord, StringBuilder buf) throws UnsupportedEncodingException | |
| encode | back to summary |
|---|---|
| public static OutputStream encode(OutputStream os, String encoding) throws MessagingException Wrap an encoder around the given output stream. All the encodings defined in RFC 2045 are supported here. They include "base64", "quoted-printable", "7bit", "8bit" and "binary". In addition, "uuencode" is also supported.
| |
| encode | back to summary |
|---|---|
| public static OutputStream encode(OutputStream os, String encoding, String filename) throws MessagingException Wrap an encoder around the given output stream.
All the encodings defined in RFC 2045 are supported here.
They include "base64", "quoted-printable", "7bit", "8bit" and
"binary". In addition, "uuencode" is also supported.
The
| |
| encodeText | back to summary |
|---|---|
| public static String encodeText(String text) throws UnsupportedEncodingException Encode a RFC 822 "text" token into mail-safe form as per RFC 2047. The given Unicode string is examined for non US-ASCII characters. If the string contains only US-ASCII characters, it is returned as-is. If the string contains non US-ASCII characters, it is first character-encoded using the platform's default charset, then transfer-encoded using either the B or Q encoding. The resulting bytes are then returned as a Unicode string containing only ASCII characters. Note that this method should be used to encode only "unstructured" RFC 822 headers. Example of usage:
| |
| encodeText | back to summary |
|---|---|
| public static String encodeText(String text, String charset, String encoding) throws UnsupportedEncodingException Encode a RFC 822 "text" token into mail-safe form as per RFC 2047. The given Unicode string is examined for non US-ASCII characters. If the string contains only US-ASCII characters, it is returned as-is. If the string contains non US-ASCII characters, it is first character-encoded using the specified charset, then transfer-encoded using either the B or Q encoding. The resulting bytes are then returned as a Unicode string containing only ASCII characters. Note that this method should be used to encode only "unstructured" RFC 822 headers.
| |
| encodeWord | back to summary |
|---|---|
| public static String encodeWord(String word) throws UnsupportedEncodingException Encode a RFC 822 "word" token into mail-safe form as per RFC 2047. The given Unicode string is examined for non US-ASCII characters. If the string contains only US-ASCII characters, it is returned as-is. If the string contains non US-ASCII characters, it is first character-encoded using the platform's default charset, then transfer-encoded using either the B or Q encoding. The resulting bytes are then returned as a Unicode string containing only ASCII characters. This method is meant to be used when creating RFC 822 "phrases". The InternetAddress class, for example, uses this to encode it's 'phrase' component.
| |
| encodeWord | back to summary |
|---|---|
| public static String encodeWord(String word, String charset, String encoding) throws UnsupportedEncodingException Encode a RFC 822 "word" token into mail-safe form as per RFC 2047. The given Unicode string is examined for non US-ASCII characters. If the string contains only US-ASCII characters, it is returned as-is. If the string contains non US-ASCII characters, it is first character-encoded using the specified charset, then transfer-encoded using either the B or Q encoding. The resulting bytes are then returned as a Unicode string containing only ASCII characters.
| |
| encodeWord | back to summary |
|---|---|
| private static String encodeWord(String string, String charset, String encoding, boolean encodingWord) throws UnsupportedEncodingException | |
| fold | back to summary |
|---|---|
| public static String fold(int used, String s) Fold a string at linear whitespace so that each line is no longer
than 76 characters, if possible. If there are more than 76
non-whitespace characters consecutively, the string is folded at
the first whitespace after that sequence. The parameter
Note that line breaks in the string aren't escaped; they probably should be. | |
| getDefaultJavaCharset | back to summary |
|---|---|
| public static String getDefaultJavaCharset() Get the default charset corresponding to the system's current
default locale. If the System property
| |
| getDefaultMIMECharset | back to summary |
|---|---|
| pack-priv static String getDefaultMIMECharset() | |
| getEncoding | back to summary |
|---|---|
| public static String getEncoding(DataSource ds) Get the Content-Transfer-Encoding that should be applied to the input stream of this DataSource, to make it mail-safe.
The algorithm used here is:
| |
| getEncoding | back to summary |
|---|---|
| public static String getEncoding(DataHandler dh) Same as
| |
| indexOfAny | back to summary |
|---|---|
| private static int indexOfAny(String s, String any) Return the first index of any of the characters in "any" in "s", or -1 if none are found. This should be a method on String. | |
| indexOfAny | back to summary |
|---|---|
| private static int indexOfAny(String s, String any, int start) | |
| javaCharset | back to summary |
|---|---|
| public static String javaCharset(String charset) Convert a MIME charset name into a valid Java charset name.
| |
| loadMappings | back to summary |
|---|---|
| private static void loadMappings(LineInputStream is, Map<String, String> table) | |
| makesafe | back to summary |
|---|---|
| private static String makesafe(CharSequence s) If the String or StringBuilder has any embedded newlines, make sure they're followed by whitespace, to prevent header injection errors. | |
| mimeCharset | back to summary |
|---|---|
| public static String mimeCharset(String charset) Convert a java charset into its MIME charset name. Note that a future version of JDK (post 1.2) might provide this functionality, in which case, we may deprecate this method then. | |
| nonascii | back to summary |
|---|---|
| pack-priv static final boolean nonascii(int b) | |
| nonAsciiCharset | back to summary |
|---|---|
| private static boolean nonAsciiCharset(ContentType ct) Determine whether the charset in the Content-Type is compatible with ASCII or not. A charset is compatible with ASCII if the encoded byte stream representing the Unicode string "\r\n" is the ASCII characters CR and LF. For example, the utf-16be charset is not compatible with ASCII. For performance, we keep a static map that caches the results. | |
| quote | back to summary |
|---|---|
| public static String quote(String word, String specials) A utility method to quote a word, if the word contains any characters from the specified 'specials' list.
The This method is typically used during the generation of RFC 822 and MIME header fields.
| |
| unfold | back to summary |
|---|---|
| public static String unfold(String s) Unfold a folded header. Any line breaks that aren't escaped and are followed by whitespace are removed. | |