วิธีเขียนโค้ดฟีด Twitter แบบไดนามิกในอีเมล HTML

เผยแพร่แล้ว: 2015-05-26

เมื่อเราเริ่มพัฒนาระบบโลจิสติกส์สำหรับ Litmus Live (เดิมคือ Email Design Conference) ในปี 2015 การสนทนาเกี่ยวกับการทำให้อีเมลเปิดตัวของเราใหญ่ขึ้นและดีขึ้นกว่าปีที่แล้วก็เริ่มต้นขึ้น เราจะใช้เทคนิคพื้นหลังวิดีโอ HTML5 ในอีเมลได้อย่างไร โดยใช้เนื้อหาแบบไดนามิก: ฟีด Twitter สด

ใช่ ฟีด Twitter ในอีเมล

เป้าหมายของเรามีสองเท่า: สร้างความสนใจในการประชุมและใช้เทคนิคที่เป็นนวัตกรรมและสร้างแรงบันดาลใจในอีเมลเพื่อทำเช่นนั้น หลังจากการระดมความคิดหลายครั้ง เราตัดสินใจใช้แนวทางทั่วไปของเนื้อหาไดนามิก แต่กลับกลายเป็นว่า

tedc15-อีเมล

ดูอีเมลแบบเต็มในเบราว์เซอร์ →

คุณยังสามารถดูโค้ดแบบเต็มได้ที่นี่ และผลการทดสอบ Litmus ที่นี่ เพื่อดูว่ามันแสดงผลอย่างไรในไคลเอนต์อีเมลมากกว่า 40 รายการ

เนื้อหาแบบไดนามิกในอีเมล

เนื้อหาแบบไดนามิกในอีเมลไม่ใช่แนวคิดใหม่ อันที่จริง มักใช้เพื่อสร้างอีเมลที่ตรงเป้าหมายและเป็นส่วนตัว ในอดีต เนื้อหาแบบไดนามิกได้รับการดำเนินการอย่างเคร่งครัดผ่านการใช้ข้อความหรือรูปภาพ และดึงผ่านการผสานแท็กหรือตัวแปรผ่าน ESP รูปภาพไดนามิกเชื่อมโยงกับไฟล์ต้นฉบับไฟล์เดียว ซึ่งจะถูกเขียนทับแบบไดนามิกเพื่อแสดงภาพใหม่สำหรับสมาชิกบางส่วนตามพารามิเตอร์ส่วนบุคคลที่กำหนดไว้ล่วงหน้า ทั้งสองวิธีนี้ช่วยให้คุณสร้างประสบการณ์อีเมลที่ไม่ซ้ำใครและเป็นส่วนตัวสำหรับสมาชิกของคุณ

เราใช้ภาพไดนามิกในอีเมลเปิดตัวของเราเพื่อให้ฟีด Twitter แบบไดนามิกทำงานบนไคลเอนต์อีเมลยอดนิยมหลายตัว อย่างไรก็ตาม เรายังใช้วิธีการใหม่ล่าสุดเพื่อใช้งานเนื้อหาแบบไดนามิก: CSS แบบไดนามิก

แม้ว่า CSS ไดนามิกจะทำงานสำหรับไคลเอ็นต์ WebKit เราจำเป็นต้องใช้ทางเลือกที่เหมาะสมโดยใช้ภาพไดนามิกสำหรับสมาชิกของเราโดยใช้ไคลเอ็นต์ที่ไม่ใช่ WebKit ที่ถูกกล่าวว่าฟีด Twitter สดได้รับการสนับสนุน (ไม่ทางใดก็ทางหนึ่ง!) ในกล่องจดหมายต่อไปนี้:

  • AOL Mail
    ภาพไดนามิก
  • แอปเปิ้ลเมล
    CSS แบบไดนามิก
  • iOS (แอปอีเมลดั้งเดิม)
    CSS แบบไดนามิก
  • แนวโน้ม (2000-2013)
    ภาพไดนามิก
  • Outlook สำหรับ Mac (2011 และ 2016)
    CSS แบบไดนามิก
  • Outlook.com
    ภาพไดนามิก
  • ธันเดอร์เบิร์ด
    ภาพไดนามิก
  • Windows Phone
    ภาพไดนามิก
  • Windows Mail
    ภาพไดนามิก
  • Windows Live Mail
    ภาพไดนามิก
  • ยาฮู! จดหมาย
    ภาพไดนามิก

เนื้อหา CSS แบบไดนามิกสำหรับไคลเอนต์อีเมล WebKit

แม้ว่าเราจะสามารถใช้ภาพไดนามิกสำหรับไคลเอนต์อีเมลทั้งหมดได้ แต่เราเลือกใช้ CSS แบบไดนามิกสำหรับการปรับปรุงแบบก้าวหน้าในไคลเอนต์อีเมล WebKit เช่นไคลเอนต์อีเมลดั้งเดิมของ iPhone และ iPad เพื่อให้ฟีด Twitter ให้ความรู้สึกสมจริงยิ่งขึ้น

แล้วเราทำให้มันทำงานได้อย่างไร? การใช้ทวีตล่าสุดสิบห้ารายการที่มีแฮชแท็ก #TEDC15 เราแสดง 5 ทวีตแรกโดยค่าเริ่มต้น จากนั้นจึงทำให้ทวีตที่เหลือเคลื่อนไหวทีละรายการในช่วงเวลาหนึ่งนาที สิ่งนี้ทำให้เราสามารถทำให้สตรีมทวีตรู้สึกตามเวลาจริงและมีประโยชน์เพิ่มเติมในการทำให้ผู้คนมีส่วนร่วมได้นานขึ้น

แม้ว่าเราจะอัปเดตไฟล์ CSS ทุกๆ 10 วินาที แต่เนื้อหาจริงในอีเมลก็ไม่สามารถอัปเดตในลักษณะเดียวกันได้ แต่ต้องรีเฟรชเอกสารทั้งหมดจึงจะใช้งานได้ ผู้ใช้จำเป็นต้องเปิดอีเมลอีกครั้งหรือรีเฟรชเวอร์ชันเว็บเพื่อดูทวีตที่อัปเดต แม้ว่าจะไม่สมบูรณ์แบบ แต่ก็พิสูจน์แล้วว่ามีส่วนร่วมอย่างมาก!

เพื่อให้ฟีด Twitter ทำงานได้ เราใช้ HTML และ CSS ที่จะแสดงในไคลเอ็นต์ WebKit เท่านั้น เพื่อให้บรรลุสิ่งนี้ เราได้สร้าง <div> และ <span> ที่ว่างเปล่า และใช้คุณสมบัติ CSS ของเนื้อหาเพื่อเพิ่มเนื้อหาชื่อผู้ใช้ Twitter แฮนเดิล การประทับเวลา และการคัดลอกทวีต

นี่คือ HTML:

 <div class="tweet"> <div class="tweet-avatar-wrapper"> <div class="avatar"></div> </div> <div class="tweet-wrapper"> <span class="name"></span> <span class="handle"></span> <span class="timestamp"></span> <span class="copy"></span> </div> </div>

ในการเขียนทับ CSS แบบไดนามิก เราอาศัยสไตล์ชีตภายนอกที่อัปเดตทุก 10 วินาทีและรวมอยู่ในอีเมลของเราดังนี้:

 <link href="http://assets.insights.litmus.com/campaigns/tedc-2015/assets/tweets.css" type="text/css" rel="stylesheet" />

นี่คือ CSS ที่สอดคล้องกับข้อมูลทวีตในคุณสมบัติเนื้อหา:

 #tweet-1 .name::before { content: "Kevin Mandeville"; } #tweet-1 .handle::after { content: "@KevinMandeville"; } #tweet-1 .copy::before { content: "I'm excited for #TEDC15! Who's going?"; } #tweet-1 .timestamp::after { content: "1m"; }

CSS สำหรับทวีตถูกรวมไว้ในแบบสอบถามสื่อที่อนุญาตให้เราแสดงเฉพาะในไคลเอนต์อีเมลที่ใช้ WebKit เท่านั้น:

 @media screen and (-webkit-min-device-pixel-ratio: 0) { /* Insert CSS here */ }

โดยใช้ <div> ว่างสำหรับโครงสร้างเริ่มต้น เนื้อหาไม่ปรากฏขึ้นสำหรับไคลเอนต์อีเมลที่ไม่ใช่ WebKit จากนั้นเราก็ย้อนกลับไปที่รูปภาพของฟีด Twitter แบบไดนามิกสำหรับผู้ที่ไม่ใช่สมาชิก WebKit

ข้อเสียเพียงอย่างเดียวของการใช้การกำหนดเป้าหมาย WebKit และคุณสมบัติเนื้อหาคือไคลเอนต์อีเมลบางตัว เช่น Airmail และแอป Outlook iOS และ Android จะสนับสนุนการสืบค้นสื่อที่กำหนดเป้าหมาย WebKit แต่ไม่ใช่คุณสมบัติเนื้อหา ทำให้ทวีตล่องหน แต่เนื่องจากไคลเอนต์อีเมลเหล่านี้เป็นส่วนเล็กๆ ของผู้ฟังของเรา (น้อยกว่า 1%) นี่เป็นการเสียสละที่คุ้มค่า

ภาพไดนามิกสำหรับไคลเอนต์อีเมลที่ไม่ใช่ WebKit

สำหรับไคลเอนต์อีเมลที่ไม่ใช่ WebKit เราใช้วิธีดั้งเดิมในการแสดงรูปภาพไดนามิก เนื่องจากคุณสมบัติเนื้อหา CSS ไม่ได้รับการสนับสนุนอย่างดีในไคลเอนต์อีเมลนอก WebKit

ในอีเมล เราได้อ้างอิงภาพไดนามิกของฟีด Twitter:

 <img src="/uploads/article/137983/1JLxfeWJnz4EGtoE.jpg" width="600" height="902" border="0" class="webkit-hide" alt="tweet #TEDC15 to show up in the live feed!"/>
ทวีต #TEDC15 ให้แสดงในฟีดสด!

เราสร้างหน้าเว็บง่ายๆ ที่มีเพียงแค่ฟีด Twitter โดยใช้ HTML และ CSS เดียวกันจากอีเมล เราเพียงแค่จับภาพหน้าจอของฟีดในขนาดเดียวกัน 600×902 ผ่านยูทิลิตี้บรรทัดคำสั่ง wkhtmltoimage และอัปเดตรูปภาพเดียวกันนั้นแบบไดนามิกทุก 10 วินาที

เนื่องจากเราใช้ HTML และ CSS สำหรับมุมมอง WebKit เราจึงซ่อนรูปภาพใน WebKit เพื่อหลีกเลี่ยงฟีดที่ซ้ำกัน:

 @media screen and (-webkit-min-device-pixel-ratio: 0) { .webkit-hide { display: none; } }

ด้วยเทคนิคนี้ ฟีด Twitter แบบสดทำงานได้แม้กระทั่งกับลูกค้าที่มีปัญหามากที่สุด (ahem, Outlook) และอนุญาตให้สมาชิกส่วนใหญ่ของเราได้ร่วมสนุก!

ข้อเสียที่สำคัญเพียงอย่างเดียวของการนำอิมเมจไดนามิกนี้ไปใช้ก็คือ Gmail จะแคชอิมเมจไว้ ด้วยเหตุนี้ ผู้ใช้ Gmail จึงไม่ได้สัมผัสประสบการณ์ฟีด Twitter แบบสด แต่พวกเขาเห็นทวีตล่าสุดแปดรายการและข้อความพิเศษเพื่อดูเวอร์ชันเว็บของอีเมลเพื่อให้ได้ผลเต็มรูปแบบ:

gmail-twitter-feed

เราสร้างการบูรณาการ Twitter แบบไดนามิกได้อย่างไร

Kevin Thompson ผู้พัฒนาการตลาดของเรา เป็นผู้บงการเบื้องหลังการรวม Twitter ที่แท้จริง เขาสร้างแอปพลิเคชั่นที่เรียบง่ายมากซึ่งสร้างขึ้นบนเฟรมเวิร์กของ Sinatra และโฮสต์บน Heroku คุณสามารถตรวจสอบรหัสและลองใช้เองโดยทำตามคำแนะนำบน Github การทดสอบเบื้องต้นนี้พิสูจน์แล้วว่าสามารถสร้างทวีตใน CSS โหลดสไตล์ชีตภายนอกในไคลเอนต์อีเมลจำนวนหนึ่ง และไคลเอนต์เหล่านั้นสามารถดึง CSS ล่าสุดทุกครั้งที่เปิดอีเมล

จากนั้น แอปพลิเคชันก็เริ่มซับซ้อนขึ้นเล็กน้อย เนื่องจาก Twitter กำหนดขีดจำกัดจำนวนคำขอที่คุณทำกับ API เราจึงต้องแน่ใจว่าเราจะไม่เกินขีดจำกัด 150 คำขอต่อ 15 นาทีที่จัดสรรสำหรับคำค้นหา เพื่อแก้ไขปัญหานี้ เราได้เพิ่มกระบวนการที่สองในแอปพลิเคชัน Heroku ของเรา กระบวนการนี้ทำงานในพื้นหลัง ดึงทวีตทุก 10 วินาที และจัดเก็บไว้ในแคช ขั้นตอนการสมัครหลักจะโหลดทวีตจากแคชแทนการค้นหาโดยตรงผ่าน Twitter

เควินยังต้องคำนึงถึงความสามารถในการปรับขนาดและความเร็วด้วย ในขณะที่เรามีวิธีแก้ปัญหาเพื่อให้อยู่ภายในขีดจำกัด API ของ Twitter แต่เซิร์ฟเวอร์เดียวของเราน่าจะไม่สามารถดำเนินการตามจำนวนคำขอที่คาดไว้จากผู้รับอีเมลของเรากว่า 200,000 ราย เพื่อแก้ปัญหานี้ เราได้ติดตั้ง Amazon CloudFront CDN ซึ่งช่วยให้เรารองรับคำขอสินทรัพย์ของเราได้มากขึ้น และยังกระจายไปทั่วโลกเพื่อให้แน่ใจว่าไฟล์จะโหลดได้อย่างรวดเร็วสำหรับผู้ชมทั้งหมดของเรา ในแอปพลิเคชัน Sinatra ของเรา Kevin ยังเพิ่มส่วนหัว Cache-Control ซึ่งสั่งให้ CloudFront หมดอายุสินทรัพย์หลังจาก 10 วินาที สิ่งนี้บังคับให้ต้องขอเนื้อหาใหม่จากแอปพลิเคชันของเราบ่อยขึ้น

เพื่อรักษาผลลัพธ์ให้สดใหม่ที่สุดเท่าที่จะทำได้โดยไม่เกินขีดจำกัดอัตราของ API ของ Twitter เราจึงแสดงผลและแคช CSS แบบไดนามิกและไฟล์รูปภาพทุก 10 วินาทีด้วยผลลัพธ์การค้นหา Twitter ของเรา

ในการจัดการเนื้อหาของทวีต ทั้งคำค้นหาของ Twitter และเนื้อหา/ผู้ใช้ที่ถูกบล็อกถูกควบคุมโดยใช้ตัวแปรสภาพแวดล้อม แม้ว่าการเปลี่ยนแปลงตัวแปรสภาพแวดล้อมใน Heroku จะทำให้แอปพลิเคชันของเราจำเป็นต้องรีสตาร์ท เนื่องจากทรัพย์สินถูกแจกจ่ายผ่าน CDN และแอปพลิเคชันนั้นง่ายมาก การรีสตาร์ทใช้เวลาเพียงไม่กี่วินาทีเท่านั้น และจะไม่มีใครสังเกตเห็นเลย นอกจากนี้ เนื่องจาก Heroku มีอินเทอร์เฟซผู้ใช้สำหรับแก้ไขตัวแปรสภาพแวดล้อม ทีมการตลาดของเราจึงสามารถเปลี่ยนแปลงข้อความค้นหาและบล็อกเนื้อหาได้ตามความจำเป็น

หากวิธีการเหล่านี้ดูซับซ้อนเกินไปหรือใช้เวลานานสำหรับคุณ มีบริษัทบุคคลที่สาม เช่น Movable Ink, LiveClicker, PowerInbox และ Avari ที่เชี่ยวชาญด้านเนื้อหาแบบไดนามิกสำหรับอีเมล

กำลังกรองทวีตที่ไม่ดี

ข้อกังวลใหญ่สำหรับเราในขณะที่รวมฟีด Twitter แบบไดนามิกแบบสดคือการละทิ้งการควบคุมเนื้อหาของอีเมลของเรา ส่งผลให้ "ทวีตที่ไม่ดี" ปรากฏขึ้นในสตรีม บางคนบน Twitter ชี้ให้เห็นสิ่งนี้:

ในเวลาเดียวกัน เราต้องการให้ใกล้เคียงกับฟีดทวีตดิบๆ ที่ไม่ผ่านการกรองมากที่สุดเท่าที่จะเป็นไปได้เพื่อรักษาปัจจัย "ว้าว" สมมติฐานของเราคือทวีตที่ไม่ดีจะเป็นสถานการณ์จำลองและจะถูกล้างออกจากฟีดผ่านกิจกรรมอย่างต่อเนื่อง ดังนั้นเราจึงเริ่มใช้ตัวกรองการค้นหาของ Twitter เพื่อกำจัดเนื้อหาในอุดมคติออกไป

แต่เราต้องการให้มีตัวกรองเพิ่มเติม ดังนั้นเราจึงให้ความสามารถในการบล็อกชื่อผู้ใช้และสตริงข้อความเฉพาะหลังจากดึงผลลัพธ์จาก Twitter ในที่สุด เราตัดสินใจที่จะไม่อนุญาตรูปภาพทวีตในสตรีมเลย เพราะนั่นอาจกลายเป็นสิ่งที่ไม่เกะกะและเป็นอันตรายมากกว่าแค่ข้อความ นอกจากนี้ เป็นไปไม่ได้ที่จะแทรกลิงก์แบบไดนามิกผ่านคุณสมบัติ CSS ของเนื้อหา ดังนั้นจึงไม่มีลิงก์ในทวีตใดทำงานเช่นกัน โดยจะแสดงเป็นข้อความเพียงอย่างเดียว ทวีตทั้งหมดเชื่อมโยงโดยตรงกับสตรีมทวีต #TEDC15

เพื่อป้องกันความผิดพลาดขั้นสุดท้าย เรามีตัวเลือกในการปิดใช้งานผลการค้นหา Twitter แบบเรียลไทม์ทั้งหมด โดยย้อนกลับไปที่รายการทวีตที่ชื่นชอบที่กรองแล้วจากบัญชี Twitter @emaildesignconf ของเรา ในท้ายที่สุด มีเพียงทวีตที่ไม่ดีสองสามรายการที่ต้องลบออก และในตอนนี้ เราไม่จำเป็นต้องใช้ระบบป้องกันความผิดพลาดขั้นสุดท้ายในการเปลี่ยนไปใช้ทวีตโปรดเลย — สูงห้า #emailgeeks!

กุญแจ? ตรวจสอบให้แน่ใจว่าเราได้ทดสอบทุกอย่างตั้งแต่บนลงล่าง ตรวจสอบให้แน่ใจว่าการออกแบบของคุณดูดีในกล่องจดหมายที่สมาชิกของคุณใช้กับ Litmus

ทดสอบทุกอย่างจากบนลงล่าง

ดูตัวอย่างอีเมลในวัย 50+ และถอนหายใจด้วยความโล่งอกเมื่อพยายามทำอีเมลที่บ้าคลั่งที่สุด เช่น ฟีด Twitter แบบสด

ลองลิตมัสฟรี →

ปฏิกิริยาเชิงบวกอย่างท่วมท้น

ผู้ชมของเราชอบการใช้งานอีเมลที่สนุกและไม่เหมือนใครนี้อย่างแน่นอน มันทำให้อีเมลเป็นประสบการณ์แบบโต้ตอบและเป็นชุมชนที่ทุกคนสามารถมีส่วนร่วมได้ ปฏิกิริยาจาก Twitter นั้นประเมินค่าไม่ได้และเป็นไปตามธีมที่คล้ายกัน

บางคนถามว่ามีจริงไหม:

หลายคนจ้องมองไปที่มัน:

https://twitter.com/hannahsmeznik/status/601464682180816896

พวงกล่าวสวัสดีกับคนอื่น ๆ :

https://twitter.com/WebDevRich/status/601669735483363328

มีการกล่าวถึงเวทมนตร์ คาถา และแฮร์รี่ พอตเตอร์หลายประการ:

https://twitter.com/oompt/status/601495402962116611

การฆ่าคนโง่และเรื่องไร้สาระก็เกิดขึ้นเช่นกัน:

https://twitter.com/MrMoon123/status/601658129349214209

https://twitter.com/capitocapito/status/601458692161019904

เหนือสิ่งอื่นใด ผู้คนมากมายต่างพากันตะลึง:

https://twitter.com/adamrandazzo/status/601450740964466688

https://twitter.com/MattRoxo/status/601782360460251137

ดูประสิทธิภาพ

เราทึ่งกับผลลัพธ์ที่ได้จากแคมเปญนี้! การเปิดของเรามากกว่า 53% มาจากไคลเอนต์อีเมล WebKit ผู้ใช้จำนวนมากของเราจึงเห็นเวอร์ชันที่ได้รับการปรับปรุงอย่างค่อยเป็นค่อยไป โดยรวมแล้ว มีทวีตเกี่ยวกับ #TEDC15 มากกว่า 750 รายการใน 24 ชั่วโมงแรกหลังจากส่งอีเมล นอกจากนี้ อีเมลดังกล่าวยังช่วยดึงดูดผู้เยี่ยมชมใหม่กว่า 4,000 คนมายังเว็บไซต์ของเรา และสร้างผู้มีโอกาสเป็นลูกค้าใหม่กว่า 1,000 รายในระยะเวลาเท่ากัน! ไม่ต้องพูดถึง อีเมลนี้เห็นการมีส่วนร่วมที่ดีที่สุดที่เราเคยเห็นจากอีเมลใดๆ ที่เราเคยส่ง ผู้ใช้เกือบ 60% ดูอีเมลนานกว่า 18 วินาที!

สกรีนช็อต 2015-05-26 เวลา 15.48.42 น.

หากคุณมีคำถามใดๆ โปรดอย่าลังเลที่จะถามในความคิดเห็นด้านล่าง เข้าร่วมหัวข้อ Litmus Community ในหัวข้อ หรือทวีต @KevinMandeville และ @KevinThompson!

รับอีเมลที่ยอดเยี่ยม

อย่าพลาดอีเมลที่น่าเหลือเชื่อครั้งต่อไปของเรา ลงทะเบียนเพื่อรับข่าวสารและข้อมูลเกี่ยวกับทุกสิ่งที่เกิดขึ้นที่ Litmus