rc1
rc1

Reputation: 483

No way to search Yahoo Mail programmatically with Java?

I have been working on a Java app that connects to Yahoo mail to enable a user to search through their Yahoo email.

Recently, Yahoo suddenly (with only 5 weeks notice) discontinued Yahoo Mail API, which we were using and worked great. Then we re-engineered and switched to YQL. Unfortunately, for unknown reasons, this too has stopped working as of this week. The endpoint keeps returning an error. Even when YQL did work, it was occasional and sporadic. Even the Yahoo YQL console is returning errors. We have tried using JavaMAIL IMAP access to search for messages. We can connect to the IMAP server, but the JavaMAIL Search terms are not supported. I keep getting the error "SEARCH Server error - Please try again later". The same code works just fine for other IMAP services (like Aol mail).

So basically, with Yahoo Mail API gone, YQL not working, and IMAP not supporting searching, there is no programmatic way of searching Yahoo mail right now? Yahoo keeps telling us that the Yahoo API for IMAP access is the way ahead (see here https://developer.yahoo.com/mail/). But this is not live yet and there is no functioning documentation. Sending an email to [email protected] was useless as no one responds to that anyway. They should learn a thing or two from Facebook on how to manage changes and maintain developer relations.

Does anyone have an alternative means to programatically search Yahoo Mail for emails with Java?

Thanks.

Upvotes: 3

Views: 1918

Answers (1)

skunkwerk
skunkwerk

Reputation: 3060

I managed to get IMAP access working with Yahoo through OAuth 2.0, but this code is in Python:

  1. Follow the directions here to refresh the user's token: https://developer.yahoo.com/oauth2/guide/index.html#refresh-token-label (you can use the refresh_token that you received using OAuth 1.0)
  2. Replace the email_address and access_token in the following code:

import logging
import imaplib
import datetime
import quopri
import hashlib

endpoint = 'imap.mail.yahoo.com'
email_address = '[email protected]'
access_token = 'REPLACE_THIS'
auth_string = 'user=%s\1auth=Bearer %s\1\1' % (email_address, access_token)
imap_conn = imaplib.IMAP4_SSL(endpoint) # the IMAP server we're connecting to
imap_conn.debug = 3 # for logging purposes
imap_conn.authenticate('XOAUTH2', lambda x: auth_string)
folders = imap_conn.list()
print folders
imap_conn.select('Inbox', readonly=True)

result, data = imap_conn.uid('search', None, '(FROM "Amazon.com")')
messages = data[0].split()
print 'messages:' + str(messages)

uids_to_fetch = ','.join(messages)
result, data = imap_conn.uid('fetch', uids_to_fetch, 'RFC822')

for counter, message in enumerate(data[::2]):# every other item in the list is not a message, but ")" so we skip it
    # yield raw mail body, after decoding the quoted-printable encoding
    print quopri.decodestring(message[1])

Upvotes: 1

Related Questions