Как создать ICS в рельсах и отправить в виде прикрепления по почте? - PullRequest
7 голосов
/ 17 января 2011

Как создать ICS в рельсах и отправить его в виде прикрепления по почте?

Ответы [ 3 ]

14 голосов
/ 17 января 2011

Это можно сделать, используя ge_ ri_cal: для создания файла ics события вы хотите создать событие:

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 "john.glenn@nasa.gov"
      alarm do
        description "Segment 51"
      end
    end

Затем вы используете .export(stream) для события (это вставитсобытие в календарь-обертку, который содержит только это событие, поэтому вам не нужно оборачивать его самостоятельно).Поток может быть установлен в файл, который может быть присоединен так, как предложил Энди, или вы можете вызвать этот метод без аргумента потока, который будет возвращать строку, которая может быть вставлена ​​во вложение как есть.Это будет выглядеть примерно так:

class UserMailer < ActionMailer::Base
  def send_event_email(user, event)
    attachments['event.ics'] = event.export()
    mail(:to => user.email, :subject => "Calendar event!")
  end
end
1 голос
/ 03 ноября 2016

С icalendar

Добавьте этот камень к вашему Gemfile

gem 'mail'
gem 'icalendar'

Вы должны настроить почтовый гем внутри config/enviroment.rb, например, для 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
}

Модель пользователя

has_may :calendar_events

Поля

  • ПолноеИмя
  • почта

CalendarEvent модель

belongs_to :user

Поля

  • название
  • описание
  • start_time
  • end_time

приложение / отправители / mail_notifier.rb

class MailNotifier < ActionMailer::Base
  default from: 'test@something.com'
  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

Теперь вы можете вызывать MailNotifier из контроллера со следующим кодом

MailNotifier.send_calendar_event(@calendar_event, organizer_user).deliver
1 голос
/ 17 января 2011

Используя ActionMailer ( документация API ), просто сгенерируйте файл и добавьте его в 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

Вы можете сделать это, не сохраняя файл вфайловая система, но я оставлю это упражнение на ваше усмотрение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...