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-08-24 19:20:13 +02:00
|
|
|
require 'mail'
|
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
|
|
|
|
2011-08-24 19:20:13 +02:00
|
|
|
before_filter :check_current_user ,:selected_folder,: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
|
|
|
|
|
|
|
|
def index
|
2011-08-02 23:12:17 +02:00
|
|
|
|
2011-08-24 19:20:13 +02:00
|
|
|
if @current_folder.nil?
|
|
|
|
redirect_to :controller => 'folders', :action => 'index'
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
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-26 22:59:43 +02:00
|
|
|
Message.createForUser(@current_user,@current_folder,m)
|
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
|
|
|
|
|
2011-07-29 20:05:47 +02:00
|
|
|
def compose
|
2011-08-24 19:20:13 +02:00
|
|
|
@message = Message.new
|
2011-07-29 20:05:47 +02:00
|
|
|
end
|
|
|
|
|
2011-08-24 19:20:13 +02:00
|
|
|
def reply
|
|
|
|
@message = Message.new
|
|
|
|
render 'compose'
|
|
|
|
end
|
2011-08-16 23:37:13 +02:00
|
|
|
|
2011-08-24 19:20:13 +02:00
|
|
|
def sendout
|
|
|
|
flash[:notice] = t(:was_sent,:scope => :sendout)
|
2011-08-16 20:05:58 +02:00
|
|
|
redirect_to :action => 'index'
|
2011-08-24 19:20:13 +02:00
|
|
|
end
|
2011-08-16 20:05:58 +02:00
|
|
|
|
2011-08-24 19:20:13 +02:00
|
|
|
def msgops
|
2011-08-16 20:05:58 +02:00
|
|
|
begin
|
2011-08-24 19:20:13 +02:00
|
|
|
if !params["uids"]
|
|
|
|
flash[:warning] = t(:no_selected,:scope=>:message)
|
|
|
|
elsif params["reply"]
|
|
|
|
redirect_to :action => 'reply', :id => params[:id]
|
|
|
|
return
|
2011-08-16 20:05:58 +02:00
|
|
|
end
|
|
|
|
rescue Exception => e
|
|
|
|
flash[:error] = "#{t(:imap_error)} (#{e.to_s})"
|
|
|
|
end
|
2011-08-24 19:20:13 +02:00
|
|
|
redirect_to :action => 'show', :id => params[:id]
|
|
|
|
end
|
2011-07-31 22:45:29 +02:00
|
|
|
|
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["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
|
2011-08-24 19:20:13 +02:00
|
|
|
dest_folder = @current_user.folders.find(params["dest_folder"])
|
2011-08-16 20:05:58 +02:00
|
|
|
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-24 19:20:13 +02:00
|
|
|
|
|
|
|
@attachments = []
|
|
|
|
@render_as_text = []
|
|
|
|
|
2011-08-26 22:59:43 +02:00
|
|
|
@message = @current_user.messages.find_by_uid(params[:id])
|
2011-08-16 20:05:58 +02:00
|
|
|
@message.update_attributes(:unseen => false)
|
2011-08-24 19:20:13 +02:00
|
|
|
imap_message = @mailbox.fetch_body(@message.uid)
|
|
|
|
parts = imap_message.split(/\r\n\r\n/)
|
|
|
|
@message_header = parts[0]
|
2011-08-26 22:59:43 +02:00
|
|
|
@mail = Mail.new(imap_message)
|
|
|
|
if @mail.multipart?
|
2011-08-27 00:10:45 +02:00
|
|
|
Attachment.fromMultiParts(@attachments,@message.id,@mail.parts)
|
2011-08-24 19:20:13 +02:00
|
|
|
else
|
2011-08-27 00:10:45 +02:00
|
|
|
Attachment.fromSinglePart(@attachments,@message.id,@mail)
|
|
|
|
end
|
|
|
|
|
|
|
|
@attachments.each do |a|
|
|
|
|
a.isText? ? @render_as_text << a.content_normalized : @render_as_text
|
|
|
|
end
|
2011-08-24 19:20:13 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
def body
|
|
|
|
message = @mailbox.fetch_body(params[:id].to_i)
|
|
|
|
mail = Mail.new(message)
|
|
|
|
@title = ''
|
|
|
|
@body = ''
|
|
|
|
#
|
|
|
|
#header = parts[0]
|
|
|
|
#body = parts[1]
|
|
|
|
#@body = "<html><head><title>ala</title><body><pre>#{header}</pre>#{mail.inspect}</body></html>"
|
|
|
|
render 'mail_view',:layout => 'mail_view'
|
|
|
|
end
|
|
|
|
|
|
|
|
def attachment
|
2011-08-27 00:10:45 +02:00
|
|
|
attachments = []
|
|
|
|
message = @current_user.messages.find(params[:id])
|
|
|
|
mail = Mail.new(@mailbox.fetch_body(message.uid))
|
|
|
|
if mail.multipart?
|
|
|
|
Attachment.fromMultiParts(attachments,message.id,mail.parts)
|
2011-08-24 19:20:13 +02:00
|
|
|
else
|
2011-08-27 00:10:45 +02:00
|
|
|
Attachment.fromSinglePart(attachments,message.id,mail)
|
|
|
|
end
|
|
|
|
a = attachments[params[:idx].to_i]
|
2011-08-24 19:20:13 +02:00
|
|
|
headers['Content-type'] = a.type
|
|
|
|
headers['Content-Disposition'] = %(attachment; filename="#{a.name}")
|
2011-08-26 22:59:43 +02:00
|
|
|
render :text => a.decode
|
2011-08-02 23:12:17 +02:00
|
|
|
end
|
|
|
|
|
2011-07-22 22:57:36 +02:00
|
|
|
end
|