ইমেইল পাঠানো ও গ্রহণের(Request for Comments - RFCs) টেকনিক্যাল জটিলতা দেখলে চকিত হবেন। خوشবিরক্তি, অনেক টুল আছে যা SMTP সার্ভিস দেয় — নিজের Postfix সার্ভার থেকে SendGrid, Amazon SES, Postmark পর্যন্ত। কিন্তু প্রোভাইডার পরিবর্তন করলে অ্যাপ রিফ্যাক্টর করতে হয় প্রতিটি সার্ভিসেরพิচুতমত্বের জন্য।
Rails এখানে Action Mailbox দিয়ে সাহায্য করে। এই পোস্টে আমরা দেখব কীভাবে Action Mailbox ব্যবহার করে ইনবাউন্ড ইমেইল ইন্টিগ্রেট ও ট্রাবলশুট করা যায়।
Action Mailbox কী?
Action Mailbox Ruby on Rails-এ ইমেইল গ্রহণের জন্য conceptual compression ব্যবহার করে। Conceptual compression মানে এটি সব SMTP সার্ভিসের ছোটো ছোট পার্থক্য এনক্যাপসুলেট করে এবং আপনার ইনবাউন্ড প্রসেসিং কোড একবার লিখলেই চলে। নতুন সার্ভিসের জন্য প্রোভাইডার লিখাও যায়।
ActionMailbox-এর মূল কনসেপ্ট হলো ইমেইল রিসিপিয়েন্টের ভিত্তিতে রাউটিং। ইনবাউন্ড ইমেইল প্রোভাইডার সেটআপ করলে ডোমেনে আসা মেইল আপনার অ্যাপে রাউট হবে। রিসিপিয়েন্ট অ্যাড্রেস দেখে নির্ধারণ করা যায় প্রতিটি মেইল মেসেজ কীভাবে প্রসেস হবে।
Rails conductor action দিয়ে টেস্ট ইমেইল পাঠালে (যেমন আমি করেছি):
তবে ইনবাউন্ড ইমেইলে To, CC, BCC, এবং X-Original-To ফিল্ড থেকে রিসিপিয়েন্ট থাকবে। প্রতিটি অ্যাড্রেস টেস্ট হয় রাউটিং নির্ধারণের জন্য, কিন্তু মেইল মেসেজ শুধু একবার রাউট হয়।
ডেভেলপমেন্টে ইমেইল টেস্টিং
Rails-এ /rails/conductor/ রুটের অধীনে ডেভেলপমেন্ট পেজ আছে যা লোকালি ইমেইল ইনপুট করার সুবিধা দেয়। ম্যানুয়ালি ইমেইল এন্টার করতে পারেন বা পুরো হেডারসহ .eml ফাইল আপলোড করতে পারেন। Thunderbird-এ ইমেইল .eml হিসেবে সেভ করে টেক্সট এডিটরে খুলে কন্টেন্ট কপি করে কন্ডাক্টর পেজে পেস্ট করুন — কমপ্লেক্স ইমেইল প্রসেসিং টেস্ট করতে পারবেন।
পোস্টিং এবং কমেন্টিং ডেমো
৩৭সিগন্যালস এবং তাদের Hey World ব্লগিংয়ের বড় ফ্যান। কিন্তু তারা কমেন্ট অ্যালো করে না। তাই কমেন্টসহ একটি ক্লোন বানাই।
সেটআপ
$ rails new blog_app --css tailwind
$ rails g scaffold Post title:string content:rich_text
$ rails g scaffold Comment content:rich_text post:references
post.rb-এ অ্যাসোসিয়েশন যোগ করুন, posts/_post.html.erb-এ কমেন্টস পার্শিয়াল যোগ করুন।
ইনবাউন্ড ইমেইল সেটআপ পোস্ট করার জন্য
$ rails g mailbox Post
এটি ApplicationMailbox জেনারেট করবে। রুট সেটআপ করুন যাতে blog@ যেটা পাবে সেটা PostMailbox-এ যাবে এবং পোস্ট তৈরি করবে।
# app/mailboxes/application_mailbox.rb
routing /\Ablog@/i => :post
https://localhost:3000/rails/conductor/action_mailbox/inbound_emails-এ যেয়ে টেস্ট করুন। blog@whatever.com-এ পাঠালে ডেলিভার হবে, অন্য অ্যাড্রেসে বাউন্স হবে।
PostMailbox-এ ইমেইল রিসিভ করুন
প্রতিটি Mailbox-এ inbound_email এবং mail অবজেক্ট অ্যাক্সেস থাকে। আমাদের দরকার: কে পাঠিয়েছে, সাবজেক্ট, বডি কপি। এগুলো এক্সট্রাক্ট করে Post রেকর্ড তৈরি করুন।
# app/mailboxes/post_mailbox.rb
class PostMailbox < ApplicationMailbox
def process
Post.create!(
title: mail.subject,
content: mail.body.to_s,
user: User.find_by(email: mail.from.first)
)
end
end
আরেকটি ইমেইল পাঠিয়ে ইনডেক্স পেজ রিফ্রেশ করুন — পোস্ট দেখতে পাবেন!
পোস্টে কমেন্ট যোগ করুন
কমেন্টারকে সঠিক পোস্ট রেফার করতে হবে। সহজ পদ্ধতি: ইনবাউন্ড ইমেইল অ্যাড্রেসে পোস্ট ID এনকোড করুন (যেমন comment+123@whatever.com, যেখানে ১২৩ হল পোস্ট ID)।
$ rails g mailbox Comment
# app/mailboxes/application_mailbox.rb
routing /\Acomment\+(\d+)@/i => :comment
_post.html.erb-এ লিংক যোগ করুন যাতে ইমেইল অ্যাড্রেস জেনারেট হয়।
CommentMailbox-এ process মেথড ইমেইল বডি এবং সেন্ডারের ইমেইল দিয়ে কমেন্ট তৈরি করবে। post মেথড প্রথম রিসিপিয়েন্টের ইমেইল থেকে regex দিয়ে পোস্ট ID বের করবে। পোস্ট না পাওয়া গেলে বা টোকেন পার্স না হলে ইমেইল বাউন্স হবে।
Rails conductor ফর্ম থেকে প্রতিটি পোস্টের অ্যাড্রেসে কমেন্ট পাঠান — কমেন্ট পোস্টের নিচে দেখাবে!
কমপ্লেক্স উদাহরণ: HTML ইমেইল হ্যান্ডলিং
ইমেইল আসলে খুব কমপ্লেক্স। APM টুল সেটআপ করলে পারসিং এরর বা ভ بازار ফরম্যাটিং এরর দেখতে পাবেন। HTML ইমেইল রিসিভ করলে raw body source ওয়েবসাইটে পোস্ট হয়। mail gem দিয়ে চেক করা যায় ইনকামিং ইমেইলে HTML বডি আছে কিনা।
CommentMailbox এবং PostMailbox মডিফাই করে multipart ইমেইল চেক করুন এবং HTML পার্ট বের করুন, না থাকলে টেক্সট পার্ট, সেটাও না থাকলে বডি ব্যবহার করুন।
# PostMailbox - আরও কমপ্লেক্স
def process
content = if mail.html_part
mail.html_part.body.decoded
elsif mail.text_part
mail.text_part.body.decoded
else
mail.body.to_s
end
Post.create!(title: mail.subject, content: content, ...)
end
এখন ফোন থেকে আসা ইমেইলও হ্যান্ডেল করা যাবে।
Rails অ্যাপে Action Mailbox যোগ করুন
Action Mailbox-এর কারণে ইমেইল আমাদের Rails অ্যাপের আরেকটি I/O avenue হিসেবে বিবেচনা করা যায়। Conceptual compression ব্যবহার করে ইমেইল সার্ভিস প্রোভাইডার-স্বতন্ত্র কোড লিখা যায়। আমি মিনিমাল ওয়ার্কেই ইমেইল প্রোভাইডার পরিবর্তন করতে পারেছি।
APM টুল যেমন AppSignal ActionMailer-এর আউটগোইং ইমেইল মনিটর করার ড্যাশবোর্ড দেয়:
উপসংহার
এই পোস্টে Action Mailer-এর ক্ষমতা ডিফাইন করলাম, একটি ডেমো প্রজেক্টে ইনবাউন্ড ইমেইল ইন্টিগ্রেট করলাম এবং সেগুলো পার্স করে ব্লগ পোস্ট তৈরি করলাম। আশা করি উপকারী হবে। Happy coding!
P.S. Ruby Magic পোস্টগুলি প্রকাশ होते সাথে সাথে পেতে আমাদের Ruby Magic নিউজলেটার সাবস্ক্রাইব করুন!
John Beatty
আমাদের অতিথি লেখক John ২০১০ সালে iPhone অ্যাপের জন্য API বানাতে Rails শিখলেন, তার পর ওদিকে ফিরে দেখলেন না। বর্তমানে হাই স্কুলের ছাত্রদের প্রোগ্রামিং শিখান, স্কুলের জন্য কাস্টম সফটওয়্যার বানান, এবং ব্লগিং করেন।
John Beatty-এর সব আর্টিকেল