Discussion:
[Classpathx-javamail] Folder.copyMessages
remi__
2007-05-31 10:14:40 UTC
Permalink
Hi !

I am writing some code to move a mail from a folder to another. The idea is
to copy it to another folder and then delete the orignal.

Is that normal that this code:

private void moveMail(Message message){
try {
Folder dossierSrc = message.getFolder();
Store store = dossierSrc.getStore();
Folder dossierDest = store.getFolder("processedMails");
if (dossierDest != null && dossierDest.exists()) {
dossierSrc.copyMessages(new Message[]{message}, dossierDest);
message.setFlag(Flags.Flag.DELETED,true);
}
} catch (MessagingException e) {
e.printStackTrace();
}
}

leads to a NPE:

java.lang.NullPointerException
at
gnu.mail.providers.imap.IMAPMultipartDataSource.getInputStream(IMAPMultipartDataSource.java:102)
at javax.activation.DataHandler.writeTo(DataHandler.java:215)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1618)
at gnu.mail.providers.imap.IMAPMessage.writeTo(IMAPMessage.java:859)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1553)
at gnu.mail.providers.imap.IMAPMessage.writeTo(IMAPMessage.java:845)
at gnu.mail.providers.imap.IMAPFolder.appendMessages(IMAPFolder.java:712)
at javax.mail.Folder.copyMessages(Folder.java:669)
at TestDeplacementMailGNU112.moveMail(TestDeplacementMailGNU112.java:63)
at TestDeplacementMailGNU112.test(TestDeplacementMailGNU112.java:47)
at TestDeplacementMailGNU112.main(TestDeplacementMailGNU112.java:31)


Whereas that piece of code works fine:

private void moveMail(Message message){
try {
Folder dossierSrc = message.getFolder();
Store store = dossierSrc.getStore();
Folder dossierDest = store.getFolder("processedMails");
if (dossierDest != null && dossierDest.exists()) {
dossierDest.appendMessages(new Message[]{message});
message.setFlag(Flags.Flag.DELETED,true);
}
} catch (MessagingException e) {
e.printStackTrace();
}
}


Is there any known issue in the Folder.copyMessages method?

I did the test with GNU-mail 1.1.2

Have a nice day!

thanks,

Rémi Roques
--
View this message in context: http://www.nabble.com/Folder.copyMessages-tf3845701.html#a10891071
Sent from the classpathx-javamail mailing list archive at Nabble.com.
Chris Burdess
2007-05-31 10:26:08 UTC
Permalink
Post by remi__
I am writing some code to move a mail from a folder to another. The idea is
to copy it to another folder and then delete the orignal.
private void moveMail(Message message){
try {
Folder dossierSrc = message.getFolder();
Store store = dossierSrc.getStore();
Folder dossierDest = store.getFolder("processedMails");
if (dossierDest != null && dossierDest.exists()) {
dossierSrc.copyMessages(new Message[]{message}, dossierDest);
message.setFlag(Flags.Flag.DELETED,true);
}
} catch (MessagingException e) {
e.printStackTrace();
}
}
java.lang.NullPointerException
at
gnu.mail.providers.imap.IMAPMultipartDataSource.getInputStream
(IMAPMultipartDataSource.java:102)
at javax.activation.DataHandler.writeTo(DataHandler.java:215)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1618)
at gnu.mail.providers.imap.IMAPMessage.writeTo(IMAPMessage.java:859)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1553)
at gnu.mail.providers.imap.IMAPMessage.writeTo(IMAPMessage.java:845)
at gnu.mail.providers.imap.IMAPFolder.appendMessages
(IMAPFolder.java:712)
at javax.mail.Folder.copyMessages(Folder.java:669)
at TestDeplacementMailGNU112.moveMail
(TestDeplacementMailGNU112.java:63)
at TestDeplacementMailGNU112.test(TestDeplacementMailGNU112.java:47)
at TestDeplacementMailGNU112.main(TestDeplacementMailGNU112.java:31)
private void moveMail(Message message){
try {
Folder dossierSrc = message.getFolder();
Store store = dossierSrc.getStore();
Folder dossierDest = store.getFolder("processedMails");
if (dossierDest != null && dossierDest.exists()) {
dossierDest.appendMessages(new Message[]{message});
message.setFlag(Flags.Flag.DELETED,true);
}
} catch (MessagingException e) {
e.printStackTrace();
}
}
That sounds very strange, because copyMessages simply calls
appendMessages internally.

Could you try with CVS HEAD? I've added a null pointer check at a
critical point.
remi__
2007-05-31 12:09:14 UTC
Permalink
I get that:

java.lang.NullPointerException
at
gnu.mail.providers.imap.IMAPMultipartDataSource.<init>(IMAPMultipartDataSource.java:60)
at gnu.mail.providers.imap.IMAPMessage.getDataHandler(IMAPMessage.java:619)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1618)
at gnu.mail.providers.imap.IMAPMessage.writeTo(IMAPMessage.java:859)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1553)
at gnu.mail.providers.imap.IMAPMessage.writeTo(IMAPMessage.java:845)
at gnu.mail.providers.imap.IMAPFolder.appendMessages(IMAPFolder.java:712)
at javax.mail.Folder.copyMessages(Folder.java:669)
at TestDeplacementMailGNU112.moveMail(TestDeplacementMailGNU112.java:63)
at TestDeplacementMailGNU112.test(TestDeplacementMailGNU112.java:47)
at TestDeplacementMailGNU112.main(TestDeplacementMailGNU112.java:31)

copyMessage calls appendsMessage but some Folder opening and closing actions
are done too before and after the call ...
Post by Chris Burdess
Post by remi__
I am writing some code to move a mail from a folder to another. The idea is
to copy it to another folder and then delete the orignal.
private void moveMail(Message message){
try {
Folder dossierSrc = message.getFolder();
Store store = dossierSrc.getStore();
Folder dossierDest = store.getFolder("processedMails");
if (dossierDest != null && dossierDest.exists()) {
dossierSrc.copyMessages(new Message[]{message}, dossierDest);
message.setFlag(Flags.Flag.DELETED,true);
}
} catch (MessagingException e) {
e.printStackTrace();
}
}
java.lang.NullPointerException
at
gnu.mail.providers.imap.IMAPMultipartDataSource.getInputStream
(IMAPMultipartDataSource.java:102)
at javax.activation.DataHandler.writeTo(DataHandler.java:215)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1618)
at gnu.mail.providers.imap.IMAPMessage.writeTo(IMAPMessage.java:859)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1553)
at gnu.mail.providers.imap.IMAPMessage.writeTo(IMAPMessage.java:845)
at gnu.mail.providers.imap.IMAPFolder.appendMessages
(IMAPFolder.java:712)
at javax.mail.Folder.copyMessages(Folder.java:669)
at TestDeplacementMailGNU112.moveMail
(TestDeplacementMailGNU112.java:63)
at TestDeplacementMailGNU112.test(TestDeplacementMailGNU112.java:47)
at TestDeplacementMailGNU112.main(TestDeplacementMailGNU112.java:31)
private void moveMail(Message message){
try {
Folder dossierSrc = message.getFolder();
Store store = dossierSrc.getStore();
Folder dossierDest = store.getFolder("processedMails");
if (dossierDest != null && dossierDest.exists()) {
dossierDest.appendMessages(new Message[]{message});
message.setFlag(Flags.Flag.DELETED,true);
}
} catch (MessagingException e) {
e.printStackTrace();
}
}
That sounds very strange, because copyMessages simply calls
appendMessages internally.
Could you try with CVS HEAD? I've added a null pointer check at a
critical point.
_______________________________________________
Classpathx-javamail mailing list
http://lists.gnu.org/mailman/listinfo/classpathx-javamail
--
View this message in context: http://www.nabble.com/Folder.copyMessages-tf3845701.html#a10892607
Sent from the classpathx-javamail mailing list archive at Nabble.com.
Chris Burdess
2007-05-31 12:37:45 UTC
Permalink
Post by remi__
java.lang.NullPointerException
at
gnu.mail.providers.imap.IMAPMultipartDataSource.<init>
(IMAPMultipartDataSource.java:60)
at gnu.mail.providers.imap.IMAPMessage.getDataHandler
(IMAPMessage.java:619)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1618)
at gnu.mail.providers.imap.IMAPMessage.writeTo(IMAPMessage.java:859)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1553)
at gnu.mail.providers.imap.IMAPMessage.writeTo(IMAPMessage.java:845)
at gnu.mail.providers.imap.IMAPFolder.appendMessages
(IMAPFolder.java:712)
at javax.mail.Folder.copyMessages(Folder.java:669)
at TestDeplacementMailGNU112.moveMail
(TestDeplacementMailGNU112.java:63)
at TestDeplacementMailGNU112.test(TestDeplacementMailGNU112.java:47)
at TestDeplacementMailGNU112.main(TestDeplacementMailGNU112.java:31)
copyMessage calls appendsMessage but some Folder opening and
closing actions
are done too before and after the call ...
OK, I can see some problems with that that we should be able to work
around. What about now with CVS HEAD?
remi__
2007-05-31 13:03:42 UTC
Permalink
OK, so now I have that one :

java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
at java.util.ArrayList.RangeCheck(ArrayList.java:507)
at java.util.ArrayList.get(ArrayList.java:324)
at gnu.mail.providers.imap.IMAPMessage.update(IMAPMessage.java:247)
at gnu.mail.providers.imap.IMAPFolder.fetch(IMAPFolder.java:843)
at gnu.mail.providers.imap.IMAPFolder.copyMessages(IMAPFolder.java:698)
at TestDeplacementMailGNU112.moveMail(TestDeplacementMailGNU112.java:63)
at TestDeplacementMailGNU112.test(TestDeplacementMailGNU112.java:47)
at TestDeplacementMailGNU112.main(TestDeplacementMailGNU112.java:31)

Thanks

Rémi
Post by Chris Burdess
Post by remi__
java.lang.NullPointerException
at
gnu.mail.providers.imap.IMAPMultipartDataSource.<init>
(IMAPMultipartDataSource.java:60)
at gnu.mail.providers.imap.IMAPMessage.getDataHandler
(IMAPMessage.java:619)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1618)
at gnu.mail.providers.imap.IMAPMessage.writeTo(IMAPMessage.java:859)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1553)
at gnu.mail.providers.imap.IMAPMessage.writeTo(IMAPMessage.java:845)
at gnu.mail.providers.imap.IMAPFolder.appendMessages
(IMAPFolder.java:712)
at javax.mail.Folder.copyMessages(Folder.java:669)
at TestDeplacementMailGNU112.moveMail
(TestDeplacementMailGNU112.java:63)
at TestDeplacementMailGNU112.test(TestDeplacementMailGNU112.java:47)
at TestDeplacementMailGNU112.main(TestDeplacementMailGNU112.java:31)
copyMessage calls appendsMessage but some Folder opening and
closing actions
are done too before and after the call ...
OK, I can see some problems with that that we should be able to work
around. What about now with CVS HEAD?
_______________________________________________
Classpathx-javamail mailing list
http://lists.gnu.org/mailman/listinfo/classpathx-javamail
--
View this message in context: http://www.nabble.com/Folder.copyMessages-tf3845701.html#a10893519
Sent from the classpathx-javamail mailing list archive at Nabble.com.
Chris Burdess
2007-05-31 13:12:59 UTC
Permalink
Post by remi__
java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
at java.util.ArrayList.RangeCheck(ArrayList.java:507)
at java.util.ArrayList.get(ArrayList.java:324)
at gnu.mail.providers.imap.IMAPMessage.update(IMAPMessage.java:247)
at gnu.mail.providers.imap.IMAPFolder.fetch(IMAPFolder.java:843)
698)
at TestDeplacementMailGNU112.moveMail
(TestDeplacementMailGNU112.java:63)
at TestDeplacementMailGNU112.test(TestDeplacementMailGNU112.java:47)
at TestDeplacementMailGNU112.main(TestDeplacementMailGNU112.java:31)
Could you provide a TCP dump using something like tcpflow? Obviously
strip out any authentication details etc. The status code should
never be odd-sized.
remi__
2007-05-31 14:59:05 UTC
Permalink
I enclose a file with the captured segments.

http://www.nabble.com/file/p10895633/imap.txt imap.txt

The length is 3 for that list:
[INTERNALDATE, 31-May-2007 16:57:48 +0200, BODY[HEADER.FIELDS[BODYSTRUCTURE,
RFC822]]]

Thanks

Rémi
imap.txt s-2">
Post by remi__
java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
at java.util.ArrayList.RangeCheck(ArrayList.java:507)
at java.util.ArrayList.get(ArrayList.java:324)
at gnu.mail.providers.imap.IMAPMessage.update(IMAPMessage.java:247)
at gnu.mail.providers.imap.IMAPFolder.fetch(IMAPFolder.java:843)
698)
at TestDeplacementMailGNU112.moveMail
(TestDeplacementMailGNU112.java:63)
at TestDeplacementMailGNU112.test(TestDeplacementMailGNU112.java:47)
at TestDeplacementMailGNU112.main(TestDeplacementMailGNU112.java:31)
Could you provide a TCP dump using something like tcpflow? Obviously
strip out any authentication details etc. The status code should
never be odd-sized.
_______________________________________________
Classpathx-javamail mailing list
http://lists.gnu.org/mailman/listinfo/classpathx-javamail
--
View this message in context: http://www.nabble.com/Folder.copyMessages-tf3845701.html#a10895633
Sent from the classpathx-javamail mailing list archive at Nabble.com.
remi__
2007-05-31 15:29:18 UTC
Permalink
It works with that implementation in IMAPFolder:

public void copyMessages(Message[] msgs, Folder folder)
throws MessagingException
{
if (!folder.exists())
{
throw new FolderNotFoundException("Folder does not exist", folder);
}
if (folder instanceof IMAPFolder &&
((IMAPFolder) folder).store.equals(store))
{
folder.appendMessages(msgs);
}
else
{
super.copyMessages(msgs, folder);
}
}

No fetch ...

Rémi
Post by Chris Burdess
Post by remi__
java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
at java.util.ArrayList.RangeCheck(ArrayList.java:507)
at java.util.ArrayList.get(ArrayList.java:324)
at gnu.mail.providers.imap.IMAPMessage.update(IMAPMessage.java:247)
at gnu.mail.providers.imap.IMAPFolder.fetch(IMAPFolder.java:843)
698)
at TestDeplacementMailGNU112.moveMail
(TestDeplacementMailGNU112.java:63)
at TestDeplacementMailGNU112.test(TestDeplacementMailGNU112.java:47)
at TestDeplacementMailGNU112.main(TestDeplacementMailGNU112.java:31)
Could you provide a TCP dump using something like tcpflow? Obviously
strip out any authentication details etc. The status code should
never be odd-sized.
_______________________________________________
Classpathx-javamail mailing list
http://lists.gnu.org/mailman/listinfo/classpathx-javamail
--
View this message in context: http://www.nabble.com/Folder.copyMessages-tf3845701.html#a10896245
Sent from the classpathx-javamail mailing list archive at Nabble.com.
Chris Burdess
2007-05-31 15:44:45 UTC
Permalink
Post by remi__
public void copyMessages(Message[] msgs, Folder folder)
throws MessagingException
{
if (!folder.exists())
{
throw new FolderNotFoundException("Folder does not exist", folder);
}
if (folder instanceof IMAPFolder &&
((IMAPFolder) folder).store.equals(store))
{
folder.appendMessages(msgs);
}
else
{
super.copyMessages(msgs, folder);
}
}
No fetch ...
Yep, I already updated with a version that doesn't do the RFC822
fetch. I was just interested in trying to find out why that fetch
didn't succeed, it's a different problem.

Loading...