সম্পূর্ণ উদাহরণ

এই ডকুমেন্টে দেখানো হয়েছে কীভাবে Python-এ App Engine অ্যাপ তৈরি করতে হয় যা ব্যবহারকারীদের অ্যানোটেটেড ইমেল পাঠায় এবং তাদের ইনবক্স থেকে সরাসরি মেইলিং লিস্ট সাবস্ক্রিপশন কনফার্ম করতে বলে এবং Datastore-এ সাবস্ক্রিপশন সংগ্রহ করে।

পূর্বশর্ত ও প্রোজেক্ট সেট-আপ

এই নির্দেশিকায় ধরে নেওয়া হয়েছে যে আপনি আগেই App Engine SDK ইনস্টল করেছেন এবং কীভাবে App Engine প্রোজেক্ট তৈরি, রান ও প্রকাশ করতে হয় তা জানেন।

প্রথমে, আপনার প্রোজেক্টের জন্য একটি ডিরেক্টরি তৈরি করুন। আপনার অ্যাপ্লিকেশনের সব ফাইল এই ডিরেক্টরিতে রাখুন।

app.yaml নামের একটি ফাইলে নিম্নলিখিত কোডটি কপি করুন এবং আপনার অনন্য App Engine অ্যাপ আইডি দিয়ে {{ APPID }} প্লেসহোল্ডারটি পরিবর্তন করুন:

application: {{ APPID }}
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /.*
  script: main.app

libraries:
- name: jinja2
  version: latest

আপনার App Engine প্রোজেক্ট ফোল্ডারে main.py নামে একটি ফাইল তৈরি করুন এবং সাবস্ক্রিপশন সংগ্রহ ও তালিকাভুক্ত করা এবং অ্যানোটেটেড ইমেল পাঠানোর জন্য হ্যান্ডলার সেট-আপ করতে নিম্নলিখিত কোডটি কপি করুন:

import webapp2

from emailsender import EmailSender
from subscribe import SubscribeHandler

app = webapp2.WSGIApplication([('/', SubscribeHandler), ('/email', EmailSender)], debug=True)

ইমেলে স্ট্রাকচার্ড ডেটা যোগ করা

ব্যবহারকারীকে মেইলিং লিস্ট সাবস্ক্রিপশন কনফার্ম করতে বলে ইমেল লেখা শুরু করুন:

<html>
  <head>
    <title>Please confirm your subscription to Mailing-List XYZ?</title>
  </head>
  <body>
    <p>
      Dear John, please confirm that you wish to be subscribed to the
      mailing list XYZ
    </p>
  </body>
</html>

ইমেল মেসেজকে সংজ্ঞায়িত করতে এবং OneClickAction যোগ করতে, আপনি ইমেলের head এ কাজ করে এমন ফর্ম্যাটের (JSON-LD বা Microdata) মধ্যে একটিতে স্ট্রাকচার্ড ডেটা যোগ করতে পারেন। Gmail OneClickAction-এ কাজ করে এবং UI এলিমেন্ট দেখায় যা ব্যবহারকারীদের ইনবক্স থেকে সাবস্ক্রিপশন কনফার্ম করতে দেয়।

mail_template.html নামের ফাইলে নিম্নলিখিত মার্ক-আপ কপি করুন:

JSON-LD

<html>
  <head>
  <title>Please confirm your subscription to Mailing-List XYZ?</title>
  </head>
  <body>
    <script type="application/ld+json">
    {
      "@context": "http://schema.org",
      "@type": "EmailMessage",
      "potentialAction": {
        "@type": "ConfirmAction",
        "name": "Confirm Subscription",
        "handler": {
          "@type": "HttpActionHandler",
          "url": "{{ confirm_url }}",
          "method": "http://schema.org/HttpRequestMethod/POST"
        }
      },
      "description": "Confirm subscription to mailing list XYZ"
    }
    </script>
    <p>
      Dear John, please confirm that you wish to be subscribed to the mailing list XYZ.
    </p>
  </body>
</html>

মাইক্রোডেটা

<html>
  <head>
    <title>Please confirm your subscription to Mailing-List XYZ?</title>
  </head>
  <body>
    <div itemscope itemtype="http://schema.org/EmailMessage">
      <div itemprop="potentialAction" itemscope itemtype="http://schema.org/ConfirmAction">
        <meta itemprop="name" content="Confirm Subscription"/>
        <div itemprop="handler" itemscope itemtype="http://schema.org/HttpActionHandler">
          <meta itemprop="url" content="{{ confirm_url }}"/>
          <link itemprop="method" href="http://schema.org/HttpRequestMethod/POST"/>
        </div>
      </div>
      <meta itemprop="description" content="Confirm subscription to mailing list XYZ"/>
    </div>
    <p>
      Dear John, please confirm that you wish to be subscribed to the mailing list XYZ.
    </p>
  </body>
</html>

আগের স্ট্রাকচার্ড ডেটা "XYZ" নামের একটি মেইলিং তালিকা এবং একটি ConfirmAction বর্ণনা করে। অ্যাকশনের হ্যান্ডলার হল একটি HttpActionHandler যা url প্রপার্টিতে উল্লেখ করা URL-এ POST অনুরোধ পাঠায়।

গুরুত্বপূর্ণ: কোনও ইমেল পাঠানোর আগে, পূর্ববর্তী কোডে আপনার App Engine অ্যাপের URL (যেমন https://mailing-list.appspot.com) দিয়ে {{ confirm_url }} প্লেসহোল্ডারটি পাল্টে দিন। নিচের ধাপগুলিতে বর্ণিত কোড এই রিপ্লেসমেন্ট ম্যানেজ করে।

ব্যবহারকারীদের সাবস্ক্রিপশনের অনুরোধ পাঠানো

App Engine প্রোজেক্ট ফোল্ডারে emailsender.py নামের ফাইলে নিচের কোডটি কপি করুন:

import jinja2
import os
import webapp2

from google.appengine.api import mail
from google.appengine.api import users

from urlparse import urlparse

class EmailSender(webapp2.RequestHandler):

  def get(self):
    # require users to be logged in to send emails
    user = users.get_current_user()
    if not user:
      self.redirect(users.create_login_url(self.request.uri))
      return

    email = user.email()

    # The confirm url corresponds to the App Engine app url
    pr = urlparse(self.request.url)
    confirm_url = '%s://%s?user=%s' % (pr.scheme, pr.netloc, user.user_id())

    # load the email template and replace the placeholder with the confirm url
    jinja_environment = jinja2.Environment(
        loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))
    template = jinja_environment.get_template('mail_template.html')
    email_body = template.render({'confirm_url': confirm_url})

    message = mail.EmailMessage(
        sender = email,
        to = email,
        subject = 'Please confirm your subscription to Mailing-List XYZ',
        html = email_body)

    try:
      message.send()
      self.response.write('OK')
    except:
      self.error(500)

EmailSender ক্লাসে ব্যবহারকারীকে লগ-ইন করতে হয় যাতে তার ইমেল আইডি পাওয়া যায়। তারপরে, এটি mail_template.html থেকে ইমেলের বডি লোড করে, সেটিতে confirm_url প্লেসহোল্ডারটি App Engine অ্যাপের রুট URL (https://APP-ID.appspot.com) দিয়ে প্রতিস্থাপন করে এবং লগ-ইন করা ব্যবহারকারীকে ইমেল পাঠায়।

সাবস্ক্রিপশন সংগ্রহ ও তালিকাভুক্ত করা

App Engine প্রোজেক্ট ফোল্ডারে subscribe.py নামের ফাইলে নিচের কোডটি কপি করুন:

import webapp2

from emailsender import EmailSender
from google.appengine.ext import db


class SubscribeHandler(webapp2.RequestHandler):

  def post(self):
    user_id = self.request.get('user')

    # insert the subscription into the Datastore
    subscription = Subscription(user_id=user_id)
    subscription.put()

  def get(self):
    # retrieve up to 1000 subscriptions from the Datastore
    subscriptions = Subscription.all().fetch(1000)

    if not subscriptions:
      self.response.write('No subscriptions')
      return

    count = len(subscriptions)

    for s in subscriptions:
      self.response.write('%s subscribed<br/>' % (s.user_id))

    self.response.write('<br/>')
    self.response.write('%d subscriptions.' % (count))


class Subscription(db.Model):
    user_id = db.TextProperty(required=True)

SubscribeHandler ক্লাসটি অ্যাপের রুট URL-এ (https://APP-ID.appspot.com) পাঠানো POST ও GET, দুটি অনুরোধই হ্যান্ডেল করে। Gmail, POST অনুরোধ ব্যবহার করে নতুন সাবস্ক্রিপশন যোগ করে। এর মধ্যে user_id প্যারামিটার থাকে যা ব্যবহারকারীর সাথে সম্পর্কিত, যেমন নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

https://subscribe.appspot.com/?user_id=123abcd

অনুরোধ হ্যান্ডলার চেক করে দেখে যে প্রয়োজনীয় user_id সংজ্ঞায়িত করা হয়েছে কিনা এবং সাবস্ক্রিপশনটি ডেটা স্টোরে সেভ করে। এটি Gmail-এ একটি HTTP 200 রেসপন্স কোড পাঠায় যা অনুরোধটি সফল হয়েছে বলে সিগন্যাল দেয়। অনুরোধে প্রয়োজনীয় ফিল্ড না থাকলে, অনুরোধ হ্যান্ডলার HTTP 400 রেসপন্স কোড রিটার্ন করে, যা অবৈধ অনুরোধের ইঙ্গিত দেয়।

GET অ্যাপের মূল URL-এ করা অনুরোধে সংগ্রহ করা সাবস্ক্রিপশনের তালিকা দেখানো হয়। অনুরোধ হ্যান্ডলার Datastore থেকে সব সাবস্ক্রিপশন নিয়ে আসে এবং সেগুলিকে একটি কাউন্টারের সাথে পৃষ্ঠায় দেখায়।

অ্যাপটি পরীক্ষা করা

App Engine-এ আপনার অ্যাপ ডিপ্লয় করুন এবং নিজেকে অ্যানোটেট করা ইমেল পাঠাতে https://APP-ID.appspot.com/email (APP-ID-এর জায়গায় আপনার App Engine অ্যাপ আইডি লিখুন) লিঙ্কে যান।

Gmail-এ অ্যাকশন

আপনার অ্যাপ ডিপ্লয় করা ও সাবস্ক্রিপশন যোগ করার পরে, সাবস্ক্রিপশনের সারসংক্ষেপ দেখানো পৃষ্ঠা দেখতে https://APP-ID.appspot.com-এ যান।