mailr/app/controllers/messages_controller.rb

159 lines
5.4 KiB
Ruby
Raw Normal View History

2011-07-27 20:34:30 +02:00
require 'imap_session'
require 'imap_mailbox'
2011-08-02 23:12:17 +02:00
require 'imap_message'
2011-07-24 22:22:13 +02:00
2011-07-22 22:57:36 +02:00
class MessagesController < ApplicationController
2011-07-23 21:55:26 +02:00
2011-07-27 20:34:30 +02:00
include ImapMailboxModule
include ImapSessionModule
2011-08-02 23:12:17 +02:00
include ImapMessageModule
include MessagesHelper
2011-07-27 20:34:30 +02:00
before_filter :check_current_user ,:selected_folder
2011-08-16 20:05:58 +02:00
before_filter :get_current_folders
2011-07-31 22:45:29 +02:00
2011-08-16 20:05:58 +02:00
before_filter :open_imap_session, :select_imap_folder
after_filter :close_imap_session
2011-07-24 22:22:13 +02:00
2011-07-23 21:55:26 +02:00
theme :theme_resolver
2011-08-02 23:12:17 +02:00
2011-07-23 21:55:26 +02:00
def index
2011-08-02 23:12:17 +02:00
@messages = []
2011-08-16 20:05:58 +02:00
folder_status = @mailbox.status
@current_folder.update_attributes(:total => folder_status['MESSAGES'], :unseen => folder_status['UNSEEN'])
2011-08-02 23:12:17 +02:00
2011-08-16 20:05:58 +02:00
folder_status['MESSAGES'].zero? ? uids_remote = [] : uids_remote = @mailbox.fetch_uids
uids_local = @current_user.messages.where(:folder_id => @current_folder).collect(&:uid)
2011-08-02 23:12:17 +02:00
2011-08-16 20:05:58 +02:00
(uids_local-uids_remote).each do |uid|
@current_folder.messages.find_by_uid(uid).destroy
2011-08-02 23:12:17 +02:00
end
2011-08-16 20:05:58 +02:00
(uids_remote-uids_local).each_slice($defaults["imap_fetch_slice"].to_i) do |slice|
messages = @mailbox.uid_fetch(slice, ImapMessageModule::IMAPMessage.fetch_attr)
2011-08-02 23:12:17 +02:00
messages.each do |m|
2011-08-16 20:05:58 +02:00
mess = ImapMessageModule::IMAPMessage.fromImap(m)
Message.createForUser(@current_user,@current_folder,mess)
2011-08-02 23:12:17 +02:00
end
end
2011-08-16 20:05:58 +02:00
@messages = Message.getPageForUser(@current_user,@current_folder,params[:page],params[:sort_field],params[:sort_dir])
2011-08-02 23:12:17 +02:00
2011-07-27 20:34:30 +02:00
end
def folder
session[:selected_folder] = params[:id]
redirect_to :action => 'index'
2011-07-23 21:55:26 +02:00
end
2011-07-22 22:57:36 +02:00
2011-07-29 20:05:47 +02:00
def compose
flash[:notice] = 'Not impelented yet'
end
2011-08-16 23:37:13 +02:00
# TODO error when no folders are shown
2011-07-31 22:45:29 +02:00
def refresh
2011-08-16 20:05:58 +02:00
@folders_shown.each do |f|
@mailbox.set_folder(f.full_name)
folder_status = @mailbox.status
f.update_attributes(:total => folder_status['MESSAGES'], :unseen => folder_status['UNSEEN'])
end
redirect_to :action => 'index'
end
def emptybin
begin
trash_folder = @current_user.folders.find_by_full_name($defaults["mailbox_trash"])
@mailbox.set_folder(trash_folder.full_name)
trash_folder.messages.each do |m|
logger.custom('id',m.inspect)
@mailbox.delete_message(m.uid)
end
@mailbox.expunge
trash_folder.messages.destroy_all
trash_folder.update_attributes(:unseen => 0, :total => 0)
rescue Exception => e
flash[:error] = "#{t(:imap_error)} (#{e.to_s})"
end
2011-08-02 23:12:17 +02:00
redirect_to :action => 'index'
2011-07-31 22:45:29 +02:00
end
2011-08-02 23:12:17 +02:00
def ops
2011-08-16 20:05:58 +02:00
begin
if !params["uids"]
flash[:warning] = t(:no_selected,:scope=>:message)
elsif params["delete"]
params["uids"].each do |uid|
@mailbox.delete_message(uid)
@current_user.messages.find_by_uid(uid).destroy
end
@current_folder.update_stats
elsif params["set_unread"]
params["uids"].each do |uid|
@mailbox.set_unread(uid)
@current_user.messages.find_by_uid(uid).update_attributes(:unseen => 1)
end
elsif params["set_read"]
params["uids"].each do |uid|
@mailbox.set_read(uid)
@current_user.messages.find_by_uid(uid).update_attributes(:unseen => 0)
end
elsif params["trash"]
dest_folder = @current_user.folders.find_by_full_name($defaults["mailbox_trash"])
params["uids"].each do |uid|
@mailbox.move_message(uid,dest_folder.full_name)
message = @current_folder.messages.find_by_uid(uid)
message.change_folder(dest_folder)
end
@mailbox.expunge
dest_folder.update_stats
@current_folder.update_stats
elsif params["copy"]
if params["dest_folder"].empty?
flash[:warning] = t(:no_selected,:scope=>:folder)
else
dest_folder = find(params["dest_folder"])
params["uids"].each do |uid|
@mailbox.copy_message(uid,dest_folder.full_name)
message = @current_folder.messages.find_by_uid(uid)
new_message = message.clone
new_message.folder_id = dest_folder.id
new_message.save
end
dest_folder.update_stats
@current_folder.update_stats
end
elsif params["move"]
if params["dest_folder"].empty?
flash[:warning] = t(:no_selected,:scope=>:folder)
else
dest_folder = @current_user.folders.find(params["dest_folder"])
params["uids"].each do |uid|
@mailbox.move_message(uid,dest_folder.full_name)
message = @current_folder.messages.find_by_uid(uid)
message.change_folder(dest_folder)
end
@mailbox.expunge
dest_folder.update_stats
@current_folder.update_stats
end
end
rescue Exception => e
flash[:error] = "#{t(:imap_error)} (#{e.to_s})"
end
2011-08-02 23:12:17 +02:00
redirect_to :action => 'index'
end
def show
2011-08-16 20:05:58 +02:00
@message = @current_user.messages.find(params[:id])
@message.update_attributes(:unseen => false)
flash[:notice] = 'Not implemented yet'
@body = @mailbox.fetch_body(@message.uid)
2011-08-02 23:12:17 +02:00
end
2011-07-22 22:57:36 +02:00
end