lib/sendgrid_actionmailer.rb in sendgrid-actionmailer-2.4.2 vs lib/sendgrid_actionmailer.rb in sendgrid-actionmailer-2.5.0
- old
+ new
@@ -22,21 +22,19 @@
def deliver!(mail)
sendgrid_mail = Mail.new.tap do |m|
m.from = to_email(mail.from)
m.reply_to = to_email(mail.reply_to)
m.subject = mail.subject || ""
- # https://sendgrid.com/docs/Classroom/Send/v3_Mail_Send/personalizations.html
- m.add_personalization(to_personalizations(mail))
end
+ add_personalizations(sendgrid_mail, mail)
add_api_key(sendgrid_mail, mail)
add_content(sendgrid_mail, mail)
add_send_options(sendgrid_mail, mail)
add_mail_settings(sendgrid_mail, mail)
add_tracking_settings(sendgrid_mail, mail)
-
response = perform_send_request(sendgrid_mail)
settings[:return_response] ? response : self
end
@@ -73,24 +71,53 @@
else
puts "unknown type #{input.class.name}"
end
end
- def to_personalizations(mail)
- Personalization.new.tap do |p|
- to_emails(mail.to).each { |to| p.add_to(to) }
- to_emails(mail.cc).each { |cc| p.add_cc(cc) }
- to_emails(mail.bcc).each { |bcc| p.add_bcc(bcc) }
+ def setup_personalization(mail, personalization_hash)
+ p = Personalization.new
+ (personalization_hash['to'] || []).each do |to|
+ p.add_to Email.new(email: to['email'], name: to['name'])
+ end
+ (personalization_hash['cc'] || []).each do |cc|
+ p.add_cc Email.new(email: cc['email'], name: cc['name'])
+ end
+ (personalization_hash['bcc'] || []).each do |bcc|
+ p.add_bcc Email.new(email: bcc['email'], name: bcc['name'])
+ end
+ (personalization_hash['headers'] || []).each do |header_key, header_value|
+ p.add_header Header.new(key: header_key, value: header_value)
+ end
+ (personalization_hash['substitutions'] || {}).each do |sub_key, sub_value|
+ p.add_substitution(Substitution.new(key: sub_key, value: sub_value))
+ end
+ (personalization_hash['custom_args'] || {}).each do |arg_key, arg_value|
+ p.add_custom_arg(CustomArg.new(key: arg_key, value: arg_value))
+ end
+ if personalization_hash['send_at']
+ p.send_at = personalization_hash['send_at']
+ end
+ if personalization_hash['subject']
+ p.subject = personalization_hash['subject']
+ end
+
+ if mail['dynamic_template_data'] || personalization_hash['dynamic_template_data']
if mail['dynamic_template_data']
- p.add_dynamic_template_data(json_parse(mail['dynamic_template_data'].value))
- elsif mail['template_id'].nil?
- p.add_substitution(Substitution.new(key: "%asm_group_unsubscribe_raw_url%", value: "<%asm_group_unsubscribe_raw_url%>"))
- p.add_substitution(Substitution.new(key: "%asm_global_unsubscribe_raw_url%", value: "<%asm_global_unsubscribe_raw_url%>"))
- p.add_substitution(Substitution.new(key: "%asm_preferences_raw_url%", value: "<%asm_preferences_raw_url%>"))
+ data = json_parse(mail['dynamic_template_data'].value, false)
+ data.merge!(personalization_hash['dynamic_template_data'] || {})
+ else
+ data = personalization_hash['dynamic_template_data']
end
+ p.add_dynamic_template_data(data)
+ elsif mail['template_id'].nil?
+ p.add_substitution(Substitution.new(key: "%asm_group_unsubscribe_raw_url%", value: "<%asm_group_unsubscribe_raw_url%>"))
+ p.add_substitution(Substitution.new(key: "%asm_global_unsubscribe_raw_url%", value: "<%asm_global_unsubscribe_raw_url%>"))
+ p.add_substitution(Substitution.new(key: "%asm_preferences_raw_url%", value: "<%asm_preferences_raw_url%>"))
end
+
+ p
end
def to_attachment(part)
Attachment.new.tap do |a|
a.content = Base64.strict_encode64(part.body.decoded)
@@ -135,9 +162,26 @@
end
end
def json_parse(text, symbolize=true)
JSON.parse(text.empty? ? '{}' : text.gsub(/:*\"*([\%a-zA-Z0-9_-]*)\"*(( *)=>\ *)/) { "\"#{$1}\":" }, symbolize_names: symbolize)
+ end
+
+ def add_personalizations(sendgrid_mail, mail)
+ if (mail.to && mail.to.any?) || (mail.cc && mail.cc.any?) || (mail.bcc && mail.bcc.any?)
+ personalization = setup_personalization(mail, {})
+ to_emails(mail.to).each { |to| personalization.add_to(to) }
+ to_emails(mail.cc).each { |cc| personalization.add_cc(cc) }
+ to_emails(mail.bcc).each { |bcc| personalization.add_bcc(bcc) }
+ sendgrid_mail.add_personalization(personalization)
+ end
+
+ if mail['personalizations']
+ personalizations = json_parse('[' + mail['personalizations'].value + ']', false)
+ personalizations.each do |p|
+ sendgrid_mail.add_personalization(setup_personalization(mail, p))
+ end
+ end
end
def add_send_options(sendgrid_mail, mail)
if mail['template_id']
sendgrid_mail.template_id = mail['template_id'].to_s