【问题标题】:How to create a multipart ical email? [Rails]如何创建多部分电子邮件? [导轨]
【发布时间】:2014-03-31 06:14:45
【问题描述】:

我想要实现的是:

发送一封带有delayed_job 的电子邮件,其中包含:

  1. 纯文本
  2. html(将由不了解内联 ical 的普通客户显示)
  3. Outlook 和 Thunderbird(带有 Lightning)识别的“inline” ical。
  4. “常规”附件(用于#2)

目前有效/无效:

我可以通过 delay_job 发送包含所有部分的电子邮件,但是:

  • 在 Apple 的 Mail 2 附件中显示(而不是一个):

(html显示正常)

  • 在 Thunderbird (Lightning) 中,我确实收到了邀请,就像我想要的那样。但是警报没有出现。

  • 我必须在渲染的 iCal 上做一些非常恶心的 gsub 才能让 ATTENDEES 出现。 (见代码 sn-p)

我的想法:

首先要记住的是:in order to send an email with attachments from delayed_job

要解决此问题,请记住将此行添加到您的邮件中:content_type "multipart/mixed"

据我了解,correct MIME-Type hierarchy 将是:

  • 多部分/混合
    • 多部分/替代
      • 文本/纯文本
      • 文本/html
      • 文本/日历(带有:method=REQUEST)
    • 应用程序/ics

警告!代码传入。

我目前按以下方式构建此电子邮件:

编辑:我更新了 Rails 4.2 的邮件程序(attachments 必须放在 mail 之前)

在我的 mailer.rb 中

def invitation_email(...)  
  subject = "I suck at email..."
  attachments["invite.ics"] = { mime_type: "application/ics",
                                content: ical_attachment }
  email = mail(from: me, to: you, subject: subject)
  add_ical_part_to(email)
  email
end

def add_ical_part_to(mail)
  outlook_body = ical_attachment
  mail.add_part(Mail::Part.new do
    content_type "text/calendar; method=REQUEST"
    body outlook_body
  end)
end

这就是我构建 ical 附件的方式:

def ical_attachment
  params_participant = {
        "ROLE"   => "REQ-PARTICIPANT",
        "RSVP" => "FALSE",
        "PARTSTAT" => "ACCEPTED"
  }

  params_invite = {
        "CUTYPE" => 'INDIVIDUAL',
        "ROLE"   => "REQ-PARTICIPANT",
        "PARTSTAT" => "NEEDS-ACTION",
        "RSVP" => "TRUE"
  }

  cal = Icalendar::Calendar.new

  event = Icalendar::Event.new
  event.dtstart      @party.from.to_datetime, { "VALUE" => "DATE" }
  event.dtend        @party.to.to_datetime, { "VALUE" => "DATE" }
  event.summary      @party.title
  event.description  @party.description
  event.klass        "PRIVATE"
  event.organizer    "cn=#{@user.name} #{@user.surname}:mailto:#{@user.email}"

    # THIS DOES NOT WORK
  event.alarm.trigger =  "-PT5M" # 5 Minutes before...

  @party.participations.each do |participation|
        str = "cn=#{participation.user.name} #{participation.user.surname}:mailto:#{participation.user.email}"
        event.add_attendee(str, params_participant)
  end

  @party.invitations.each do |invitee|
        event.add_attendee("mailto:#{invitee.email}", params_invite)
  end
  cal.add_event(event)
  cal.publish
  
  # I KNOW THIS IS HORRIBLE AND I HATE IT, BUT OTHERWISE THE ATTENDEES DO NOT SHOW UP
  cal.to_ical.gsub("ORGANIZER:", "ORGANIZER;").gsub("ACCEPTED:", "ACCEPTED;").gsub("TRUE:", "TRUE;").gsub("PUBLISH", "REQUEST")
end

任何帮助将不胜感激!

正在生成的电子邮件:http://pastebin.com/patf05zd

哦,我开始了:

【问题讨论】:

    标签: ruby-on-rails email icalendar email-attachments


    【解决方案1】:

    您的第二个 B64 编码附件在结尾处(参加者字段)包含大量垃圾。 这可以解释 Thunderbird 问题。

    请注意,有些客户会忽略您在请求中设置的任何警报:作为组织者,您不应指定何时应提醒每位与会者参加会议。那将是一件相当粗鲁的事情。

    关于 Apple iCal 问题,恐怕您无能为力:有些客户想要 ics,有些则作为附件,因此您必须同时提供两者。它是否在 iCal 上显示接受/拒绝面板?

    【讨论】:

    • 感谢您的回复。我实际上是手动“编辑”了附件的某些部分。但是,附件都是以相同的方式生成的:ical_attachment 方法。是的,接受/拒绝面板显示在 iCal 中(保存附件并在 OSX 上使用 ical 文件处理程序打开它时)
    • 不确定我明白了。您的 pastebin 是否与您在使用 Thunderbird 时遇到的错误相对应?
    【解决方案2】:

    如果其他人碰巧遇到这种情况,这就是我所做的:

    我现在使用ri_cal 而不是icalendar gem。尽管我对此表示怀疑,因为上一次提交该 repo 是在 3 年前,但 google group 是一个非常有用的资源。

    这是我如何生成 ical 附件(内联附件和普通附件),它似乎工作正常(尽管它显然需要一些重构:))

    def to_ical
    # this is horrible
    klass = self
    
    cal = RiCal.Calendar do
      event = event do
        organizer   "CN=#{klass.user.name} #{klass.user.surname}:mailto:#{klass.user.email}"
        summary     klass.party.title
    
        description klass.ical_description
        dtstart     klass.party.from.utc.to_datetime
        dtend       klass.party.to.utc.to_datetime
        location    "See url in description"
        security_class klass.security_class
    
        # this is horrible
        h = self
    
        klass.party.participations.each do |participation|
          h.add_attendee klass.prepare_participant(participation)
        end
    
        klass.party.invitations.each do |invitee|
          h.add_attendee klass.prepare_invitee(invitee.email)
        end
    
        unless klass.party.reminder == 0
          alarm do
            description "Alarm description"
            trigger klass.convert_trigger # -PT1H
            action "DISPLAY"
          end
        end
      end
    end
    
    # THE HORROR
    cal.to_s.gsub("ATTENDEE:", "ATTENDEE")
            .gsub("ORGANIZER:", "ORGANIZER;")
            .gsub("CALSCALE:GREGORIAN", "CALSCALE:GREGORIAN\nMETHOD:REQUEST\n")
    

    结束

    Apples Mail 中的 2 个附件仍然显示,我认为无法修复。

    【讨论】:

      猜你喜欢
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 2013-07-13
      • 2019-05-14
      • 2019-07-22
      • 2021-01-11
      • 2012-08-13
      相关资源
      最近更新 更多