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