Jak utworzyć system ICS w szynach i wysłać go jako załącznik w poczcie?Jak utworzyć system ICS w szynach i wysłać go jako załącznik w poczcie?
Odpowiedz
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.
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
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()} –
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
Myślę, że jest również pytanie, jak do generowania ICS :-P –
Może. Czuję, że to jest prosta część. –