Hi!,

您好吗?

I found Milan reply interesting but did not really hack on this,
您见不见了?

Cheers
Pierre-Yves 

Milan Crha <mc...@redhat.com> writes:

> On Tue, 2014-08-19 at 16:34 +0800, Chunyang Xu wrote:
>> Hi all!
>> 
>> I want to adding email as storage supporting for a GNOME app, named
>> "bijiben". With this feature users can read & save notes to their
>> email box (a folder like "Notes"). But I do not how to use the Camel
>> library to access email folders. I have two question:
>> 
>> 1. How to authenticate user with gnome-online-accounts? I can get 
>> user
>> name, IMAP server address etc via gnome-online-accounts.
>> 
>> 2. How to operate email like files and folders, i.e, how to download 
>> /
>> update / upload files between email service and local? Is it possible
>> to sync a local folder to a email folder like "INBOX"?
>> 
>
>
>
>         Hi,
> the evolution-data-server (its evolution-source-registry D-Bus 
> service) provides a list of configured sources, which can be 
> calendars, address books, mail accounts and so on. Many things are 
> referenced by source (ESource) uids (e_source_get_uid()) in the code. 
> More about ESource-s can be found here [1][2].
>
> These are used also by Camel [3][4]. Even the Wiki pages are a little 
> bit outdated, the principle is still the same. You should provide your 
> own descendant of CamelSession, which holds list of configured mail 
> accounts (added by camel_session_add_service(), got by 
> camel_session_ref_service()). The service can be either CamelStore or 
> CamelTransport descendant. The CamelStore provides you with a list of 
> CamelFolder-s and so on. The CamelService lets you connect to the 
> server.
>
> I guess the simplest way is to borrow Evolution's implementation of 
> CamelSession, the EMailSession [5], and build on top of it - at least 
> as a starter. If your mail account is configured through GOA and you 
> have evolution-data-server compiled with GOA module, then the account 
> will be automatically available for you. Getting the account's ESource 
> (and its uid) is a little bit tricky. You should let the users pick 
> which account to use, rather than guess which of the 5 different GOA 
> configured mail accounts to use. Supposing you know the uid of the 
> chosen mail account you can do something like this:
>
>    #include <libemail-engine/libemail-engine.h>
>
>    ...
>
>   EMailSession *session;
>    ESourceRegistry *registry;
>    CamelService *service;
>    CamelStore *store;
>    CamelFolder *folder;
>    GError *error = NULL;
>
>    registry = e_source_registry_new_sync (cancellable, &error);
>    if (!registry) {
>       // do something with 'error' and free it
>       return;
>    }
>
>    session = e_mail_session_new (registry);
>    g_object_unref (registry);
>
>    service = camel_session_ref_service (CAMEL_SESSION (session), uid);
>    if (!service) {
>       g_warning ("Cannot open service '%s'", uid);
>       g_object_unref (session);
>       return;
>    }
>
>    if (!CAMEL_IS_STORE (service)) {
>       g_warning ("Cannot open service '%s'", uid);
>       g_object_unref (service);
>       g_object_unref (session);
>       return;
>    }
>
>    store = CAMEL_STORE (service);
>
>    if (!camel_service_connect_sync (service, cancellable, &error)) {
>       // do something with 'error' and free it
>       g_object_unref (service);
>       g_object_unref (session);
>       return;
>    }
>
>    folder = camel_store_get_folder_sync (store, "INBOX/sub-folder", 0, 
> cancellable, &error);
>    // alternatively for Inbox itself:
>    // folder = camel_store_get_inbox_folder_sync (store, cancellable, &error);
>
>    if (!folder) {
>       // do something with 'error' and free it
>       g_object_unref (service);
>       g_object_unref (session);
>       return;
>    }
>
>    // to get up-to-date folder content
>    if (!camel_folder_synchronize_sync (folder, 0, cancellable, &error) ||
>        !camel_folder_refresh_info_sync (folder, cancellable, &error)) {
>       // do something with 'error' and free it
>       g_object_unref (service);
>       g_object_unref (session);
>       return;
>    }
>
>    // do something with the 'folder' [6]
>
>    g_object_unref (service);
>    g_object_unref (session);
>
> Note I used "sync" versions of the functions only for its simplicity, 
> you might run the code in a dedicated thread or use "async" functions, 
> to not get your UI/main thread blocked by a remote call. Also note 
> that connecting to the service each time you want to manipulate folder 
> content is not efficient, the network I/O or large folder update can 
> take significant amount of time.
>
>         Hope it helps,
>         Milan
>
> [1] https://wiki.gnome.org/Apps/Evolution/ESourceFileFormat
> [2] https://wiki.gnome.org/Apps/Evolution/ESourceMigrationGuide
> [3] http://developer.gnome.org/camel/unstable
> [4] https://wiki.gnome.org/Apps/Evolution/Camel
> [5] 
> https://git.gnome.org/browse/evolution/tree/libemail-engine/e-mail-session.h
> [6] https://developer.gnome.org/camel/unstable/CamelFolder.html
>
>
> _______________________________________________
> evolution-hackers mailing list
> evolution-hackers@gnome.org
> To change your list options or unsubscribe, visit ...
> https://mail.gnome.org/mailman/listinfo/evolution-hackers

_______________________________________________
evolution-hackers mailing list
evolution-hackers@gnome.org
To change your list options or unsubscribe, visit ...
https://mail.gnome.org/mailman/listinfo/evolution-hackers

Reply via email to