LINUX.ORG.RU

C++ выбор библиотеки для работы с imap

 , , , ,


0

1

Добрый день. Есть у меня необходимость в написании следующей софтины на c++: программа автозагружается, соединяетсят по imap с ящиком на gmail, висит в фоне. При поступлении входящего письма с определенного адреса, автоматически выводит на передний план окно-уведомление с предложением распечатать вложенный пдф документ.
Делать весь описанный функционал(кроме работы с imap) буду на c++ и Qt. В приципе я знаю как все делать на Qt используя сокеты, но самостоятельно возиться с парсингом и разбором письма, заголовками и кодировками я не хочу. Поэтому решено использовать отдельную библиотеку для imap.
Вопрос: какую бы вы использовали библиотеку c++ или c для работы с imap и почему(предпочтительней конечно библиотеки на c++, но если что могу использовать и C-библиотеку)?

★★★★★

ИМХО, С++ для этой задачи слишком жирно. Можно сделать пару скриптов на баше и получить тот же результат за меньшие время.
А по теме, бери это или cURL.

joy4eg ★★★★★
()
Ответ на: комментарий от joy4eg

Есть вероятность, что на винде тоже будет использоваться, поэтому и выбрал qt, ну и конечно есть доля спортивного интереса в этой затее.

rumgot ★★★★★
() автор топика

Я бы на C# написал. Для C# есть несколько библиотек, например, ImapX.

Deathstalker ★★★★★
()
Ответ на: комментарий от joy4eg

Что-то взоржал с их кода.

// Indicate that we want to use XOAUTH2 SASL mechanism
vmime::security::sasl::SASLMechanismFactory::getInstance()->
    registerMechanism <vmime::security::sasl::XOAuth2SASLMechanism>("XOAUTH2");

// Create a new session
vmime::shared_ptr <vmime::net::session> sess = vmime::net::session::create();

// Use a custom authenticator to force using XOAUTH2 mechanism
vmime::shared_ptr <vmime::security::authenticator> xoauth2Auth =
    vmime::make_shared <vmime::security::sasl::XOAuth2SASLAuthenticator>
        (vmime::security::sasl::XOAuth2SASLAuthenticator::MODE_EXCLUSIVE);

// Create a new SMTPS service to GMail
vmime::shared_ptr <vmime::net::transport> tr = sess->getTransport(
    vmime::utility::url("smtps://smtp.gmail.com:465"), xoauth2Auth
);

mix_mix ★★★★★
()

Хм, а fetchmail+procmail+скрипт_на_баше не прокатит?

DELIRIUM ☆☆☆☆☆
()

Есть LibEtPan. На ней Claws-Mail работает.

gag ★★★★★
()
Ответ на: комментарий от rumgot

Все равно, пожалуй, на Perl/Python будет быстрее. Хотя если из любви так-скать к искусству - то можно и на крестах.

anonymous
()
Ответ на: комментарий от joy4eg

Потыкал сегодня vmime — что-та очен сложная для простой задачи.

BruteForce ★★★
()
Ответ на: комментарий от Chaser_Andrey

По поводу сборки в винде - полностью согласен, сегодня пол дня пытался собрать, пока до завершения не добрался. Завтра продолжу.

rumgot ★★★★★
() автор топика
Ответ на: комментарий от Chaser_Andrey

А в чём там под виндой проблема?

Сейчас попробовал из гита кросскомпилировать с mingw-w64 4.0.5-2 и gcc 5.3.1-8+17 под Debian Testing.

$ git clone https://github.com/kisli/vmime.git vmime.git

Toolchain-mingw.cmake:

# For reference: https://cmake.org/Wiki/CmakeMingw

# the name of the target operating system
set(CMAKE_SYSTEM_NAME Windows)

# which compilers to use for C and C++
SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc)
SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++)
SET(CMAKE_RC_COMPILER i686-w64-mingw32-windres)

# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH /usr/lib/gcc/i686-w64-mingw32/5.3-win32 /abs/path/to/vmime/install)

# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search 
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# TODO for gtk+-3.0 GUI examples
#set(ENV{PKG_CONFIG_LIBDIR} ${CMAKE_FIND_ROOT_PATH}/lib/pkgconfig)
#set(ENV{PKG_CONFIG_PATH} ${CMAKE_FIND_ROOT_PATH}/lib/pkgconfig)

$ mkdir build && cd build
$ cmake \
-DCMAKE_TOOLCHAIN_FILE=../Toolchain-mingw.cmake \
-DCMAKE_INSTALL_PREFIX=/abs/path/to/vmime/install \
-DVMIME_SHARED_PTR_USE_CXX=ON -DVMIME_SHARED_PTR_USE_BOOST=OFF \
-D_RUN_RESULT_VAR=0 \
-DVMIME_HAVE_SASL_SUPPORT=OFF -DVMIME_HAVE_TLS_SUPPORT=OFF \
-DVMIME_BUILD_SAMPLES=OFF \
../vmime.git
$ make -j4

Вот и всё:

$ ls -gG build/bin/libvmime.dll build/lib/libvmime.a build/lib/libvmime.dll.a
-rwxr-xr-x 1 54145453 Oct 17 23:27 build/bin/libvmime.dll
-rw-r--r-- 1 68660076 Oct 17 23:26 build/lib/libvmime.a
-rw-r--r-- 1  2778090 Oct 17 23:27 build/lib/libvmime.dll.a
$ du -sh
356M	.

Глянул на размер - эх, эти плюсы с раздутой отладочной инфой.

gag ★★★★★
()
Ответ на: комментарий от Chaser_Andrey

Серьёзно, собираешься работать с почтой без шифрованного канала?

Нет, конечно. Просто вопрос было о сборке vmime, а не gnutls.

И ещё: используешь icu или iconv?

Аналогично gnutls: ни то, ни то:

CMake Warning at CMakeLists.txt:807 (MESSAGE):
  *** ICU or iconv library should always be preferred over
  MultiByteToWideChar/WideCharToMultiByte on Windows, as error handling is
  very poor, and there is no streaming support.

gag ★★★★★
()
Ответ на: комментарий от Chaser_Andrey

Использую последнюю версию vmime с github.
Разъясни пожалуйста, почему не работает такой код:

int main(int argc, char *argv[])
{
//...
    vmime::shared_ptr<vmime::net::session>
        sess = vmime::make_shared<vmime::net::session>();
//...
}
В книге (https://www.vmime.org/public/documentation/book/vmime-book.pdf) таким образом часто создается указатель на объект сессии. Хотя в примерах так не делают, там все время:
    vmime::shared_ptr <vmime::net::session>
        sess = vmime::net::session::create();
В чем проблема первого кода и почему в книге дается ошибочный код?

rumgot ★★★★★
() автор топика
Ответ на: комментарий от rumgot

Вообще оба способа должны работать. Второй способ - вызов статичного метода, а первый - обертка над std::make_shared или бустовый аналог.

Скинь вывод компилятора с сообщением об ошибке.

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от gag

Так вот собрать вместе со всеми зависимостями, чтобы совпадала версия компилятора, и чтобы не конфликтовали iconv/icu и gnutls/openssl (особенно, когда используешь с Qt) в Windows - нетривиальный квест. Ну, мне, как линуксоиду, так кажется.

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от Chaser_Andrey
In file included from /usr/local/include/vmime/net/service.hpp:36:0,
                 from /usr/local/include/vmime/net/serviceFactory.hpp:42,
                 from /usr/local/include/vmime/vmime.hpp:137,
                 from /media/rumgot/rumgot16gb/vmimeTest/main.cpp:1:
/usr/include/c++/5/ext/new_allocator.h: In instantiation of ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = vmime::net::session; _Args = {}; _Tp = vmime::net::session]’:
/usr/include/c++/5/bits/alloc_traits.h:530:4:   required from ‘static void std::allocator_traits<std::allocator<_CharT> >::construct(std::allocator_traits<std::allocator<_CharT> >::allocator_type&, _Up*, _Args&& ...) [with _Up = vmime::net::session; _Args = {}; _Tp = vmime::net::session; std::allocator_traits<std::allocator<_CharT> >::allocator_type = std::allocator<vmime::net::session>]’
/usr/include/c++/5/bits/shared_ptr_base.h:522:39:   required from ‘std::_Sp_counted_ptr_inplace<_Tp, _Alloc, _Lp>::_Sp_counted_ptr_inplace(_Alloc, _Args&& ...) [with _Args = {}; _Tp = vmime::net::session; _Alloc = std::allocator<vmime::net::session>; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’
/usr/include/c++/5/bits/shared_ptr_base.h:617:4:   required from ‘std::__shared_count<_Lp>::__shared_count(std::_Sp_make_shared_tag, _Tp*, const _Alloc&, _Args&& ...) [with _Tp = vmime::net::session; _Alloc = std::allocator<vmime::net::session>; _Args = {}; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’
/usr/include/c++/5/bits/shared_ptr_base.h:1097:35:   required from ‘std::__shared_ptr<_Tp, _Lp>::__shared_ptr(std::_Sp_make_shared_tag, const _Alloc&, _Args&& ...) [with _Alloc = std::allocator<vmime::net::session>; _Args = {}; _Tp = vmime::net::session; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’
/usr/include/c++/5/bits/shared_ptr.h:319:64:   required from ‘std::shared_ptr<_Tp>::shared_ptr(std::_Sp_make_shared_tag, const _Alloc&, _Args&& ...) [with _Alloc = std::allocator<vmime::net::session>; _Args = {}; _Tp = vmime::net::session]’
/usr/include/c++/5/bits/shared_ptr.h:620:39:   required from ‘std::shared_ptr<_Tp1> std::allocate_shared(const _Alloc&, _Args&& ...) [with _Tp = vmime::net::session; _Alloc = std::allocator<vmime::net::session>; _Args = {}]’
/usr/include/c++/5/bits/shared_ptr.h:635:39:   required from ‘std::shared_ptr<_Tp1> std::make_shared(_Args&& ...) [with _Tp = vmime::net::session; _Args = {}]’
/media/rumgot/rumgot16gb/vmimeTest/main.cpp:7:60:   required from here
/usr/local/include/vmime/net/session.hpp:181:2: error: ‘vmime::net::session::session()’ is private
  session();
  ^
In file included from /usr/include/x86_64-linux-gnu/c++/5/bits/c++allocator.h:33:0,
                 from /usr/include/c++/5/bits/allocator.h:46,
                 from /usr/include/c++/5/string:41,
                 from /usr/local/include/vmime/base.hpp:28,
                 from /usr/local/include/vmime/vmime.hpp:32,
                 from /media/rumgot/rumgot16gb/vmimeTest/main.cpp:1:
/usr/include/c++/5/ext/new_allocator.h:120:4: error: within this context
  { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
    ^
make[2]: *** [CMakeFiles/vmimeTest.dir/main.cpp.o] Ошибка 1
make[1]: *** [CMakeFiles/vmimeTest.dir/all] Ошибка 2
make: *** [all] Ошибка 2

Открываем файл /usr/local/include/vmime/net/session.hpp:181:2 (из вывода данной ошибки):

// ...
private:

    session(); // ЭТО 181 СТРОКА !!!
    session(const propertySet& props);
    
    propertySet m_props;

#if VMIME_HAVE_TLS_SUPPORT
    shared_ptr <tls::TLSProperties> m_tlsProps;
#endif // VMIME_HAVE_TLS_SUPPORT

};
// ...
Я еще конечно достаточно неопытный c++ программист, но тем не менее возникает вопрос: какого черта конструкторы private?
Кстати говоря, следующий простой код также ругается на private конструктор:
//...
int main(int argc, char *argv[])
{
    vmime::net::session sess;
    return 0;
}
Вывод:
In file included from /usr/local/include/vmime/net/service.hpp:36:0,
                 from /usr/local/include/vmime/net/serviceFactory.hpp:42,
                 from /usr/local/include/vmime/vmime.hpp:137,
                 from /media/rumgot/rumgot16gb/vmimeTest/main.cpp:1:
/usr/local/include/vmime/net/session.hpp: In function ‘int main(int, char**)’:
/usr/local/include/vmime/net/session.hpp:181:2: error: ‘vmime::net::session::session()’ is private
  session();
  ^
/media/rumgot/rumgot16gb/vmimeTest/main.cpp:9:25: error: within this context
     vmime::net::session sess;
                         ^
make[2]: *** [CMakeFiles/vmimeTest.dir/main.cpp.o] Ошибка 1
make[1]: *** [CMakeFiles/vmimeTest.dir/all] Ошибка 2
make: *** [all] Ошибка 2

На всякий случай упомяну, что пробовал компилировать gcc-4.8 и gcc-5, если это имеет значение.

rumgot ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Спасибо.
На vmime.org видимо базируется старая версия книги.
Вообще все равно интересно, какая выгода от сделанных преобразований класса vmime::net::session? Растолкуйте пожалуйста, кто опытный(имею ввиду запрет создания указателя через vmime::make_shared).

rumgot ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.