JavaMail 1.3 ============ (Updated April 1, 2002) Following is a description of the new APIs that are being introduced in JavaMail 1.3. The numbers in parentheses are bug numbers; you can find more information about the bug reports at: http://developer.java.sun.com/developer/bugParade/index.html Please send comments and feedback to javamail@sun.com. Many of these changes expand JavaMail's conformance with Internet standards, or make JavaMail more tolerant of messages that don't quite conform to the standards. "Be liberal in what you receive and conservative in what you send." =================================================================== 1. Add setSender and getSender methods to MimeMessage (4405115) --------------------------------------------------------------- These convenience methods support setting and reading the RFC 822 Sender header. /** * Returns the value of the RFC 822 "Sender" header field. * If the "Sender" header field is absent, null * is returned.

* * This implementation uses the getHeader method * to obtain the requisite header field. * * @return Address object * @exception MessagingException * @see #headers * @since JavaMail 1.3 */ public Address getSender() throws MessagingException /** * Set the RFC 822 "Sender" header field. Any existing values are * replaced with the given address. If address is null, * this header is removed. * * @param address the sender of this message * @exception IllegalWriteException if the underlying * implementation does not support modification * of existing values * @exception IllegalStateException if this message is * obtained from a READ_ONLY folder. * @exception MessagingException * @since JavaMail 1.3 */ public void setSender(Address address) throws MessagingException =================================================================== 2. Add setContentID method to MimeBodyPart (4377720) ---------------------------------------------------- This convenience method supports setting the Content-ID header. /** * Set the "Content-ID" header field of this body part. * If the cid parameter is null, any existing * "Content-ID" is removed. * * @exception IllegalWriteException if the underlying * implementation does not support modification * @exception IllegalStateException if this body part is * obtained from a READ_ONLY folder. * @exception MessagingException * @since JavaMail 1.3 */ public void setContentID(String cid) throws MessagingException =================================================================== 3. Add mail.mime.charset property (4377731) ------------------------------------------- The "mail.mime.charset" System property (NOTE: *not* Session property) names the default charset to be used by JavaMail. If not set, the standard J2SE "file.encoding" System property is used. This allows applications to specify a default character set for sending messages that's different than the character set used for files stored on the system. This is common on Japanese systems. =================================================================== 4. Add getDeletedMesageCount method to Folder (4388730) ------------------------------------------------------- This convenience method would return a count of the number of deleted messages in a folder. /** * Get the number of deleted messages in this Folder.

* * This method can be invoked on a closed folder. However, note * that for some folder implementations, getting the deleted message * count can be an expensive operation involving actually opening * the folder. In such cases, a provider can choose not to support * this functionality in the closed state, in which case this method * must return -1.

* * Clients invoking this method on a closed folder must be aware * that this is a potentially expensive operation. Clients must * also be prepared to handle a return value of -1 in this case.

* * This implementation returns -1 if this folder is closed. Else * this implementation gets each Message in the folder using * getMessage(int) and checks whether its * DELETED flag is set. The total number of messages * that have this flag set is returned. * * @return number of deleted messages. -1 may be returned * by certain implementations if this method is * invoked on a closed folder. * @exception FolderNotFoundException if this folder does * not exist. * @exception MessagingException * @since JavaMail 1.3 */ public int getDeletedMessageCount() throws MessagingException =================================================================== 5. Support parsing "illegal" Internet addresses (4650940) --------------------------------------------------------- The parse method on the InternetAddress class takes a flag that tells whether or not to strictly enforce the RFC822 syntax rules. Currently, when the flag is false most rules are still checked while a few are not. To better support the range of "invalid" addresses seen in real messages, and in combination with the following two changes, the parseHeader method would enforce fewer syntax rules when the strict flag is false and would enforce more rules when the strict flag is true. If the strict flag is false and the parse is successful in separating out an email address or addresses, the syntax of the addresses themselves would not be checked. (Introducing a new method preserves compatibility with users of the existing parse method.) /** * Parse the given sequence of addresses into InternetAddress * objects. If strict is false, the full syntax rules for * individual addresses are not enforced. If strict is * true, many (but not all) of the RFC822 syntax rules are enforced. * * Non-strict parsing is typically used when parsing a list of * mail addresses entered by a human. Strict parsing is typically * used when parsing address headers in mail messages. * * @param addresslist comma separated address strings * @param strict enforce RFC822 syntax * @return array of InternetAddress objects * @exception AddressException if the parse failed * @since JavaMail 1.3 */ public static InternetAddress[] parseHeader(String s, boolean strict) throws AddressException To allow applications to check the syntax of addresses that might've been parsed with the strict flag set to false, we add a validate method. /** * Validate that this address conforms to the syntax rules * of RFC 822. The current implementation checks many, not * all, syntax rules. Note that, even though the syntax of * the address may be correct, there's no guarantee that a * mailbox of that name exists. * * @exception AddressException if the address * isn't valid. * @since JavaMail 1.3 */ public void validate() throws AddressException To control the strict flag when constructing a single InternetAddress object we add a new constructor. /** * Parse the given string and create an InternetAddress. * If strict is false, the detailed syntax of the * address isn't checked. * * @param address the address in RFC822 format * @param strict enforce RFC822 syntax * @exception AddressException if the parse failed * @since JavaMail 1.3 */ public InternetAddress(String address, boolean strict) throws AddressException =================================================================== 6. Add mail.mime.address.strict property (4650940) -------------------------------------------------- The MimeMessage class will use the new parseHeader method introduced above to parse headers in messages. The "mail.mime.address.strict" Session property will control the strict flag passed to the parseHeader method. The default is true. =================================================================== 7. Add mail.mime.decodetext.strict property (4201203) ----------------------------------------------------- RFC 2047 requires that encoded text start at the beginning of a whitespace separated word. Some mailers, especially Japanese mailers, improperly encode text and included encoded text in the middle of words. The "mail.mime.decodetext.strict" System property (NOTE: *not* Session property) controls whether JavaMail will attempt to decode such incorrectly encoded text. The default is true. =================================================================== 8. Add mail.mime.encodeeol.strict property (4650949) ---------------------------------------------------- When choosing an encoding for the data of a message, JavaMail assumes that any of CR, LF, or CRLF are valid line terminators in message parts that contain only printable ASCII characters, even if the part is not a MIME text type. It's common, especially on UNIX systems, for data of MIME type application/octet-stream (for example) to really be textual data that should be transmitted with the encoding rules for MIME text. In rare cases, such pure ASCII text may in fact be binary data in which the CR and LF characters must be preserved exactly. The "mail.mime.encodeeol.strict" System property (NOTE: *not* Session property) controls whether JavaMail will consider a lone CR or LF in a body part that's not a MIME text type to indicate that the body part needs to be encoded. =================================================================== 9. Add isGroup and getGroup methods to InternetAddress (4650952) ---------------------------------------------------------------- To better support RFC822 group addresses, the following methods would be added. /** * Indicates whether this address is an RFC 822 group address. * Note that a group address is different than the mailing * list addresses supported by most mail servers. Group addresses * are rarely used; see RFC 822 for details. * * @return true if this address represents a group * @since JavaMail 1.3 */ public boolean isGroup() /** * Return the members of a group address. A group may have zero, * one, or more members. If this address is not a group, null * is returned. The strict parameter controls whether * the group list is parsed using strict RFC 822 rules or not. * The parsing is done using the parseHeader method. * * @return array of InternetAddress objects, or null * @exception AddressException if the group list can't be parsed * @since JavaMail 1.3 */ public InternetAddress[] getGroup(boolean strict) throws AddressException =================================================================== 10. Support per-session debug output stream (4517686) ----------------------------------------------------- To allow the debugging output for a session to be redirected, we add the following methods to Session. /** * Set the stream to be used for debugging output for this session. * If out is null, System.out will be used. * Note that debugging output that occurs before any session is created, * as a result of setting the mail.debug system property, * will always be sent to System.out. * * @param out the PrintStream to use for debugging output * @since JavaMail 1.3 */ public void setDebugOut(PrintStream out) /** * Returns the stream to be used for debugging output. If no stream * has been set, System.out is returned. * * @return the PrintStream to use for debugging output * @since JavaMail 1.3 */ public PrintStream getDebugOut()