iOS/Objective-C:连接到POP3的库

4

我希望连接IMAP和POP3服务器,目前我正在使用MailCore进行IMAP连接。不幸的是,我没有找到一个合适的POP3框架。

我尝试使用libetpan:

    mailpop3 * pop3;
    int r;
    pop3 = mailpop3_new(0, NULL);
    r = mailpop3_ssl_connect(pop3, "pop.gmail.com", 995);
    check_error(r, "connect failed");

但我总是遇到连接被拒绝的错误;而且只有C语言,我更喜欢Objective-C。更好的方法是使用一个库,可以同时用于IMAP和POP3。

2个回答

3

我没有使用过OCMail,但这似乎是你要找的。它声称支持“POP3、IMAP4、SMTP、POPS、IMAPS、SMTPS”。

编辑:构建错误
事实证明,解决方案实际上在README文件中。

  1. 从Github下载ZIP后,打开Xcode项目。
  2. 进行性能分析编译(产品菜单 > 编译选项 > 性能分析(Command-Shift-I))。
  3. 打开Xcode首选项并转到“位置”
  4. 在派生数据下,旁边有一个文件路径(例如/Users/YourUserName/Library/Developer/Xcode/DerivedData)。路径旁边会有一个小箭头,单击该箭头即可进入Finder。
  5. 它将带您进入所有Xcode项目的文件夹。找到名称以OCMail开头且后面跟着一堆无意义字符的文件夹。
  6. 在该文件夹中,找到Build > Products > Debug-iphoneos > libOCMail.a。这是您要添加到您的 Xcode项目中的库文件。只需将其拖入Xcode项目中,然后您就可以开始了。

我在构建项目时遇到了一堆错误。它们来自于定义不良的enum类型。这是一个已清理过的文件: http://cl.ly/code/442x2x3X3Y2I
只需下载并替换现有的MimeMessage.m文件,然后再进行构建即可。


但不幸的是,这里提到的问题 https://github.com/miyabichan/OCMail/issues/1 对我来说是一个真正的问题... 无法让它工作 :/ - swalkner
好的,我成功创建了.a文件;但是如果我将它拖到我的测试项目中,我无法导入像#import "MailServer.h"这样的文件 - 出现“文件未找到”的错误。 - swalkner
1
你需要从原始ZIP文件中复制头文件。这并不是什么大问题,因为这些文件只是声明,不会被编译。 - FeifanZ

1

过去我曾经使用libetpan并且可以顺利连接到pop3服务器,所以我检查了一下它是否仍然可用。我使用了这里的代码:https://github.com/dinhviethoa/libetpan/blob/master/tests/pop-sample.c 并将其适配到了iOS。

如果您使用它,您会看到很多警告,并且在获取第一条消息后应用程序会崩溃,但连接是工作的(当然,您需要输入您的电子邮件登录名和密码)。

我并不是说libetpan是一个好的解决方案。当我开发带有邮件支持的应用程序时,我也使用了mailcore来支持IMAP,并最终放弃了POP3支持。但如果您想要备选项,它可能会有用。

static void check_error(int r, char * msg)
{
if (r == MAILPOP3_NO_ERROR)
    return;

fprintf(stderr, "%s\n", msg);
exit(EXIT_FAILURE);
}

-(IBAction)testButtonClick:(id)sender
{
mailpop3 * pop3;
int r;
carray * list;
unsigned int i;

//  if (argc < 3) {
//      fprintf(stderr, "syntax: pop-sample [gmail-email-address] [gmail-     password]\n");
//      exit(EXIT_FAILURE);
//  }


mkdir("download", 0700);

pop3 = mailpop3_new(0, NULL);
r = mailpop3_ssl_connect(pop3, "pop.gmail.com", 995);
check_error(r, "connect failed");

r = mailpop3_user(pop3, @"mail login".cString);
check_error(r, "user failed");

r = mailpop3_pass(pop3, @"mail password".cString);
check_error(r, "pass failed");

r = mailpop3_list(pop3, &list);
check_error(r, "list failed");

NSLog(@"carray_count(list_: %d", carray_count(list));

for(i = 0 ; i < carray_count(list) ; i ++) {
    struct mailpop3_msg_info * info;
    char * msg_content;
    size_t msg_size;
    FILE * f;
    char filename[512];

    struct stat stat_info;

    info = (mailpop3_msg_info *) carray_get(list, i);

    if (info->msg_uidl == NULL) {
        continue;
    }

    snprintf(filename, sizeof(filename), "download/%s.eml", info->msg_uidl);
    r = stat(filename, &stat_info);
    if (r == 0) {
        printf("already fetched %u %s\n", info->msg_index, info->msg_uidl);
        continue;
    }

    if(msg_content != NULL)
    NSLog(@"msg_content: %@", [NSString stringWithUTF8String:msg_content]);
    r = mailpop3_retr(pop3, info->msg_index, &msg_content, &msg_size);
    check_error(r, "get failed");

//      f = fopen(filename, "w");
//      fwrite(msg_content, 1, msg_size, f);
//      fclose(f);
//      mailpop3_retr_free(msg_content);

    if (info->msg_uidl != NULL) {
        printf("fetched %u %s\n", info->msg_index, info->msg_uidl);
    }
    else {
        printf("fetched %u\n", info->msg_index);
    }
}

mailpop3_quit(pop3);
mailpop3_free(pop3);

//  exit(EXIT_SUCCESS);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接