2011-01-16 7 views

Odpowiedz

1

Korzystanie ActionMailer (API documentation), po prostu wygenerować plik i dodać go do attachments:

class ApplicationMailer < ActionMailer::Base 
    def send_ics(recipient) 
    attachments['event.ics'] = File.read('path/to/event.ics') 
    mail(:to => recipient, :subject => "Calendar event!") 
    end 
end

Można to zrobić bez faktycznie zapisywania pliku do systemu plików, ale zostawię to ćwiczenie do ty.

+0

Myślę, że jest również pytanie, jak do generowania ICS :-P –

+0

Może. Czuję, że to jest prosta część. –

14

Można to zrobić za pomocą ri_cal GEM: Aby utworzyć wydarzenie plik ICS chcesz utworzyć zdarzenie:

event = RiCal.Event do 
     description "MA-6 First US Manned Spaceflight" 
     dtstart  DateTime.parse("2/20/1962 14:47:39") 
     dtend  DateTime.parse("2/20/1962 19:43:02") 
     location "Cape Canaveral" 
     add_attendee "[email protected]" 
     alarm do 
     description "Segment 51" 
     end 
    end 

Następnie użyć .export(stream) na zdarzenie (to wstawić zdarzenie kalendarz otoki, który zawiera tylko to wydarzenie, więc nie musisz go owijać). Strumień można ustawić na plik, który można dołączyć tak, jak sugerował Andy, lub można wywołać tę metodę bez argumentu stream, który zwróci ciąg znaków, który można umieścić w załączniku w niezmienionym stanie. Że coś będzie wyglądać następująco:

class UserMailer < ActionMailer::Base 
    def send_event_email(user, event) 
    attachments['event.ics'] = event.export() 
    mail(:to => user.email, :subject => "Calendar event!") 
    end 
end 
+4

Do wysyłania załącznika za pośrednictwem SES ważne jest ustawienie mime/type. Tak więc załącznik staje się załącznikami ['event.ics'] = {: mime_type => "text/calendar",: content => event.export()} –

0

Z icalendar

Dodaj ten klejnot do Gemfile

gem 'mail' 
gem 'icalendar' 

Musisz config poczty gem wewnątrz config/enviroment.rb na przykład dla RoR 4.2

# Load the Rails application. 
require File.expand_path('../application', __FILE__) 

# Initialize the Rails application. 
Rails.application.initialize! 

# Initialize sendgrid 
ActionMailer::Base.smtp_settings = { 
    :user_name => 'username', 
    :password => 'password', 
    :domain => 'something.com', 
    :address => 'smtp.something.com', 
    :port => 587, 
    :authentication => :plain, 
    :enable_starttls_auto => true 
} 

Użytkownik Model

has_may :calendar_events

Pola

  • fullname
  • poczty

modelu CalendarEvent

belongs_to :user

pola

  • tytuł
  • opis
  • start_time
  • end_time
  • IDENTYFIKATOR_UŻYTKOWNIKA

app/mailers/mail_notifier.rb

class MailNotifier < ActionMailer::Base 
    default from: '[email protected]' 
    def send_calendar_event(calendar_event, organizer) 
    @cal = Icalendar::Calendar.new 
    @cal.event do |e| 
     e.dtstart = calendar_event.start_time 
     e.dtend = calendar_event.end_time 
     e.summary = calendar_event.title 
     e.organizer = "mailto:#{organizer.mail}" 
     e.organizer = Icalendar::Values::CalAddress.new("mailto:#{organizer.mail}", cn: organizer.fullname) 
     e.description = calendar_event.description 
    end 
    mail.attachments['calendar_event.ics'] = { mime_type: 'text/calendar', content: @cal.to_ical } 
    mail(to: calendar_event.user.mail, 
    subject: "[SUB] #{calendar_event.description} from #{l(calendar_event.start_time, format: :default)}") 
    end 
end 

Teraz można zadzwonić MailNotifier od kontrolera z następującego kodu

MailNotifier.send_calendar_event(@calendar_event, organizer_user).deliver 
Powiązane problemy