from_scratch
Wojciech Todryk 2011-09-05 19:08:22 +02:00
parent 910a6f3bc0
commit 8868a84123
21 changed files with 358 additions and 513 deletions

View File

@ -8,11 +8,11 @@ class ApplicationController < ActionController::Base
before_filter :plugins_configuration
rescue_from ActiveRecord::RecordNotFound do
logger.custom('record_not_found','exc')
reset_session
redirect_to :controller=>'user', :action => 'login'
end
# rescue_from ActiveRecord::RecordNotFound do
# logger.custom('record_not_found','exc')
# reset_session
# redirect_to :controller=>'user', :action => 'login'
# end
def load_defaults
$defaults ||= YAML::load(File.open(Rails.root.join('config','defaults.yml')))
@ -106,6 +106,23 @@ class ApplicationController < ActionController::Base
end
end
def prepare_compose_buttons
@buttons = []
@buttons << {:text => 'send',:image => 'tick.png'}
@buttons << {:text => 'save_as_draft',:image => 'tick.png'}
end
##################################### protected section ########################################
protected
def get_system_folders
@drafts_folder = @current_user.folders.drafts.first
@sent_folder = @current_user.folders.sent.first
@inbox_folder = @current_user.folders.inbox.first
@trash_folder = @current_user.folders.trash.first
end
##################################### private section ##########################################
private

View File

@ -3,24 +3,32 @@ class InternalController < ApplicationController
theme :theme_resolver
layout "simple"
def error
ERRORS = [
:internal_server_error,
:not_found,
:unprocessable_entity
].freeze
ERRORS.each do |e|
define_method e do
@title = t(e,:scope=>:internal)
@error = t(e,:scope=>:internal)
render 'error'
end
end
def error
@title = t(:unspecified_error,:scope=>:internal)
@error = params[:error] || t(:unspecified_error,:scope=>:internal)
end
def imaperror
@title = t(:imap_error)
@error = params[:error] || t(:unspecified_error)
@title = t(:imap_error,:scope => :internal)
@error = params[:error] || t(:unspecified_error, :scope => :internal)
logger.error "!!! InternalControllerImapError: " + @error
render 'error'
end
def page_not_found
@title = t(:page_not_found)
@error = t(:page_not_found)
logger.error "!!! InternalControllerError: " + @error
render 'error'
end
def loginfailure
reset_session
flash[:error] = t(:login_failure,:scope=>:user)

View File

@ -15,11 +15,11 @@ class MessagesController < ApplicationController
before_filter :open_imap_session, :select_imap_folder
before_filter :prepare_buttons, :only => [:compose,:reply,:edit,:sendout_or_save]
before_filter :prepare_compose_buttons, :only => [:compose]
#before_filter :mail_defaults, :only => [:sendout_or_save]
before_filter :get_system_folders, :only => [:index,:ops,:sendout_or_save]
before_filter :get_system_folders, :only => [:index]
after_filter :close_imap_session
@ -73,195 +73,6 @@ class MessagesController < ApplicationController
end
end
def reply
attachments = []
body = ''
old_message = @current_user.messages.find(params[:id])
@message = Message.new
@message.to_addr = address_formatter(old_message.from_addr,:raw)
@message.subject = old_message.subject
@reply = true
imap_message = @mailbox.fetch_body(old_message.uid)
mail = Mail.new(imap_message)
if mail.multipart?
Attachment.fromMultiParts(attachments,old_message.id,mail.parts)
else
Attachment.fromSinglePart(attachments,old_message.id,mail)
end
for idx in 0..attachments.size-1
if attachments[idx].isText?
body << attachments[idx].decode_and_charset
break
end
end
@message.body = body
render 'compose'
end
def edit
attachments = []
body = ''
old_message = @current_user.messages.find(params[:id])
@message = Message.new
@message.to_addr = address_formatter(old_message.to_addr,:raw)
@message.subject = old_message.subject
imap_message = @mailbox.fetch_body(old_message.uid)
mail = Mail.new(imap_message)
if mail.multipart?
Attachment.fromMultiParts(attachments,old_message.id,mail.parts)
else
Attachment.fromSinglePart(attachments,old_message.id,mail)
end
for idx in 0..attachments.size-1
if attachments[idx].isText?
body << attachments[idx].decode_and_charset
break
end
end
@message.body = body
render 'compose'
end
def sendout_or_save
mail = Mail.new
mail.subject = params[:message][:subject]
mail.from = @current_user.full_address
mail.to = params[:message][:to_addr]
mail.body = params[:message][:body]
#mail.add_file :filename => 'somefile.png', :content => File.read('/tmp/script_monitor_20110810143216.log')
if params[:send]
smtp_server = @current_user.servers.primary_for_smtp
if smtp_server.nil?
flash[:error] = t(:not_configured_smtp,:scope => :compose)
@message = Message.new
if params[:message]
@message = update_attributes(params[:message])
end
render 'compose'
return
end
begin
set_mail_defaults(@current_user,smtp_server,session)
#logger.custom('mail',Mail.delivery_method.inspect)
@response = mail.deliver!
#logger.custom('response',@response.inspect)
if @sent_folder.nil?
raise t(:not_configured_sent,:scope=>:compose)
end
@mailbox.append(@sent_folder.full_name,mail.to_s,[:Seen])
rescue Exception => e
flash[:error] = "#{t(:imap_error)} (#{e.to_s})"
redirect_to :action => 'index'
return
end
flash[:notice] = t(:was_sent,:scope => :compose)
redirect_to :action => 'index'
elsif params[:save_as_draft]
begin
if @drafts_folder.nil?
raise t(:not_configured_drafts,:scope=>:compose)
end
# TODO delete old one if was edit
@mailbox.append(@drafts_folder.full_name,mail.to_s,[:Seen])
rescue Exception => e
flash[:error] = "#{t(:imap_error)} (#{e.to_s})"
redirect_to :action => 'index'
return
end
flash[:notice] = t(:was_saved,:scope => :compose)
redirect_to :action => 'index'
end
end
def msgops
begin
if !params["uids"]
flash[:warning] = t(:no_selected,:scope=>:message)
elsif params["reply"]
redirect_to :action => 'reply', :id => params[:id]
return
end
rescue Exception => e
flash[:error] = "#{t(:imap_error)} (#{e.to_s})"
end
redirect_to :action => 'show', :id => params[:id]
end
def ops
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"]
if not @trash_folder.nil?
params["uids"].each do |uid|
@mailbox.move_message(uid,@trash_folder.full_name)
message = @current_folder.messages.find_by_uid(uid)
message.change_folder(@trash_folder)
end
@mailbox.expunge
@trash_folder.update_stats
@current_folder.update_stats
end
elsif params["copy"]
if params[:folder][:target].empty?
flash[:warning] = t(:no_selected,:scope=>:folder)
else
dest_folder = @current_user.folders.find(params[:folder][:target])
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[:folder][:target].empty?
flash[:warning] = t(:no_selected,:scope=>:folder)
else
dest_folder = @current_user.folders.find(params[:folder][:target])
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
redirect_to :action => 'index'
end
def show
@images = []
@attachments = []
@ -315,25 +126,6 @@ class MessagesController < ApplicationController
@attachments << part
end
end
#@attachments = []
#logger.custom('after_parse',Time.now)
#if mail.multipart?
# Attachment.fromMultiParts(@attachments,@message.id,@mail.parts)
#else
# Attachment.fromSinglePart(@attachments,@message.id,@mail)
# end
#logger.custom('attach',Time.now)
# for idx in 0..@attachments.size-1
# @attachments[idx].idx = idx
# @attachments[idx].isText? ? @render_as_text << @attachments[idx].decode_and_charset : @render_as_text
# @attachments[idx].isHtml? ? @render_as_html_idx ||= idx : @render_as_html_idx
# @attachments[idx].isImageAndNotCid? ? @images << @attachments[idx] : @images
# end
#logger.custom('done',Time.now)
#@attachments = @mail.attachments
end
def html_body
@ -350,85 +142,23 @@ class MessagesController < ApplicationController
render 'html_body',:layout => 'html_body'
end
def body
attachments = []
cids = []
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)
else
Attachment.fromSinglePart(attachments,message.id,mail)
end
html = attachments[params[:idx].to_i]
@body = html.decode_and_charset
for idx in 0..attachments.size-1
if not attachments[idx].cid.size.zero?
@body.gsub!(/cid:#{attachments[idx].cid}/,messages_attachment_download_path(message.uid,idx))
end
end
render 'html_view',:layout => 'html_view'
end
def attachment
attachments = []
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)
if mail.multipart? == true
attachments = mail.attachments
else
Attachment.fromSinglePart(attachments,message.id,mail)
end
a = attachments[params[:idx].to_i]
headers['Content-type'] = a.type
headers['Content-Disposition'] = %(attachment; filename="#{a.name}")
render :text => a.decode
attachments << Mail::Part.new(mail)
end
a = attachments[params[:idx].to_i]
headers['Content-type'] = a.main_type + "/" + a.sub_type
headers['Content-Disposition'] = %(attachment; filename="#{a.filename}")
render :text => a.decoded
end
############################################# protected section ##########################################
def prepare_buttons
@buttons = []
@buttons << {:text => 'send',:image => 'tick.png'}
@buttons << {:text => 'save_as_draft',:image => 'tick.png'}
end
def set_mail_defaults(user,server,session)
if server.auth.nil? or server.auth == 'none'
password = nil
authentication = nil
enable_starttls_auto = nil
openssl_verify_mode = nil
user_name = nil
else
password = user.get_cached_password(session)
authentication = server.auth
enable_starttls_auto = server.use_tls
openssl_verify_mode = OpenSSL::SSL::VERIFY_NONE
user_name = user.full_address
end
Mail.defaults do
delivery_method :smtp, {:address => server.name,
:port => server.port,
:domain => user.domain,
:user_name => user_name,
:password => password,
:authentication => authentication,
:enable_starttls_auto => enable_starttls_auto,
:openssl_verify_mode => openssl_verify_mode
}
end
end
def get_system_folders
@drafts_folder = @current_user.folders.drafts.first
@sent_folder = @current_user.folders.sent.first
@inbox_folder = @current_user.folders.inbox.first
@trash_folder = @current_user.folders.trash.first
end
protected
end

View File

@ -0,0 +1,245 @@
require 'imap_session'
require 'imap_mailbox'
require 'imap_message'
require 'mail'
class MessagesOpsController < ApplicationController
include ImapMailboxModule
include ImapSessionModule
include ImapMessageModule
include MessagesHelper
before_filter :check_current_user ,:selected_folder,:get_current_folders
before_filter :open_imap_session, :select_imap_folder
before_filter :prepare_compose_buttons
before_filter :get_system_folders, :only => [:sendout_or_save,:single,:multi]
after_filter :close_imap_session
theme :theme_resolver
############################################### single #####################################
def single
if params[:reply]
reply
return
elsif params[:trash]
trash
end
redirect_to :controller => 'messages', :action => 'index'
end
############################################### multi ######################################
def multi
begin
if !params[:uids]
flash[:warning] = t(:no_selected,:scope=>:message)
elsif params[:set_unread]
set_unread
elsif params[:set_read]
set_read
elsif params[:trash]
trash
elsif params[:copy]
copy
elsif params[:move]
move
end
rescue Exception => e
flash[:error] = "#{t(:imap_error)} (#{e.to_s})"
end
redirect_to :controller => 'messages', :action => 'index'
end
def set_unread
params["uids"].each do |uid|
@mailbox.set_unread(uid)
@current_user.messages.find_by_uid(uid).update_attributes(:unseen => 1)
end
end
def set_read
params["uids"].each do |uid|
@mailbox.set_read(uid)
@current_user.messages.find_by_uid(uid).update_attributes(:unseen => 0)
end
end
def trash
if @trash_folder.nil?
flash[:warning] = t(:not_configured_trash, :scope=>:folder)
else
params["uids"].each do |uid|
@mailbox.move_message(uid,@trash_folder.full_name)
message = @current_folder.messages.find_by_uid(uid)
message.change_folder(@trash_folder)
end
@mailbox.expunge
@trash_folder.update_stats
@current_folder.update_stats
end
end
def copy
if params[:folder][:target].empty?
flash[:warning] = t(:no_selected,:scope=>:folder)
else
dest_folder = @current_user.folders.find(params[:folder][:target])
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
end
def move
if params[:folder][:target].empty?
flash[:warning] = t(:no_selected,:scope=>:folder)
else
dest_folder = @current_user.folders.find(params[:folder][:target])
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
############################################### sendout_or_save ############################
def sendout_or_save
mail = Mail.new
mail.subject = params[:message][:subject]
mail.from = @current_user.full_address
mail.to = params[:message][:to_addr]
mail.body = params[:message][:body]
#mail.add_file :filename => 'somefile.png', :content => File.read('/tmp/script_monitor_20110810143216.log')
if params[:send]
smtp_server = @current_user.servers.primary_for_smtp
if smtp_server.nil?
flash[:error] = t(:not_configured_smtp,:scope => :compose)
@message = Message.new
if params[:message]
@message = update_attributes(params[:message])
end
render 'messages/compose'
return
end
begin
set_mail_defaults(@current_user,smtp_server,session)
logger.custom('mail',Mail.delivery_method.inspect)
@response = mail.deliver!
logger.custom('response',@response.inspect)
if @sent_folder.nil?
raise t(:not_configured_sent,:scope=>:compose)
end
@mailbox.append(@sent_folder.full_name,mail.to_s,[:Seen])
rescue Exception => e
flash[:error] = "#{t(:imap_error)} (#{e.to_s})"
redirect_to :controller => 'messages', :action => 'index'
return
end
flash[:notice] = t(:was_sent,:scope => :compose)
redirect_to :controller => 'messages', :action => 'index'
elsif params[:save_as_draft]
begin
if @drafts_folder.nil?
raise t(:not_configured_drafts,:scope=>:compose)
end
# TODO delete old one if was edit
@mailbox.append(@drafts_folder.full_name,mail.to_s,[:Seen])
rescue Exception => e
flash[:error] = "#{t(:imap_error)} (#{e.to_s})"
redirect_to :controller => 'messages', :action => 'index'
return
end
flash[:notice] = t(:was_saved,:scope => :compose)
redirect_to :controller => 'messages', :action => 'index'
end
end
###################################### protected section #######################################
protected
def edit
old_message = @current_user.messages.find(params[:id].first)
@message = Message.new
@message.to_addr = address_formatter(old_message.to_addr,:raw)
@message.subject = old_message.subject
imap_message = @mailbox.fetch_body(old_message.uid)
@edit = true
mail = Mail.new(imap_message)
if mail.multipart?
@message.body = mail.text_part.decoded_and_charseted
else
@message.body = mail.decoded_and_charseted
end
render 'messages/compose'
end
def reply
old_message = @current_user.messages.find(params[:uids].first)
@message = Message.new
@message.to_addr = address_formatter(old_message.from_addr,:raw)
@message.subject = old_message.subject
imap_message = @mailbox.fetch_body(old_message.uid)
mail = Mail.new(imap_message)
if mail.multipart?
@message.body = mail.text_part.decoded_and_charseted
else
@message.body = mail.decoded_and_charseted
end
render 'messages/compose'
end
############################################ set_mail_defaults ####################################
def set_mail_defaults(user,server,session)
if server.auth.nil? or server.auth == 'none'
password = nil
authentication = nil
enable_starttls_auto = nil
openssl_verify_mode = nil
user_name = nil
else
password = user.get_cached_password(session)
authentication = server.auth
enable_starttls_auto = server.use_tls
openssl_verify_mode = OpenSSL::SSL::VERIFY_NONE
user_name = user.full_address
end
Mail.defaults do
delivery_method :smtp, {:address => server.name,
:port => server.port,
:domain => user.domain,
:user_name => user_name,
:password => password,
:authentication => authentication,
:enable_starttls_auto => enable_starttls_auto,
:openssl_verify_mode => openssl_verify_mode
}
end
end
end

View File

@ -0,0 +1,2 @@
module MessagesOpsHelper
end

View File

@ -1,192 +0,0 @@
class Attachment
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
attr_accessor :type, :charset, :encoding, :name, :description, :content, :message_id, :idx, :boundary, :format, :multipart,:size,:cid
attr_reader :link
def initialize(attributes = {})
attributes.each do |name, value|
send("#{name}=", value)
end
if not @type.nil?
params = @type.split(/;\s*/)
@type = params[0]
params.each do |p|
if p =~ /=/
fields = p.split(/=/)
key = fields[0]
fields.delete_at(0)
value = fields.join("=")
# FIXME maybe do decoding only for name and filename key
if Attachment.attribute_method?(key) == true
send("#{key}=", ApplicationController.decode_quoted(value))
end
end
end
end
end
def multipart?
multipart
end
def self.fromMultiParts(attachments,id,parts)
parts.each do |part|
a = build(id,part)
if a.multipart?
fromMultiParts(attachments,id,part.parts)
else
attachments << a
end
end
end
def self.fromSinglePart(attachments,id,part)
a = build(id,part)
attachments << a
end
def self.build(id,part)
cid = ''
if not part.content_id.nil?
part.content_id =~ /\<(\S+)\>/
cid = $1
else
cid = ''
end
a = Attachment.new( :message_id => id,
:description => part.content_description,
:type => part.content_type,
:content => part.body.raw_source,
:encoding => part.body.encoding,
:size => part.body.raw_source.size,
:charset => part.body.charset,
:multipart => part.multipart?,
:cid => cid
)
return a
end
def persisted?
false
end
def name
if @name.nil?
case type
when /^text\/html/
"index#{idx}.html"
when /^multipart/
"multipart#{idx}.part"
when /^text\/plain/
"file#{idx}.txt"
else
"filaname.dat"
end
else
@name
end
end
def to_s
s = "Attachment:\n"
instance_variables.sort.each do |name|
if name == "@content"
s += "\t#{name}: size #{instance_variable_get(name).size}\n"
else
s += "\t#{name}: #{instance_variable_get(name)}\n"
end
end
s
end
def isText?
@type.nil? or @type =~ /^text\/plain/
end
def isHtml?
@type =~ /^text\/html/
end
def isImageAndNotCid?
@type =~ /^image/ and @cid.size.zero?
end
def title
@description.nil? ? name : @description
end
def type
@type.nil? ? '' : @type
end
def charset
@charset.nil? ? '' : @charset
end
def encoding
@encoding.nil? ? '' : @encoding
end
def format
@format.nil? ? '' : @format
end
def boundary
@boundary.nil? ? '' : @boundary
end
def decode
begin
case @encoding
when /quoted-printable/
#decoded = @content.gsub(/_/," ").unpack("M").first
decoded = @content.unpack("M").first
when /base64/
decoded = @content.unpack("m").first
when /uuencode/
array = @content.split(/\n/)
if array[0] =~ /^begin/
size = array.size
array.delete_at(size-1)
array.delete_at(size-2)
array.delete_at(0)
end
string = array.join
decoded = string.unpack("u").first
else
decoded = @content
end
rescue
@content
end
end
def decode_and_charset
begin
decoded = decode
if not @charset == 'UTF-8'
@charset.nil? ? charset = $defaults["msg_unknown_charset"] : charset = @charset
charseted = Iconv.iconv("UTF-8",charset,decoded).first
else
charseted = decoded
end
charseted
rescue
decoded
end
end
end

0
arts/favicon.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

0
arts/favicon.xcf Normal file → Executable file
View File

View File

@ -38,4 +38,4 @@ session_password: asDD3s2@sAdc983#
mailbox_max_parent_folder_depth: 3
# array of logins which only can login to application, comment it to allow everyone to login
only_can_logins: [soldier]
only_can_logins: [wtodryk]

View File

@ -0,0 +1,16 @@
require 'action_dispatch/middleware/show_exceptions'
module ActionDispatch
class ShowExceptions
private
def render_exception_with_template(env, exception)
body = InternalController.action(rescue_responses[exception.class.name]).call(env)
log_error(exception)
body
rescue
render_exception_without_template(env, exception)
end
alias_method_chain :render_exception, :template
end
end

View File

@ -84,6 +84,10 @@ pl:
sent_name: Wysłane
trash_name: Kosz
drafts_name: Roboczy
not_configured_drafts: Folder Roboczy nie został przypisany
not_configured_sent: Folder Wysłany nie został przypisany
not_configured_trash: Folder Kosz nie został przypisany
not_configured_inbox: Folder Odebrane nie został przypisany
message:
messages: Wiadomości
@ -112,10 +116,6 @@ pl:
was_saved: Wiadomość została zapisana w katalogu roboczym
reply_string: "Odp: "
not_configured_smtp: Brak konfiguracji SMTP
not_configured_drafts: Folder Roboczy nie został przypisany
not_configured_sent: Folder Wysłany nie został przypisany
not_configured_trash: Folder Kosz nie został przypisany
not_configured_inbox: Folder Odebrane nie został przypisany
show:
replay_to: Odpowiedz
@ -133,6 +133,13 @@ pl:
login: Logowanie
only_can_logins: Podany identyfikator użytkownika nie uprawnia do korzystania z aplikacji
internal:
imap_error: Błąd protokołu IMAP
unspecified_error: Nieoczekiwany błąd
not_found: Nie znaleziono żądanej strony
internal_server_error: Błąd aplikacji
unprocessable_entity: Błąd procesowania
must_be_unique: musi być unikalny
some_add_info: jakieś dodatkowe informacje
example: przykład
@ -140,11 +147,9 @@ pl:
create: Utwórz
delete: Usuń
show_hide: Pokaż/Ukryj
mailr: Mailr
mailr: MailR
save: Zapisz
imap_error: Błąd protokołu IMAP
unspecified_error: Nieoczekiwany błąd
page_not_found: Nie znaleziono żądanej strony
copy: Skopiuj
move: Przenieś
to: do

View File

@ -31,20 +31,24 @@ Mailr::Application.routes.draw do
get "internal/loginfailure"
get "internal/onlycanlogins"
match "messages_ops/single" => 'messages_ops#single'
match "messages_ops/multi" => 'messages_ops#multi'
match "messages_ops/sendout_or_save" => 'messages_ops#sendout_or_save' ,:as =>:sendout_or_save
root :to => "messages#index"
#get "messages/refresh_status"
#get "messages/emptybin"
#match "messages/select/:id" => 'messages#select', :as => :messages_select
get "messages/index"
#match 'messages/folder/:id' => 'messages#folder', :as => :messages_folder
post "messages/ops"
post "messages/msgops"
#post "messages/ops"
#post "messages/msgops"
match "messages/compose" => 'messages#compose'
match "messages/edit/:id" => 'messages#edit' ,:as => :messages_edit
match "messages/reply/:id" => 'messages#reply'
match "messages/sendout_or_save" => 'messages#sendout_or_save' ,:as =>:sendout_or_save
#match "messages/edit/:id" => 'messages#edit' ,:as => :messages_edit
#match "messages/reply/:id" => 'messages#reply'
match "messages/show/:id" => 'messages#show'
match "messages/body/:id/:idx" => 'messages#body' , :as => :messages_part_body
#match "messages/body/:id/:idx" => 'messages#body' , :as => :messages_part_body
match "messages/html_body/:id" => 'messages#html_body' , :as => :messages_html_body
match "messages/attachment/:id/:idx" => 'messages#attachment', :as => :messages_attachment_download
@ -58,7 +62,7 @@ Mailr::Application.routes.draw do
themes_for_rails
match '*a', :to => 'internal#page_not_found'
match '*a', :to => 'internal#not_found'
# The priority is based upon order of creation:
# first created -> highest priority.

0
public/favicon.ico Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,8 @@
require 'test_helper'
class MessagesOpsControllerTest < ActionController::TestCase
# Replace this with your real tests.
test "the truth" do
assert true
end
end

View File

@ -0,0 +1,4 @@
require 'test_helper'
class MessagesOpsHelperTest < ActionView::TestCase
end

View File

@ -16,6 +16,4 @@
<td>
<%= link_to t(:download), messages_attachment_download_path(attachment.parent_id,attachment.idx) %>
</td>
<td>
<%= link_to t(:view), messages_part_body_path(attachment.parent_id,attachment.idx) %>
</td>

View File

@ -14,7 +14,7 @@
<h2><%= t(:new_message,:scope=>:compose) %></h2>
<%= form_tag(sendout_or_save_path)%>
<div class="inner">
<%= render :partial => 'new' %>
<%= render :partial => 'messages/new' %>
</div>
</form>
</div>

View File

@ -11,7 +11,7 @@
<%= raw main_navigation(:messages) %>
</div>
<div class="content">
<%= form_tag({:controller=>'messages', :action=>'ops'},{:name=>'messages'})%>
<%= form_tag({:controller=>'messages_ops', :action=>'multi'},{:name=>'messages'})%>
<% if @current_folder.nil? %>
<h2><%= t(:no_selected,:scope=>:folder) %></h2>
@ -22,7 +22,7 @@
<div class="header_info"><%= t(:no_in,:scope=>:message) %></div>
</div>
<% else %>
<%= render :partial => 'ops' %>
<%= render :partial => 'multi_ops' %>
<%= render :partial => 'list' %>
<% end %>

View File

@ -11,9 +11,9 @@
<%= raw main_navigation(:show) %>
</div>
<div class="content">
<%= form_tag(messages_msgops_path)%>
<%= form_tag(messages_ops_single_path)%>
<%= render :partial => 'header' %>
<%= render :partial => 'msg_ops' %>
<%= render :partial => 'single_ops' %>
<% if not @attachments.size.zero? %>
<%= render :partial => 'attachments' %>