Check the JavaMail docs... I don't think I would have designed it this way, but per the API, when you call MimeMessage.setContent(blah), you have to call saveChanges() (I forget the exact method name) to apply your changes.
I thought I had added code within James to automatically do this after a mailet services a message so mailet authors don't have to deal with this, but somehow in the way your constructing the message, James isn't doing this for you automatically. -- Serge Knystautas Loki Technologies - Unstoppable Websites http://www.lokitech.com/ Samuel Sadek wrote: > I would appreciate it if anyone can provide some useful input into this > issue. > > Thanks, > > Sam. > > >> From: "Samuel Sadek" <[EMAIL PROTECTED]> >> Reply-To: "James Users List" <[EMAIL PROTECTED]> >> To: [EMAIL PROTECTED] >> Subject: Re: Matcher/Mailet Library >> Date: Tue, 14 May 2002 18:56:45 +0100 >> >> Noel, >> >> I have successfully reformatted the body attachment message, and have >> used >> the Mail.setMessage(MimeMessage) method to modify the original multipart >> message content. When I then referred to the actual file content it still >> had the body attachment line length of 60? Why hasn't the method >> updated the >> message content with the newly recreated version with the 76 line length >> reformat using the mentioned method? >> >> Please find the following mailet which does the actual reformatting: >> >> public class ReformatAttachment extends GenericMailet { >> >> /*public void init() throws MessagingException { >> }*/ >> >> /** >> * Reformats all body attachment line lengths to a max of 76 chars >> * as per SMTP standard. >> */ >> public void service(Mail mail) throws MessagingException { >> MimeMessage message = mail.getMessage(); >> >> if (message.isMimeType("multipart/*")) >> { >> //Create the reply message >> MimeMessage reply = new >> MimeMessage(Session.getDefaultInstance(System.getProperties(), null)); >> //Copy all headers >> Enumeration heads = message.getAllHeaders(); >> while (heads.hasMoreElements()) { >> Header head = (Header)heads.nextElement(); >> if (head.getValue() != null) >> reply.addHeader(head.getName(), head.getValue()); >> } >> >> try { >> //Create the message body >> MimeMultipart multipart = new MimeMultipart(); >> MimeBodyPart origPart = null; >> >> int c = 0; >> for (MimeMultipart multi = >> (MimeMultipart)message.getContent(); c < >> multi.getCount(); c++) >> { >> MimeBodyPart part = new MimeBodyPart(); >> origPart = (MimeBodyPart)multi.getBodyPart(c); >> >> //Copy all part's headers >> Enumeration partheads = origPart.getAllHeaders(); >> >> if (partheads != null) >> { >> while (partheads.hasMoreElements()) { >> Header header = >> (Header)partheads.nextElement(); >> if (header.getValue() != null) >> part.addHeader(header.getName(), >> header.getValue()); >> } >> } >> >> if (origPart.isMimeType("text/*") || >> "text/*".equalsIgnoreCase(origPart.getContentType())) >> { >> part.setContent(origPart.getContent(), >> origPart.getContentType()); >> } >> // ...else reformat content line lengths to 76 max >> chars >> else >> { >> //Create the message >> ByteArrayOutputStream bout = new >> ByteArrayOutputStream(); >> OutputStream out = (OutputStream) bout; >> InputStream in = null; >> //InputStream in = origPart.getInputStream(); >> Object obj = origPart.getContent(); >> int i = 1; >> int b = -1; >> if (obj instanceof InputStream) >> { >> String enc = origPart.getEncoding(); >> in = MimeUtility.decode((InputStream)obj, enc); >> //Read in every byte >> while ((b = in.read()) != -1) >> { >> if ( i == 77 ) { >> out.write(10); >> i = 1; >> } >> if ( b != 10 ) >> { >> out.write(b); >> i++; >> } >> } >> out = MimeUtility.encode(out, enc); >> out.flush(); >> out.close(); >> } // End if >> >> //create the datasource >> MimeBodyPartDataSource mbpds = >> new MimeBodyPartDataSource( >> origPart.getContentType(), >> origPart.getFileName(), >> bout.toByteArray() >> ); >> part.setDataHandler(new DataHandler(mbpds)); >> part.setFileName(origPart.getFileName()); >> part.setDisposition("Attachment"); >> } // End if >> multipart.addBodyPart(part); >> } // End for >> reply.setContent(multipart); >> reply.setHeader("Content-Type", >> multipart.getContentType()); >> } catch (IOException ioe) { >> ioe.printStackTrace(); >> throw new MailetException("Unable to create multipart >> body"); >> } >> //Pass the revised MimeMessage for further processing... >> mail.setMessage(reply); >> System.out.println("step 6..."); >> } // End if >> } >> >> public String getMailetInfo() { >> return "ReformatAttachment Mailet"; >> } >> } >> >> And the auxiliart class: >> >> public class MimeBodyPartDataSource >> implements DataSource { >> >> //instance attributes >> private String m_Type; >> private String m_Name; >> private byte[] m_Data; >> >> /** >> * Constructs a <code>MimeBodyPartDataSource</code> >> * instance. >> * >> * @param type the content type of the constructed instance >> * as <code>String</code>. >> * @param name the name of the constructed instance >> * as <code>String</code>. >> * @param data the data of the constructed instance as >> * <code>byte[]</code>. >> * >> * @return the newly constructed <code>MimeBodyPartDataSource >> * </code>. >> */ >> public MimeBodyPartDataSource( >> String type, String name, byte[] data) { >> m_Type=type; >> m_Name=name; >> m_Data=data; >> }//constructor >> >> /** >> * Returns the content type of this instance as >> * <code>String</code>. >> * <p>(DataSource implementation) >> * >> * @return the content type as <code>String</code> >> */ >> public String getContentType(){ >> return m_Type; >> }//getContentType >> >> /** >> * Returns the name of this instance as <code>String</code>. >> * <p>(DataSource implementation) >> * >> * @return the name as <code>String</code> >> */ >> public String getName(){ >> return m_Name; >> }//getName >> >> /** >> * Returns the data of this instance as <code> >> * InputStream</code>. >> * <p>(DataSource implementation); wraps the data >> * into a <code>ByteArrayInputStream</code>. >> * >> * @return the data of this instance as >> * <code>InputStream</code>. >> * @throws IOException if impossible. >> */ >> public InputStream getInputStream() >> throws IOException { >> >> return new ByteArrayInputStream(m_Data); >> }//getInputStream >> >> /** >> * Throws an IOException in this implementation, because >> * this instance represents a read-only <code>DataSource</code>. >> * <p>(DataSource implementation) >> * >> * @return an <code>OutputStream</code> instance for writing >> * to this <code>DataSource</code>. >> * @throws IOException if impossible. >> */ >> public OutputStream getOutputStream() >> throws IOException { >> >> throw new IOException( >> "Not supported." >> ); >> }//getOutputStream >> >> }//class MimeBodyPartDataSource >> >> >> I would appreciate your input prior to patch submission. >> >> Thanks in advance. >> >> Sam. >> >> >> >>> From: "Noel J. Bergman" <[EMAIL PROTECTED]> >>> Reply-To: "James Users List" <[EMAIL PROTECTED]> >>> To: "James Users List" <[EMAIL PROTECTED]> >>> CC: "James-Dev Mailing List" <[EMAIL PROTECTED]> >>> Subject: Matcher/Mailet Library >>> Date: Tue, 14 May 2002 13:20:32 -0400 >>> >>> > I have resolved this issue throught the creation of special processing >>> > mailet which reformats all binary content type mimebodypart >>> attachments >>> to >>> a >>> > fixed length of 76 characters. This was needed for IMAP protocol >>> processing >>> > because it cannot handle 60 character widths sent from Hotmail.com, >>> > Yahoo.com, Fastmail.fm mail servers. If you want I can submit this >>> mailet >>> > and associating config settings. Without this patch, JAMES IMAP server >>> will >>> > not be able to read in mimemultipart body attachments properly. >>> >>> My suggestion is yes, please do submit it. >>> >>> On a related note, is anything being done about a repository/library of >>> contributed matchers and mailets? That would be quite handy, since I >>> presume that not everyone's matcher and mailet will be added to the >>> distribution. If not, I will consider undertaking that as a project. >>> >>> I envision storing the library in a database. What fields would people >>> want? >>> >>> - name of component >>> - description >>> - version >>> - status (stable, unstable, ...) >>> - version of James necessary >>> - author (valid e-mail required) >>> - homepage (if the author will maintain an online presence) >>> - download (.ZIP or .TAR distribution) >>> >>> Thoughts? >>> >>> --- Noel -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
