Расскажите о протоколе POP3. В чем его ключевые отличия от IMAP и как с ним работать в Go?

Ответ

POP3 (Post Office Protocol version 3) — это простой протокол прикладного уровня для получения электронной почты с сервера. Его основная идея — «скачать и удалить».

В стандартной библиотеке Go нет встроенного клиента для работы с POP3. Для этого необходимо использовать сторонние библиотеки, например, популярную github.com/emersion/go-pop3.

Ключевые отличия POP3 от IMAP:

ХарактеристикаPOP3IMAP
СостояниеРаботает в "офлайн" режиме. Письма загружаются на клиентское устройство и (обычно) удаляются с сервера.Работает в "онлайн" режиме. Письма остаются на сервере, клиент синхронизирует их состояние.
Доступ с устройствРассчитан на доступ с одного устройства.Идеален для доступа с нескольких устройств (ПК, телефон), так как состояние (прочитано/не прочитано) синхронизируется.
Работа с папкамиНе поддерживает папки на сервере. Есть только "Входящие".Полная поддержка создания, удаления и переименования папок на сервере.
Загрузка писемОбычно загружает письмо целиком (заголовок и тело).Позволяет выборочно загружать части письма, например, только заголовки или текст без вложений.
Порты по умолчанию110 (нешифрованный), 995 (SSL/TLS)143 (нешифрованный), 993 (SSL/TLS)
Сценарий«Проверить почту»: скачать все новое, сохранить локально и очистить ящик на сервере.«Управлять почтой»: работать с письмами на сервере, как с файлами в облаке.

Пример простого клиента на Go с emersion/go-pop3:

package main

import (
    "log"

    "github.com/emersion/go-pop3"
)

func main() {
    // Устанавливаем соединение с сервером (для SSL/TLS используйте pop3.DialTLS)
    client, err := pop3.Dial("mail.example.com:110")
    if err != nil {
        log.Fatal(err)
    }
    defer client.Quit()

    // Аутентификация
    if err := client.Auth("user", "password"); err != nil {
        log.Fatal(err)
    }

    // Получаем количество сообщений и общий размер
    count, size, err := client.Stat()
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("Всего сообщений: %d, общий размер: %d байт", count, size)

    // Можно пройтись по письмам и получить их
    // for i := 1; i <= count; i++ {
    //     msg, err := client.Retr(i)
    //     // ... обработка письма ...
    // }
}

Таким образом, POP3 — более старый и простой протокол, подходящий для простых задач, в то время как IMAP — более гибкий и современный стандарт для управления почтой на сервере.