我想要实现以下内容:
使用delayed_job发送电子邮件,包含以下内容:
- 纯文本
- HTML(将由普通客户端显示,这些客户端不理解内联ical)
- 被Outlook和Thunderbird(带有Lightning)识别的“内联”ical。
- 一个“常规”的ical附件(用于#2)
到目前为止可以工作/无法正常工作:
我能够通过delayed_job发送包含所有部分的电子邮件,但是:
- 在Apple的Mail中,会出现2个附件(而不是一个):
(HTML正常显示)
- 在Thunderbird(Lightning)中,我确实得到了邀请,就像我想要的那样。 但是闹钟没有显示。
- 我必须对渲染的iCal进行一些非常恶心的gsubs,以便ATTENDEES显示出来。 (见代码段)
我的想法:
首先要记住的是:为了从delayed_job发送带附件的电子邮件
要解决此问题,请记住在您的邮件程序中添加此行:content_type“multipart/mixed”
据我所知,正确的MIME类型层次结构因此应该是:
- multipart/mixed
- multipart/alternative
- text/plain
- text/html
- text/calendar(具有:method = REQUEST)
- application/ics
- multipart/alternative
警告!代码即将到来。
我目前是以下方式构建此电子邮件:
编辑:我已更新Rails 4.2的邮件程序(必须在mail
之前放置attachments
)
在我的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