Email über IMAP vom Provider zum lokalen IMAP Server weiterleiten.

PaulAtreides

Well-Known Member
Ich habe bei meinem Provider mehrere IMAP-Konten, die ich auf einen lokalen IMAP-Server umleiten möchte, da der Speicherplatz beim Provider langsam knapp wird. Die Weiterleitung soll über LMTP erfolgen, damit ich Sieve von Dovecot verwenden kann. Das Programm sollte IMAP IDLE unterstützen

Wie würdet ihr das realisieren? Fetchmail, getmail oder noch etwas anderes?
 
Ein gutes, aber (für mich) leider auch recht schwer zu konfigurierendes Tools ist mbsync: https://isync.sourceforge.io/mbsync.html Das kommt aus dem weiteren Linux-Kernelumfeld und wurde entwickelt, um deren Mailwahnsinn zu bändigen. Es ist auch bei extrem großen und tief verschachtelten IMAP-Boxen noch sehr schnell.
 
Ich habe bei meinem Provider mehrere IMAP-Konten, die ich auf einen lokalen IMAP-Server umleiten möchte, da der Speicherplatz beim Provider langsam knapp wird. Die Weiterleitung soll über LMTP erfolgen, damit ich Sieve von Dovecot verwenden kann. Das Programm sollte IMAP IDLE unterstützen

Wie würdet ihr das realisieren? Fetchmail, getmail oder noch etwas anderes?
Hi,
wenn Du mit lokaler IMAP Server, eine Instanz zu Hause meinst, würde ich mit DynDNS, MyFritz o.ä. arbeiten und mir die Ports auf meine lokalen Instanzen weiterleiten lassen. Dann einfach per Sieve von den Quellservern die Mails an die Heimat weiterleiten lassen.
Wobei ich mir gerade nicht sicher bin, ob ich da nicht auf dem Holzweg bin. Bei ner Weiterleitung gibt man ja ne Ziel-Emailadresse und keinen Server an…
 
Der weg über LMTP wäre allerdings besser, weil ich die Nachrichten dann gleich noch durch Spam, Virus und Attachment Filter schicken könnte.
 
Meine Erfahrungen mit IMAP Konten von ca. 30GB sind da nicht sonderlich berauschend, was Umzüge angeht.

Habe ich dreimal gemacht und am Ende einfach sylpheed genommen, weil alle anderen Mail Programme die Grätsche machten und auch Kopierprogrammme nicht zuverlässig waren. Sei es nun die Größe oder das Timing gewesen.

Alten Server und neuen eingebunden und dann die Mails einfach dahin kopiert, wo ich sie haben wollte.
 
Meine Erfahrungen mit IMAP Konten von ca. 30GB sind da nicht sonderlich berauschend, was Umzüge angeht.

Habe ich dreimal gemacht und am Ende einfach sylpheed genommen, weil alle anderen Mail Programme die Grätsche machten und auch Kopierprogrammme nicht zuverlässig waren. Sei es nun die Größe oder das Timing gewesen.

Alten Server und neuen eingebunden und dann die Mails einfach dahin kopiert, wo ich sie haben wollte.
Ich glaube der OP will nicht umziehen, sondern regelmäßig Mails von einem IMAP Frisch holen und dann per smtp local weiter verarbeiten ... also noch schlimmer quasi
 
Hier ist mein Ruby Script zum abrufen und weiterleiten der Emails vom ISP zum lokalen SMTP Server.


Ruby:
require 'net/imap'
require 'mail'
require 'time'
require 'date'
require 'iniparse'
require 'logger'

Mail.defaults do
  delivery_method :smtp, {
    address: "imap.localhost",
    domain: "imap.localhost",
    port: 25 }
end

class Imapforwarder

  def initialize(server, username, password, log_filename)

    @server = server
    @username = username
    @password = password
    @folder = "INBOX"
    @keep_days = 30

    @logger = Logger.new(log_filename)
    @logger.formatter = proc do |severity, datetime, progname, msg|
      "#{datetime}: #{msg}\n"
    end

    @imap = connect()
    fetch_mails(['UNSEEN'])

  end

  def idle_loop()

    loop do
      begin

        @imap.select(@folder)
        @imap.idle do |resp|

          if resp.kind_of?(Net::IMAP::UntaggedResponse) and resp.name == "EXISTS" then
            @imap.idle_done
          end

        end

        fetch_mails(['UNSEEN'])

        delete_date = (Date.today() - @keep_days).strftime("%d-%b-%Y")
        delete_oldmails(["BEFORE", delete_date])

      rescue SignalException => e
        @logger.error("#{e.class}. #{e.message}")

        @imap.idle_done
        @imap.logout unless @imap.disconnected?
        @imap.disconnect
        exit(0)

      rescue Net::IMAP::Error => e
        @logger.error("Net::IMAP::Error #{e.class}. #{e.message}")
        @imap = connect(@server, @username, @password)
        @logger.error("reconnected to server: #{server}")

      rescue Exception => e

        @logger.error("Something went wrong #{e.class}. #{e.message}")
        @imap = connect(@server, @username, @password)
        @logger.error("reconnected to server: #{server}")

      end

    end

  end

  def connect()

    @logger.debug("Connecting to server " + @server)
    imap = Net::IMAP.new(@server)

    unless imap.capability.include? "IDLE"
      @logger.error("'IDLE' IMAP capability not available in server: #{server}")
      imap.disconnect()
    end

    @logger.debug("Login " + @username)
    imap.authenticate('PLAIN', @username, @password)

    return imap

  end

  def fetch_mails(search_filter)

    @imap.select(@folder)
    message_ids = @imap.search(search_filter)

    if not message_ids.empty? then

      @logger.debug("Fetching " + message_ids.count.to_s + " mails")
      message_ids.each do |message_id|

        msg = @imap.fetch(message_id,'RFC822')[0].attr['RFC822']
        mail = Mail.read_from_string msg

        @logger.info(mail.from[0] + " - " + mail.subject)
        @imap.store(message_id, "+FLAGS", [:Seen])

        mail.deliver

      end

    end

  end

  def delete_oldmails(search_filter)

    @imap.select(@folder)
    message_ids = @imap.search(search_filter)

    if not message_ids.empty? then

      @logger.debug("Deleting " + message_ids.count.to_s + " mails")
      message_ids.each do |message_id|
        @imap.store(message_id, "+FLAGS", [:Deleted])
      end

      @imap.expunge()
    end

  end

  def disconnect()
    imap.disconnect()
  end

end


config_file = File.read('config.ini')
config = IniParse.parse(config_file)

config.each do |section|

  log_filename = section.key + ".log"
  username =  section['username']
  password = section['password']
  server = section['server']

  Thread.new(log_filename, username, password, server) {
    imapforwarder = Imapforwarder.new(server, username, password, log_filename)
    imapforwarder.idle_loop()
  }

end

sleep

config.ini
Code:
[email]
username = username
password = password
server = server
 
Hast Du dir mal fdm angeschaut. Das ist ein sehr interessantes und maechtiges Tool von einem OpenBSD-Entwickler, der auch fuer tmux verantwortlich ist. Damit kann man sogar mail ueber ssh fetchen und sehr feingranulare Regeln definieren. Ob es allerdings Emails fuer deinen speziellen Einsatzweck das richtige Werkzeug ist, kann ich nicht einschaetzen. Wollte es jedefalls als Moeglichkeit erwaehnen.
 
Zurück
Oben