日本語

操作手順: Python を使用してフィーチャがホスト フィーチャ サービスに追加された際にスケジュール設定された電子メール更新を生成する

概要

ホスト フィーチャ サービスをパブリックな Web アプリに追加できます。 これにより、ユーザーは編集機能を利用できます。 所有者は、新しいホスト フィーチャがホスト フィーチャ サービスに追加された際に、スケジュール設定された更新通知を受信することができます。 Python スクリプトを作成し、一定期間内のホスト フィーチャ サービスへの変更を確認し、所有者に電子メールを送信することができます。 smptlib モジュールを使用して自動的に電子メールを送信し、Gmail や Hotmail などの目的の Web メール プロバイダーの電子メール SMTP プロトコルにアクセスすることができます。

手順

以下は、新しいフィーチャがホスト フィーチャ サービスに追加された際に、新規作成された ObjectID を含む電子メールを自動的に生成および送信する手順です。

  1. 必要なライブラリをインポートします。
import urllib2, json, urllib, datetime, time, smtplib  
from datetime import timedelta
  1. 配列パラメーターを作成して ObjectID フィールドに ObjectID データを格納し、URL や一意の ID フィールドなどの必要な変数を指定します。
username = 'Username'  # ArcGIS Online ユーザー名
password = 'password'  # ArcGIS Online パスワード

URL = 'https://services.arcgis.com/[Folder]/arcgis/rest/services/[Feature Data]/FeatureServer/2/query'       # フィーチャ サービスの URL
uniqueID = 'OBJECTID'   # 確認するフィールド 
dateField = 'Date'      # 検索する日付フィールド
hoursValue = 1          # フィーチャが追加された際に確認する時間数

fromEmail = 'Sample@email.com' # 送信者の電子メール
toEmail = 'Sample@email.com'   # 受信者の電子メール 
#smtpServer = 'smtp.gis.com'   # SMPT サーバー名
#portNumber = 25               # SMTP サーバー ポート

# 一意の ID 用の空のリストを作成
oidList = []
  1. 指定した URL にアクセスするための ArcGIS Online トークンを生成します。
try:
    print('Generating Token')
    tokenURL = 'https://www.arcgis.com/sharing/rest/generateToken'
    params = {'f': 'pjson', 'username': username, 'password': password, 'referer': 'http://www.arcgis.com'}
    req = urllib2.Request(tokenURL, urllib.urlencode(params))
    response = urllib2.urlopen(req)
    data = json.load(response)
    token = data['token']
except:
    token = ''
  1. URL で示されたネットワーク オブジェクトを読み取り用に開くリクエストを作成します。
params = {'f': 'pjson', 'where': "1=1", 'outfields' : '*' , 'returnGeometry' : 'false', 'token' : token}
req = urllib2.Request(URL, urllib.urlencode(params))
response = urllib2.urlopen(req)
data = json.load(response)
  1. 一定期間内の編集または変更を検索するループ文を作成します。
for feat in data['features']:
    createDate = feat['attributes'][dateField]
    createDate = int(str(createDate)[0:-3])
    t = datetime.datetime.now() - timedelta(hours=hoursValue)
    t = time.mktime(t.timetuple())
    if createDate > t:
        oidList.append(feat['attributes'][uniqueID])
        print("Edited feature")
  1. 送信者と受信者の電子メール アドレスを含む電子メール テンプレートを作成します。
FROM = 'sender@hotmail.com'  
TO = ['receiver@yahoo.com']  
SUBJECT = 'New Feature Added'  
TEXT = "Features with OBJECTIDs " + str(oidList) + " were added."
  1. ステップ 6 で指定したパラメーターを文字列データとして取得します。
message = """\ 
From: %s 
To: %s 
Subject: %s 

%s 
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)
emailPassword = 'Password' 
  1. smtplib モジュールを使用して、電子メール アカウントの SMTP プロトコルを取得します。
注意:
一部の電子メール プロバイダー (Gmail など) では、アプリからの安全なアクセス ログインが必要です。 SMTP サーバーとの接続を正常に確立するには、安全性の低いアプリ アクセスを許可するオプションが必要です。 
if len(oidList) > 0:
    server = smtplib.SMTP_SSL('smtp.gmail.com')
    server.connect('smtp.gmail.com')
    server.ehlo()
    server.login(FROM, gmailPWD)
    server.sendmail(FROM, TO, message)
    print "Successfully sent email"
    server.close()
else:
 print "No new data found."

次のスクリプトは、最終的なコードを示しています。

import urllib2, json, urllib, datetime, time, smtplib
from datetime import timedelta

# 変数
username = 'Username'    
password = 'password'    

URL = 'https://services.arcgis.com/Wl7Y1m92PbjtJs5n/arcgis/rest/services/tem_data/FeatureServer/2/query'       # フィーチャ サービスの URL
uniqueID = 'OBJECTID'          
dateField = 'EditDate'      
hoursValue = 1              

fromEmail = 'test@gmail.com' 
toEmail = 'test@esri.com'   

oidList = []

try:
    print('Generating Token')
    tokenURL = 'https://www.arcgis.com/sharing/rest/generateToken'
    params = {'f': 'pjson', 'username': username, 'password': password, 'referer': 'http://www.arcgis.com'}
    req = urllib2.Request(tokenURL, urllib.urlencode(params))
    response = urllib2.urlopen(req)
    data = json.load(response)
    token = data['token']
except:
    token = ''

params = {'f': 'pjson', 'where': "1=1", 'outfields' : '*' , 'returnGeometry' : 'false', 'token' : token}
req = urllib2.Request(URL, urllib.urlencode(params))
response = urllib2.urlopen(req)
data = json.load(response)
for feat in data['features']:
    createDate = feat['attributes'][dateField]
    createDate = int(str(createDate)[0:-3])
    t = datetime.datetime.now() - timedelta(hours=hoursValue)
    t = time.mktime(t.timetuple())
    if createDate > t:
        oidList.append(feat['attributes'][uniqueID])
        print("Edited feature")

print(oidList)

FROM = fromEmail
TO = [toEmail]
SUBJECT = 'New Features Added'
TEXT = "Features with {0}s {1} were added.".format(uniqueID, oidList)

message = """\
From: %s
To: %s
Subject: %s

%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)
gmailPWD = 'password'

if len(oidList) > 0:
    server = smtplib.SMTP_SSL('smtp.gmail.com')
    server.connect('smtp.gmail.com')
    server.ehlo()
    server.login(FROM, gmailPWD)
    server.sendmail(FROM, TO, message)
    print "Successfully sent email"
    server.close()
else:
	print "No new data found."

関連情報