在Linux系统上需要从postfix邮件服务器检测某个账号的未读邮件。
在网上找了一下,用libmail库可以实现该需求: http://www.srcer.com/?p=624 这篇文章里使用pop3协议。
我这边的情况是postfix使用TLS协议,对上文稍作修改实现IMAP使用TLS协议连接postfix邮件服务器,检测未读邮件。
libmail的imap4.c中相关断言如:assert(n_print >= LIBMAIL_BUFSIZE+1 || n_print < 0); 注释掉再编译,否则会终止程序运行。
接下来安装libmail库: ./configure --enable-tls (打开tls) ,然后make && make install
头文件目录:/usr/local/include/libmail
库目录: /usr/local/lib
libmail_intl.h头文件需要从源码目录里拷贝到头文件目录
config.h 拷贝到/usr/local/include里
设置环境:
vim ~/.bashrc
添加:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
修改完后,记得关掉当前终端并重新打开一个新的终端,从而使上面的配置生效。
linux系统里需要添加下库文件路径:
vim /etc/ld.so.conf
添加: include /usr/local/lib
sudo ldconfig
编译 gcc imap.c -lmail
//imap.c
#include <libmail/libmail.h>
#include <libmail/imap4.h>
#include <libmail/error.h>
#include <libmail/libmail_intl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
imap4_mailbox_t *imapbox = NULL;
int ret = -1;
int newmsg = -1;
int oldmsg = -1;
libmail_init();
imapbox = ( imap4_mailbox_t *)malloc( sizeof(imap4_mailbox_t) );
libmail_init_imap4_mailbox(imapbox);
set_imap4_hostname(imapbox, "XXXXXX"); //连接到的邮件服务器
set_imap4_username(imapbox, "XXXXXX"); //账号
set_imap4_password(imapbox, "XXXXXX"); //密码
set_imap4_mailbox(imapbox, "inbox");
set_imap4_security_level(imapbox ,LIBMAIL_USE_SECURE);
if( (ret=imap4_connect(imapbox)) != LIBMAIL_SUCCESS )
{
fprintf( stderr, "imap Connect Error: %s !\n", libmail_strerror(ret) );
free(imapbox);
return 0;
}
printf( "connect XXXXXX success!\n" );
printf( "imap4_authenticate...\n" );
if( (ret=imap4_authenticate(imapbox)) != LIBMAIL_SUCCESS )
{
fprintf( stderr, "imap4_authenticate Error: %s !\n", libmail_strerror(ret) );
free(imapbox);
return 0;
}
if( (ret=imap4_check(imapbox, &newmsg, &oldmsg)) != LIBMAIL_SUCCESS ) //newmsg就是未读邮件数量
{
fprintf( stderr, "imap4_check failed: %s\n", libmail_strerror(ret) );
free(imapbox);
return 0;
}
printf( "imap4_check success new:%d old:%d\n", newmsg, oldmsg );
if( (ret=imap4_disconnect(imapbox)) != LIBMAIL_SUCCESS )
{
fprintf( stderr, "imap Connect Error: %s !\n", libmail_strerror(ret) );
free(imapbox);
return -1;
}
printf( "disconnect XXXXXX success!\n" );
free(imapbox);
return 0;
}