4

我想连接到 IMAP 和 POP3 服务器,对于 IMAP,我目前正在使用 MailCore。不幸的是,我没有找到合适的 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。

4

2 回答 2

3

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

编辑:构建错误
原来,解决方案实际上在自述文件中。

  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 文件。

于 2013-01-09T15:02:02.930 回答
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);
}
于 2013-01-14T11:26:43.343 回答