Sha256: 507cdbd49dfa58362df076dd5bbcf75aa51d63220f5e57a8fe6e9bb6f262cd32

Contents?: true

Size: 1.79 KB

Versions: 1

Compression:

Stored size: 1.79 KB

Contents

require "forwardable"

module Imap::Backup
  module Account; end

  class FolderNotFound < StandardError; end

  class Account::Folder
    extend Forwardable

    REQUESTED_ATTRIBUTES = %w[RFC822 FLAGS INTERNALDATE].freeze

    attr_reader :connection
    attr_reader :name

    delegate imap: :connection

    def initialize(connection, name)
      @connection = connection
      @name = name
      @uid_validity = nil
    end

    # Deprecated: use #name
    def folder
      name
    end

    def exist?
      examine
      true
    rescue FolderNotFound
      false
    end

    def create
      return if exist?

      imap.create(name)
    end

    def uid_validity
      @uid_validity ||=
        begin
          examine
          imap.responses["UIDVALIDITY"][-1]
        end
    end

    def uids
      examine
      imap.uid_search(["ALL"]).sort
    rescue FolderNotFound
      []
    end

    def fetch(uid)
      examine
      fetch_data_items = imap.uid_fetch([uid.to_i], REQUESTED_ATTRIBUTES)
      return nil if fetch_data_items.nil?

      fetch_data_item = fetch_data_items[0]
      attributes = fetch_data_item.attr
      return nil if !attributes.key?("RFC822")

      attributes["RFC822"].force_encoding("utf-8")
      attributes
    rescue FolderNotFound
      nil
    end

    def append(message)
      body = message.imap_body
      date = message.date&.to_time
      response = imap.append(name, body, nil, date)
      extract_uid(response)
    end

    private

    def examine
      imap.examine(name)
    rescue Net::IMAP::NoResponseError
      Imap::Backup.logger.warn "Folder '#{name}' does not exist"
      raise FolderNotFound, "Folder '#{name}' does not exist"
    end

    def extract_uid(response)
      @uid_validity, uid = response.data.code.data.split(" ").map(&:to_i)
      uid
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
imap-backup-2.1.1 lib/imap/backup/account/folder.rb