【发布时间】:2014-03-31 06:14:45
【问题描述】:
我想要实现的是:
发送一封带有delayed_job 的电子邮件,其中包含:
- 纯文本
- html(将由不了解内联 ical 的普通客户显示)
- Outlook 和 Thunderbird(带有 Lightning)识别的“inline” ical。
- “常规”附件(用于#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
哦,我开始了:
- Rails 3.2.13
- Icalendar gem I'm using
【问题讨论】:
标签: ruby-on-rails email icalendar email-attachments