Instead of reinventing RFC2822 parsing, I'm trying to use the Sun mail
libraries.
http://java.sun.com/products/javamail/javadocs/javax/mail/package-summary.html
Here's the code I'm roughly trying to translate into Clojure:
package examples;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
import org.apache.log4j.*;
public class simpleread {
private static Logger log = Logger.getLogger(simpleread.class);
public static void main(String args[])
throws Exception
{
//set up the Logger
BasicConfigurator.configure();
Session session = Session.getInstance(new Properties());
//url examples
String user = "zhukov"; //well this is my home :) you should enter
your name here
String absolute_url = "maildir:/home/"+user+"/Maildir";
String absolute_url2 = "maildir:////home/"+user+"/Maildir";
String relative_url = "maildir:///testhome/Maildir";
String url = absolute_url;
Store store = session.getStore(new URLName(url));
store.connect(); //useless with Maildir but included here for consistency
Folder inbox = store.getFolder("inbox");
inbox.open(Folder.READ_WRITE);
Message m = inbox.getMessage(1);
m.writeTo(System.out);
System.out.println("subject of this message: " + m.getSubject());
m.writeTo(System.out);
}
}
I don't need any of the logging stuff, of course. All I want is to get
the store, folder and messages.
Here's what I have thusfar:
(def session (javax.mail.Session/getInstance(java.util.Properties.)))
(. session getStore (javax.mail.URLName. "maildir:///home/serge/tmp/2008-09"))
And the error I get:
javax.mail.NoSuchProviderException: No provider for maildir (NO_SOURCE_FILE:0)
Anyone have any ideas about this?
- Serge
I think I see my problem. I was using the example from:
http://javamaildir.sourceforge.net/
> So you'll need to get a jar
> file containing the maildir implementation, include that jar file in
> your classpath, and also, I think, register that implementation in
> a .properties file.
How does one register the implementation?
> According to a blog entry at http://www.raditha.com/blog/archives/000348.html
> , the properties file is called javamail.providers, and it needs to be
> in the jre/lib subdirectory of your Java home directory.
Of my actual Java? I can't have it in my home dir?
- Serge
I'm kind of stabbing in the dark here, as I don't really know this stuff
either, but I'll give it a try...
Serge Wroclawski wrote:
> On Sun, May 24, 2009 at 12:30 PM, Keith Bennett <keithr...@gmail.com> wrote:
>
>> Serge -
>>
>> I looked at this problem some and have some rough ideas that will not
>> solve the problem but may possibly help point you in the right
>> direction if you haven't already been there.
>>
>> It looks like Sun's mail jar file is not sufficient -- you need an
>> implementation of the maildir protocol.
>>
>
> I think I see my problem. I was using the example from:
>
> http://javamaildir.sourceforge.net/
>
>
>> So you'll need to get a jar
>> file containing the maildir implementation, include that jar file in
>> your classpath, and also, I think, register that implementation in
>> a .properties file.
>>
>
> How does one register the implementation?
>
>
Not sure, but I think it needs to be in that javamail.providers file. I
downloaded and reviewed the Java Mail source code, and it looks like the
provider information is indeed read from a resource at runtime, but I
couldn't figure out much more than that. (If anyone's interested, check
out the constructor for the Session class; it calls loadProviders().) I
can't tell where the stream is getting its data from; maybe the Session
class is in some kind of context that takes care of that. In any case,
the javamail.providers file might be a good place to start.
OTOH, if you would be willing to test with POP or IMAP instead of
maildir, then I think you could bypass all of this configuration stuff,
because those are provided by Sun out of the box.
>> According to a blog entry at http://www.raditha.com/blog/archives/000348.html
>> , the properties file is called javamail.providers, and it needs to be
>> in the jre/lib subdirectory of your Java home directory.
>>
>
> Of my actual Java? I can't have it in my home dir?
>
Yes, the jre/lib subdirectory of the root of your Java software
installation.
From the point of view of Java, very little is configured in the home
directory. The only thing I know of that's there is the user
preferences, which is in the hidden ".java" subdirectory of home.
When the Java runtime needs to find something, it's almost always the
classpath that matters. So if it can go anywhere other than jre/lib, it
would probably have to be somewhere in your classpath. I'd suggest
trying jre/lib first, and if you can get that to work, then possibly
moving it somewhere else if you want. (You could always keep a
"personal" copy of the JDK in a subdirectory of your home directory if
you don't want to much with a system-ish installation. I realize that's
a hack, though.)
- Keith
> - Serge
>
Thanks for the help... *grumble grumble Java*
- Serge
I just posted a message to Novajug about it at:
http://tech.groups.yahoo.com/group/novajug/message/13272
Maybe if they give you a helpful answer you won't have to abandon it...
- Keith
---
Keith R. Bennett
Well, it was only interesting as a component. I agreed to the ical
component too, and ical4j is failing to build (I think I know why
though, and I need to work through it).
I'm trying to stay focused on fixing the problems, but I guess I'm
just a bit shocked at the difficulty thusfar in getting everything to
work. I realize how spoiled I am with {Perl|Python|Ruby}.
I'll keep at it though.
- Serge
I don't know if you've seen it yet, but there was a suggestion on
novajug to use courier-imap as an IMAP server to wrap around maildir
directories:
http://tech.groups.yahoo.com/group/novajug/message/13273
I can understand why you'd want to access the maildir's directly, but
there would be advantages to using courier-imap; mainly that you could
avoid all this maildir support hell in your Java code since IMAP is
supported out of the box, but also that the IMAP support in javax.mail
is likely to be more tested and reliable than a third party maildir
product (again, probably but not definitely).
Do Perl, Python, and Ruby all have reliable and easy-to-use maildir
implementations?
- Keith
The point of this excercise was to be able to use email from the pipes
project. I was just trying to get myself up to the point of processing
a single mail. Setting up an imap server just for that is too much for
me.
> Do Perl, Python, and Ruby all have reliable and easy-to-use maildir
> implementations?
With the above three, I can just get whatever software I need. Perl
has CPAN. Ruby has Gems, Python eggs exist, but even without them, in
any of the languages, I dunno, stuff just "works". I can usually just
use apt-get or yum.
- Serge
On May 25, 2009, at 2:43 PM, Serge Wroclawski wrote:
>
> On Mon, May 25, 2009 at 2:13 PM, Keith Bennett <keithr...@gmail.com
> > wrote:
>>
>> Serge -
>>
>> I don't know if you've seen it yet, but there was a suggestion on
>> novajug to use courier-imap as an IMAP server to wrap around maildir
>> directories:
>
> The point of this excercise was to be able to use email from the pipes
> project. I was just trying to get myself up to the point of processing
> a single mail. Setting up an imap server just for that is too much for
> me.
>
I understand. Another approach would be to start a (disposable)
Google Mail account, enable IMAP in the preferences, and then use
that. But I understand that you have had your fill of this...
>> Do Perl, Python, and Ruby all have reliable and easy-to-use maildir
>> implementations?
>
> With the above three, I can just get whatever software I need. Perl
> has CPAN. Ruby has Gems, Python eggs exist, but even without them, in
> any of the languages, I dunno, stuff just "works". I can usually just
> use apt-get or yum.
>
You probably have a lot more experience with those languages than I
do, but I got burned recently by assuming that. I had to do some SOAP
work and used the only (to my knowledge) usable library for it in Ruby
-- SOAP4R. It was quite disappointing...no disrespect meant to the
authors, who contributed their time generously. If I had to do it
again, I'd look into using JRuby and a Java SOAP library. That's not
to say that Ruby has other libraries that are better than Java's; I
guess all languages and environments have areas in which they are
strong and others in which they are not.
- Keith