diff --git a/Gemfile b/Gemfile
index 0d435026c..1c524cd98 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,6 +1,8 @@
 source 'http://rubygems.org'
 gem 'rails', "~> 3.2.9"
 
+gem 'savon', '~> 2.2.0'
+
 gem "brakeman"
 gem 'mime-types'
 
diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
new file mode 100644
index 000000000..42060868c
--- /dev/null
+++ b/app/controllers/sessions_controller.rb
@@ -0,0 +1,35 @@
+# encoding: utf-8
+
+class SessionsController < Devise::SessionsController
+	prepend_before_filter :require_no_authentication, :only => [ :new, :create ]
+
+  require 'savon'
+
+  def create 
+
+    @sys_id = params["sys_id"]
+
+    client = Savon.client(wsdl: 'http://sso.ntue.edu.tw/soap/soapserver.php?wsdl')
+
+    client.operations
+
+    response = client.call(:chkidno, message: { sys_id: @sys_id })
+
+    @id = response.body[:chkidno_response][:return][:id]
+
+    login_uid = @id
+
+  	resource = User.first(conditions:{user_id: login_uid})
+
+    if !resource.blank?
+      resource_name = resource.class.to_s.downcase
+  	  sign_in(resource_name, resource)
+  	  redirect_to after_sign_in_path_for(resource)
+  	else
+  	  flash[:error] = "很抱歉,您無此權限或帳號登入本站,請洽本站管理員
Sorry, you don't have the account or authority to login. Please contact the website administrator."
+  	  edirect_to :root
+    end
+
+  end
+
+end
\ No newline at end of file
diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml
index 49396599a..a4e255bf3 100644
--- a/config/resque_schedule.yml
+++ b/config/resque_schedule.yml
@@ -10,7 +10,7 @@ generate_system_summary:
   args:
   description: Generate the system status such as disk free space,package version list for showing at site tab
 
- email_cron:
+email_cron:
   cron: 0 0 [10,16,22] * * *
   class: EmailCron
   args:
diff --git a/config/routes.rb b/config/routes.rb
index 716918775..25e488432 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -7,6 +7,11 @@ Orbit::Application.routes.draw do
     match "/users_passwd" => "desktop/registrations#update", :as => :users_passwd, :via => :put
   end
 
+  devise_scope :user do
+    get 'soap_login' => 'sessions#create'
+  end
+
+
   mount Resque::Server, :at => "/admin/resque"
   mount Rack::GridFS::Endpoint.new(:db => Mongoid.database,:lookup=>:path), :at => "gridfs"
 
diff --git a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletins_controller.rb b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletins_controller.rb
index e45ced1d6..2776e862f 100644
--- a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletins_controller.rb
+++ b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletins_controller.rb
@@ -1,3 +1,4 @@
+# encoding: utf-8
 class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
   include OrbitControllerLib::DivisionForDisable
 
@@ -77,6 +78,9 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
   # GET /bulletins/new
   # GET /bulletins/new.xml
   def new
+
+    email_group_data
+
     if(session[:in_validate_object].blank?)
       @bulletin = Bulletin.new(:postdate => DateTime.now)
     else
@@ -94,6 +98,9 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
 
   # GET /bulletins/1/edit
   def edit
+
+    email_group_data
+
     @bulletin = Bulletin.find(params[:id])
     if !current_user.admin? && (@bulletin.is_rejected? || @bulletin.is_checked?)
       redirect_to :action => :index
@@ -146,6 +153,13 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
       respond_to do |format|
         if @bulletin.save
 
+          if @bulletin.email_sent == true && @bulletin.is_checked == true
+            send_email_data(@bulletin)
+
+            @bulletin.email_sent = false
+            @bulletin.save
+          end
+
           format.html { redirect_to(panel_announcement_back_end_bulletins_url, :notice => t('announcement.create_bulletin_success')) }
           format.xml  { render :xml => @bulletin, :status => :created, :location => @bulletin }
           # format.js
@@ -226,6 +240,14 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
             @bulletin.is_rejected = false
             @bulletin.de_pending!
           end
+
+          if @bulletin.email_sent == true && @bulletin.is_checked == true
+            send_email_data(@bulletin)
+
+            @bulletin.email_sent = false
+            @bulletin.save
+          end
+
           # if (params[:bulletin][:is_checked] == "false")
           #   @bulletin.is_rejected = true
           #   @bulletin.save!
@@ -293,6 +315,66 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
 
   protected
 
+  def send_email_data(bulletin)
+
+    @site = Site.first
+    @user = User.find(bulletin.create_user_id)
+    @host = request.host_with_port
+
+    email_group_data
+
+    @group_mail = Array.new
+
+    bulletin.email_group.each do |egroup|
+
+      if @email_group_data.include?(egroup) and (egroup == '0' or egroup == '1' or egroup == '2' or egroup == '3')
+
+        @group_mail << @email_group_data[egroup]["email"]
+
+      elsif @email_group_data.include?(egroup) and egroup == '4'
+
+        @group_mail <<  bulletin.other_mailaddress 
+
+      end
+
+    end
+
+    if !@group_mail.join.blank?
+
+      @mail_content = {
+        "host" => @host,
+        "site_title" => @site.title,
+        "title" => bulletin.title,
+        "template" => 'announcement_mailer/cron_mail',
+        "url" => "http://#{@host}#{panel_announcement_front_end_bulletin_path(bulletin, :category_id => bulletin.bulletin_category.id)}"
+      }
+
+      @mail_cron = {  
+        :mail_from_app => 'announcement',
+        :mail_from => @user.email,
+        :mail_reply_to => @user.email,
+        :mail_subject => "#{t("announcement.mail_subject",:site_title => @site.title)}:#{bulletin.title}",
+        :mail_to => @group_mail.join(','),
+        :mail_content => @mail_content ,
+        :mail_sentdate => bulletin.email_sentdate,
+        :create_user_id => bulletin.create_user_id,
+        :update_user_id => bulletin.create_user_id
+      } 
+
+      @mail_cron = MailCron.new(@mail_cron) 
+
+      @mail_cron.save
+
+    end
+    
+  end
+
+  def email_group_data
+
+    @email_group_data =  Bulletin.email_group_data
+    
+  end
+
   def delete_out_invalid_date_from_params
     if((params[:bulletin]["deadline(1i)"] && params[:bulletin]["deadline(1i)"].blank?) or (params[:bulletin]["deadline(2i)"] && params[:bulletin]["deadline(2i)"].blank?) or (params[:bulletin]["deadline(3i)"] && params[:bulletin]["deadline(3i)"].blank?)) 
       params[:bulletin].delete("deadline(1i)")
diff --git a/vendor/built_in_modules/announcement/app/models/bulletin.rb b/vendor/built_in_modules/announcement/app/models/bulletin.rb
index 207b3a544..2b33d06b3 100644
--- a/vendor/built_in_modules/announcement/app/models/bulletin.rb
+++ b/vendor/built_in_modules/announcement/app/models/bulletin.rb
@@ -40,6 +40,12 @@ class Bulletin
   field :not_checked_reason
   
   field :public, :type => Boolean, :default => true
+
+
+  field :email_sent, :type => Boolean, :default => false
+  field :email_sentdate , :type => DateTime
+  field :email_group, :type => Array
+  field :other_mailaddress
   
   scope :can_display, where(is_checked: true, is_rejected: false, is_pending: false)
   scope :available_for_lang, ->(locale){ where("available_for_#{locale}".to_sym => true) }
@@ -217,6 +223,18 @@ class Bulletin
 
 
   protected
+
+  def self.email_group_data
+
+    @email_group_data = { 
+      '0'=> {"name"=>I18n.t('announcement.email_group_data_0'), "email"=>"alluser@tea.ntue.edu.tw"}, 
+      '1'=> {"name"=>I18n.t('announcement.email_group_data_1'), "email"=>"allstu@tea.ntue.edu.tw"}, 
+      '2'=> {"name"=>I18n.t('announcement.email_group_data_2'), "email"=>"allgrad@tea.ntue.edu.tw"}, 
+      '3'=> {"name"=>I18n.t('announcement.email_group_data_3'), "email"=>"allad@tea.ntue.edu.tw"}, 
+      '4'=> {"name"=>I18n.t('announcement.email_group_data_4')}
+    }
+    
+  end
   
   def check_deadline
     if(!self.deadline.nil? and (self.deadline < self.postdate ))
diff --git a/vendor/built_in_modules/announcement/app/views/announcement_mailer/cron_mail.html.erb b/vendor/built_in_modules/announcement/app/views/announcement_mailer/cron_mail.html.erb
new file mode 100644
index 000000000..fbf7e0b1c
--- /dev/null
+++ b/vendor/built_in_modules/announcement/app/views/announcement_mailer/cron_mail.html.erb
@@ -0,0 +1,29 @@
+<% # encoding: utf-8 %>
+
+
+