smartpush 1.4.0__py3-none-any.whl → 1.4.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,8 +5,11 @@ import requests
5
5
  from smartpush.utils import ListDictUtils
6
6
 
7
7
 
8
- def get_current_flow(host_domain, cookies, flow_id):
9
- # 提取flow所有节点数据
8
+ def get_current_flow(host_domain, cookies, flow_id, splits=None, **kwargs):
9
+ """# 提取flow所有节点数据
10
+ splits: list, 需断言时填写, 拆分节点走向,必须走到终点, 如: ["false", "true"],即走到拆分节点限制不满足分支再走满足分支
11
+ get_email_content: bool,是否提取邮件内容
12
+ """
10
13
  _url = host_domain + "/flow/getFlowDetail"
11
14
  headers = {
12
15
  "cookie": cookies
@@ -19,8 +22,11 @@ def get_current_flow(host_domain, cookies, flow_id):
19
22
  result = json.loads(requests.request(method="get", url=_url, headers=headers, params=params).text)
20
23
  # 按节点id存储
21
24
  node_counts = []
25
+ get_email_content = kwargs.get("get_email_content", False)
26
+ email_contents = []
22
27
 
23
- def process_node(node):
28
+ def process_node(node, split_num=-1):
29
+ split_num += 1
24
30
  node_counts.append({node["id"]: {"completedCount": node["data"]["completedCount"],
25
31
  "skippedCount": node["data"]["skippedCount"],
26
32
  "openUserCount": node["data"]["openUserCount"],
@@ -29,23 +35,29 @@ def get_current_flow(host_domain, cookies, flow_id):
29
35
  }
30
36
  }
31
37
  )
38
+ # 提取邮件内容
39
+ if get_email_content and node["type"] == "sendLetter":
40
+ email_contents.append({node["data"]["sendLetter"]["emailName"]: {
41
+ "receiveAddress": node["data"]["sendLetter"]["receiveAddress"],
42
+ "sender": node["data"]["sendLetter"]["sender"],
43
+ }})
32
44
  # 处理split节点
33
45
  if "split" in node["data"].keys():
34
- for branch_node in node['data']['split']['branches']["false"]:
35
- process_node(branch_node)
36
- for branch_node in node['data']['split']['branches']["true"]:
37
- process_node(branch_node)
38
- # 处理abTesting节点
39
- elif "abTesting" in node["data"].keys():
40
- for branch_node in node['data']['abTesting']['branches']["a"]:
41
- process_node(branch_node)
42
- for branch_node in node['data']['abTesting']['branches']["b"]:
43
- process_node(branch_node)
46
+ if splits is not None:
47
+ split_branch = node['data']['split']['branches'][splits[split_num]]
48
+ for branch_node in split_branch:
49
+ process_node(branch_node, split_num)
50
+ # # 处理abTesting节点
51
+ # elif "abTesting" in node["data"].keys():
52
+ # for branch_node in node['data']['abTesting']['branches']["a"]:
53
+ # process_node(branch_node)
54
+ # for branch_node in node['data']['abTesting']['branches']["b"]:
55
+ # process_node(branch_node)
44
56
 
45
57
  # 处理所有顶层节点
46
58
  for node in result['resultData']['nodes']:
47
- process_node(node)
48
- return node_counts, result["resultData"]["version"]
59
+ process_node(node=node)
60
+ return node_counts, result["resultData"]["version"], email_contents if get_email_content else None
49
61
 
50
62
 
51
63
  def update_flow(host_domain, cookies, **kwargs):
@@ -108,24 +120,27 @@ def check_flow(host_domain, cookies, mock_domain="", **kwargs):
108
120
  cookies:必填,sp登录态
109
121
  flow_id:必填
110
122
  pulsar:必填,模拟的触发数据
111
- old_flow_counts: 默认为all,需拆分步骤时填写,枚举:all、one、two;
123
+ split_steps: 默认为all,需拆分步骤时填写,枚举:all、one、two;
112
124
  one:获取旧节点数据和触发;
113
125
  two:获取触发后数据和断言节点数据
114
126
 
127
+ old_flow_counts: 拆分两步时步骤二必填,内容为步骤一的返回值
115
128
  limit:非必填,默认为1 - mock_pulsar函数用于控制模拟触发的次数
116
129
  sleep_time: 非必填, 默认60s, 等待时间,用于触发后等待各节点计数后获取新数据
117
130
  update_flow_params: 非必填,dict格式,需更新flow时传参,参数结构为sp的saveFlow接口内容
118
131
  num:非必填,默认为1 - compare_lists函数用于断言方法做差值计算
119
132
  all_key: 非必填,bool,默认false,输入true时,检查指标节点常用5个字段
120
133
  check_key: 非必填, 默认只有completedCount, list格式,传入需检查节点的指标key,如:completedCount、skippedCount、openRate等
134
+ split_node: list,有拆分节点时需填,结构:如: ["false", "true"],即走到拆分节点限制不满足分支再走满足分支
121
135
  """
122
136
  # todo: 还差邮件校验部分,后续补充
123
137
  is_split_steps = kwargs.get("split_steps", "all")
124
138
  # 步骤1 - 所需字段:split_steps、host_domain、cookies、flow_id、pulsar
125
139
  if is_split_steps == "one" or is_split_steps == "all":
126
140
  # 触发前提取flow数据,后续做对比
127
- old_flow_counts, old_versions = get_current_flow(host_domain=host_domain, cookies=cookies,
128
- flow_id=kwargs["flow_id"])
141
+ old_flow_counts, old_versions, _ = get_current_flow(host_domain=host_domain, cookies=cookies,
142
+ flow_id=kwargs["flow_id"],
143
+ splits=kwargs.get("split_node", None))
129
144
  kwargs["old_flow_counts"] = old_flow_counts
130
145
  # 更新flow
131
146
  if kwargs.get("update_flow_params", False):
@@ -143,11 +158,13 @@ def check_flow(host_domain, cookies, mock_domain="", **kwargs):
143
158
  if is_split_steps == "all":
144
159
  time.sleep(kwargs.get("sleep_time", 60))
145
160
  # 触发后提取flow数据,做断言
146
- new_flow_counts, new_versions = get_current_flow(host_domain=host_domain, cookies=cookies,
147
- flow_id=kwargs["flow_id"])
161
+ new_flow_counts, new_versions, email_contents = get_current_flow(host_domain=host_domain, cookies=cookies,
162
+ flow_id=kwargs["flow_id"],
163
+ splits=kwargs.get("split_node", None),
164
+ get_email_content=kwargs.get("get_email_content", False))
148
165
  # 断言
149
166
  result = ListDictUtils.compare_lists(temp1=kwargs.get("old_flow_counts"),
150
167
  temp2=new_flow_counts, num=kwargs.get("num", 1),
151
168
  check_key=kwargs.get("check_key", ["completedCount"]),
152
169
  all_key=kwargs.get("all_key", False))
153
- return [True, "断言成功"] if len(result) == 0 else [False, result]
170
+ return [True, "断言成功"] if len(result) == 0 else [False, result], email_contents
smartpush/test.py CHANGED
@@ -2,6 +2,8 @@
2
2
  # @Time :2025/2/20 00:27
3
3
  # @Author :luzebin
4
4
  import json
5
+ import re
6
+ import time
5
7
 
6
8
  import pandas as pd
7
9
 
@@ -41,10 +43,10 @@ if __name__ == '__main__':
41
43
  # errors = ExcelExportChecker.check_field_format(actual_oss=oss1, fileds={0: {5: "time"}}, skiprows=1)
42
44
  # ExcelExportChecker.check_excel_name(actual_oss=oss1, expected_oss=url)
43
45
 
44
- # flow触发流程
46
+ # flow触发流程 ------------------------------------------------------------------------------------------------------------------------
45
47
  _url = "http://sp-go-flow-test.inshopline.com"
46
48
  host_domain = "https://test.smartpushedm.com/api-em-ec2"
47
- cookies = "a_lang=zh-hans-cn; ecom_http_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDc3OTMyMzgsImp0aSI6ImU1YWY4ZGE5LTlhMTQtNGY0Yi04NmM5LTNlNzAwZTFjY2RiYyIsInVzZXJJbmZvIjp7ImlkIjowLCJ1c2VySWQiOiI0MjEzNzg1MjQ3IiwidXNlcm5hbWUiOiIiLCJlbWFpbCI6ImZlbGl4LnNoYW9Ac2hvcGxpbmVhcHAuY29tIiwidXNlclJvbGUiOiJvd25lciIsInBsYXRmb3JtVHlwZSI6Nywic3ViUGxhdGZvcm0iOjEsInBob25lIjoiIiwibGFuZ3VhZ2UiOiJ6aC1oYW5zLWNuIiwiYXV0aFR5cGUiOiIiLCJhdHRyaWJ1dGVzIjp7ImNvdW50cnlDb2RlIjoiQ04iLCJjdXJyZW5jeSI6IkpQWSIsImN1cnJlbmN5U3ltYm9sIjoiSlDCpSIsImRvbWFpbiI6InNtYXJ0cHVzaDQubXlzaG9wbGluZXN0Zy5jb20iLCJsYW5ndWFnZSI6ImVuIiwibWVyY2hhbnRFbWFpbCI6ImZlbGl4LnNoYW9Ac2hvcGxpbmUuY29tIiwibWVyY2hhbnROYW1lIjoiU21hcnRQdXNoNF9lYzJf6Ieq5Yqo5YyW5bqX6ZO6IiwicGhvbmUiOiIiLCJzY29wZUNoYW5nZWQiOnRydWUsInN0YWZmTGFuZ3VhZ2UiOiJ6aC1oYW5zLWNuIiwic3RhdHVzIjowLCJ0aW1lem9uZSI6IkFzaWEvTWFjYW8ifSwic3RvcmVJZCI6IjE2NDQzOTU5MjA0NDQiLCJoYW5kbGUiOiJzbWFydHB1c2g0IiwiZW52IjoiQ04iLCJzdGUiOiIiLCJ2ZXJpZnkiOiIifSwibG9naW5UaW1lIjoxNzQ1MjAxMjM4NjA0LCJzY29wZSI6WyJlbWFpbC1tYXJrZXQiLCJjb29raWUiLCJzbC1lY29tLWVtYWlsLW1hcmtldC1uZXctdGVzdCIsImVtYWlsLW1hcmtldC1uZXctZGV2LWZzIiwiYXBpLXVjLWVjMiIsImFwaS1zdS1lYzIiLCJhcGktZW0tZWMyIiwiZmxvdy1wbHVnaW4iLCJhcGktc3AtbWFya2V0LWVjMiJdLCJjbGllbnRfaWQiOiJlbWFpbC1tYXJrZXQifQ.NgpEGF_8BJgTOh1LNz_Is43JBd7uZhyTGQtQq8SOdsc; osudb_appid=SMARTPUSH; osudb_lang=; osudb_oar=#01#SID0000126BLmmyWXDjlSc59ljxo2axjoWExJ1oHkAkRqVtfzm4UUtWvBGvzF6FeTbrvTHmfJLrtJz+Dpthge0dIaJpI2ukTujazNNJbLjZFu9kkuOrtRAXNL02fNqpUb6MwTCNxOnm03YIlfb7X2482UvDm36; osudb_subappid=1; osudb_uid=4213785247; JSESSIONID=8DEE7103CFA4505DF68ECE629B00A0F3"
49
+ cookies = "_ga=GA1.1.88071637.1717860341; _ga_NE61JB8ZM6=GS1.1.1718954972.32.1.1718954972.0.0.0; _ga_Z8N3C69PPP=GS1.1.1723104149.2.0.1723104149.0.0.0; _ga_D2KXR23WN3=GS1.1.1735096783.3.1.1735096812.0.0.0; osudb_lang=; osudb_oar=#01#SID0000127BMP3Os96/37rp7Et7tYy+s7TyyN/AaKNkLtst/Ks9rPF/Co/OjyNJYL+Y4lPf+p9rzrSk9uJnxx4BFXI04BoU/fxhnvaMH2ac1DoeYo7Ll0eizFs+CGNscHjBENqjUacTEcDHSprmyG4TrNfYJkB; osudb_appid=SMARTPUSH; osudb_subappid=1; osudb_uid=4213785247; a_lang=zh-hant-tw; ecom_http_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDkyNjM1NzgsImp0aSI6IjIyYmQwNmE3LTVkYTItNDA4OS05NGViLThlNThlNzdhM2MyOSIsInVzZXJJbmZvIjp7ImlkIjowLCJ1c2VySWQiOiI0MjEzNzg1MjQ3IiwidXNlcm5hbWUiOiIiLCJlbWFpbCI6ImZlbGl4LnNoYW9Ac2hvcGxpbmVhcHAuY29tIiwidXNlclJvbGUiOiJvd25lciIsInBsYXRmb3JtVHlwZSI6Nywic3ViUGxhdGZvcm0iOjEsInBob25lIjoiIiwibGFuZ3VhZ2UiOiJ6aC1oYW50LXR3IiwiYXV0aFR5cGUiOiIiLCJhdHRyaWJ1dGVzIjp7ImNvdW50cnlDb2RlIjoiQ04iLCJjdXJyZW5jeSI6IkpQWSIsImN1cnJlbmN5U3ltYm9sIjoiSlDCpSIsImRvbWFpbiI6InNtYXJ0cHVzaDQubXlzaG9wbGluZXN0Zy5jb20iLCJsYW5ndWFnZSI6ImVuIiwibWVyY2hhbnRFbWFpbCI6ImZlbGl4LnNoYW9Ac2hvcGxpbmUuY29tIiwibWVyY2hhbnROYW1lIjoiU21hcnRQdXNoNF9lYzJf6Ieq5Yqo5YyW5bqX6ZO6IiwicGhvbmUiOiIiLCJzY29wZUNoYW5nZWQiOnRydWUsInN0YWZmTGFuZ3VhZ2UiOiJ6aC1oYW5zLWNuIiwic3RhdHVzIjowLCJ0aW1lem9uZSI6IkFzaWEvTWFjYW8ifSwic3RvcmVJZCI6IjE2NDQzOTU5MjA0NDQiLCJoYW5kbGUiOiJzbWFydHB1c2g0IiwiZW52IjoiQ04iLCJzdGUiOiIiLCJ2ZXJpZnkiOiIifSwibG9naW5UaW1lIjoxNzQ2NjcxNTc4OTU4LCJzY29wZSI6WyJlbWFpbC1tYXJrZXQiLCJjb29raWUiLCJzbC1lY29tLWVtYWlsLW1hcmtldC1uZXctdGVzdCIsImVtYWlsLW1hcmtldC1uZXctZGV2LWZzIiwiYXBpLXVjLWVjMiIsImFwaS1zdS1lYzIiLCJhcGktZW0tZWMyIiwiZmxvdy1wbHVnaW4iLCJhcGktc3AtbWFya2V0LWVjMiJdLCJjbGllbnRfaWQiOiJlbWFpbC1tYXJrZXQifQ.Ym_w8ftfdP3zxVXpK_ZlPbWRI-S3ie46_zMCVJZln_Y; JSESSIONID=00A6B90F793A7392A2398A80CA278359"
48
50
 
49
51
  params = {
50
52
  "abandonedOrderId": "c2c4a695a36373f56899b370d0f1b6f2",
@@ -140,17 +142,26 @@ if __name__ == '__main__':
140
142
  "clickDistinctUserRate": 0}, "id": "2503b475-ce3e-4906-ab04-0ebc387f0d7e"}],
141
143
  "showDataStartTime": 1745164800000, "showDataEndTime": 1745251199000}
142
144
  # mock_pulsar = MockFlow.check_flow(mock_domain=_url, host_domain=host_domain, cookies=cookies,
143
- # flow_id="FLOW6941975456855532553", pulsar=params,
144
- # update_flow_params=update_flow_params)
145
+ # flow_id="FLOW6966717528141252274", pulsar=params,
146
+ # split_node=["true"])
145
147
  # print(mock_pulsar)
146
148
 
147
- # mock_pulsar_step1, _ = MockFlow.check_flow(mock_domain=_url, host_domain=host_domain, cookies=cookies,
148
- # flow_id="FLOW6941975456855532553", pulsar=params,
149
- # update_flow_params=update_flow_params, split_steps="one")
150
- # mock_pulsar_step2 = MockFlow.check_flow(mock_domain=_url, host_domain=host_domain, cookies=cookies,
151
- # flow_id="FLOW6941975456855532553", old_flow_counts=mock_pulsar_step1,
152
- # print(mock_pulsar_step1)
153
- # print(mock_pulsar_step2)
149
+ # old_flow_counts, old_versions, email_contents = MockFlow.get_current_flow(host_domain=host_domain, cookies=cookies,
150
+ # flow_id="FLOW6966717528141252274",
151
+ # splits=["false", "false"], get_email_content=True)
152
+ # print(old_flow_counts, old_versions, email_contents)
153
+ mock_pulsar_step1, _ = MockFlow.check_flow(mock_domain=_url, host_domain=host_domain, cookies=cookies,
154
+ flow_id="FLOW6966717528141252274", pulsar=params,
155
+ split_steps="one", split_node=["true"])
156
+ # time.sleep(60)
157
+ mock_pulsar_step2, email_contents = MockFlow.check_flow(mock_domain=_url, host_domain=host_domain, cookies=cookies,
158
+ flow_id="FLOW6966717528141252274",
159
+ old_flow_counts=mock_pulsar_step1,
160
+ split_steps="two", split_node=["true"],
161
+ get_email_content=True)
162
+ print(mock_pulsar_step1)
163
+ print(mock_pulsar_step2)
164
+ print(email_contents)
154
165
 
155
166
  # split_steps="two")
156
167
  # # node_counts, versions = MockFlow.get_current_flow(host_domain=host_domain, cookies=cookies,
@@ -191,158 +202,6 @@ if __name__ == '__main__':
191
202
  'receiveAddress': 'autotest-smartpushpro5@smartpush.com',
192
203
  'sender': '1SmartPush_Pro5_ec2自动化店铺 AutoTestName',
193
204
  'subtitle': '营销测试邮件-2025-04-24 10:20:29.560357-😈'}}]
194
- result = EmailUtlis.check_email_content(emailProperty=email_property, loginEmail=loginEmail, password=password)
195
- print(result)
196
205
 
197
- ccc = {
198
- "id": "FLOW6966717528141252274",
199
- "version": "2",
200
- "triggerId": "c1001",
201
- "templateId": "",
202
- "showData": False,
203
- "flowChange": True,
204
- "nodes": [
205
- {
206
- "type": "trigger",
207
- "data": {
208
- "trigger": {
209
- "trigger": "c1001",
210
- "group": "",
211
- "suggestionGroupId": "",
212
- "triggerStock": False,
213
- "completedCount": 1,
214
- "skippedCount": 0
215
- },
216
- "completedCount": 1,
217
- "skippedCount": 0
218
- },
219
- "id": "049fd321-5a22-4f92-9692-a3da9507ee4b"
220
- },
221
- {
222
- "type": "delay",
223
- "data": {
224
- "delay": {
225
- "type": "relative",
226
- "relativeTime": 0,
227
- "relativeUnit": "MINUTES",
228
- "designatedTime": ""
229
- },
230
- "completedCount": 1
231
- },
232
- "id": "09ff19db-33a3-41d8-88e9-12e6017ddfd3"
233
- },
234
- {
235
- "type": "sendLetter",
236
- "data": {
237
- "sendLetter": {
238
- "id": 373090,
239
- "activityTemplateId": 373090,
240
- "activityName": "flowActivity_0aGnZ9",
241
- "activityImage": "http://cdn.smartpushedm.com/frontend/smart-push/staging/1644395920444/1745576879501/1745576881592_c412cc2e.jpeg",
242
- "emailName": "邮件发送",
243
- "merchantId": "1644395920444",
244
- "merchantName": "SmartPush4_ec2_自动化店铺",
245
- "brandName": "SmartPush4_ec2_自动化店铺 AutoTestName",
246
- "currency": "JP¥",
247
- "activityType": "NORMAL",
248
- "activityStatus": "ACTIVE",
249
- "createTime": 1745576857268,
250
- "updateTime": 1745576973175,
251
- "createDate": "2025-04-25 18:27:37",
252
- "updateDate": "2025-04-25 18:29:33",
253
- "pickContactPacks": [],
254
- "excludeContactPacks": [],
255
- "customerGroupIds": [],
256
- "excludeCustomerGroupIds": [],
257
- "schemaAnalysis": "{\"schema\":{\"Stage\":[\"a4a9fba2a\"],\"Header\":[\"84ba788da\"],\"Column\":[\"98d909a48\",\"8cab9aa48\",\"b3bcabad7\"],\"TextSet\":[\"8298cb99a\"],\"Section\":[\"84ba7bbda\"],\"Logo\":[\"b98abb998\",\"8a9b4bafa\"],\"Footer\":[\"b8bbabad9\"],\"Subscribe\":[\"b39b6a94a\"]}}",
258
- "pickContactInfos": [],
259
- "excludeContactInfos": [],
260
- "customerGroupInfos": [],
261
- "excludeCustomerGroupInfos": [],
262
- "sender": "SmartPush4_ec2_自动化店铺 AutoTestName",
263
- "senderDomain": "DEFAULT_DOMAIN",
264
- "domainType": 3,
265
- "receiveAddress": "autotest-smartpush4@smartpush.com",
266
- "originTemplate": 887,
267
- "collectTemplate": 0,
268
- "currentJsonSchema": "{\"id\":\"a4a9fba2a\",\"type\":\"Stage\",\"props\":{\"backgroundColor\":\"#EAEDF1\",\"width\":\"600px\",\"fullWidth\":\"normal-width\"},\"children\":[{\"id\":\"84ba788da\",\"type\":\"Header\",\"props\":{\"backgroundColor\":\"#ffffff\",\"borderLeft\":\"1px none #ffffff\",\"borderRight\":\"1px none #ffffff\",\"borderTop\":\"1px none #ffffff\",\"borderBottom\":\"1px none #ffffff\",\"paddingTop\":\"0px\",\"paddingBottom\":\"0px\",\"paddingLeft\":\"0px\",\"paddingRight\":\"0px\",\"cols\":[12]},\"children\":[{\"id\":\"98d909a48\",\"type\":\"Column\",\"props\":{},\"children\":[{\"id\":\"8298cb99a\",\"type\":\"TextSet\",\"props\":{\"list\":[{\"borderWidth\":\"1px\",\"borderStyle\":\"none\",\"content\":\"<p style=\\\"line-height: 3; text-align: right;\\\"><span style=\\\"color: #000000; font-size: 12px; font-family: arial, sans-serif;\\\"><a style=\\\"color: #000000;\\\" href=\\\"${viewInWebApiUrl}\\\">Can't see the email? Please <span style=\\\"color: #3598db;\\\">click here</span></a></span></p>\",\"paddingLeft\":\"10px\",\"paddingRight\":\"10px\",\"paddingTop\":\"0px\",\"paddingBottom\":\"0px\",\"borderColor\":\"#ffffff\"}],\"containerBackgroundColor\":\"transparent\",\"paddingLeft\":\"10px\",\"paddingRight\":\"10px\",\"paddingTop\":\"10px\",\"paddingBottom\":\"10px\"},\"children\":[]}]}]},{\"id\":\"84ba7bbda\",\"type\":\"Section\",\"props\":{\"backgroundColor\":\"#ffffff\",\"borderLeft\":\"1px none #ffffff\",\"borderRight\":\"1px none #ffffff\",\"borderTop\":\"1px none #ffffff\",\"borderBottom\":\"1px none #ffffff\",\"paddingTop\":\"0px\",\"paddingBottom\":\"0px\",\"paddingLeft\":\"0px\",\"paddingRight\":\"0px\",\"cols\":[12]},\"children\":[{\"id\":\"8cab9aa48\",\"type\":\"Column\",\"props\":{},\"children\":[{\"id\":\"b98abb998\",\"type\":\"Logo\",\"props\":{\"width\":120,\"height\":120,\"imgRatio\":1,\"src\":\"https://cdn.smartpushedm.com/frontend/smart-push/staging/1644395920444/1705904366610_253772e1.png?width=120&height=120\",\"href\":\"https://smartpush4.myshoplinestg.com\",\"align\":\"center\",\"containerBackgroundColor\":\"transparent\",\"paddingLeft\":\"20px\",\"paddingRight\":\"20px\",\"paddingTop\":\"20px\",\"paddingBottom\":\"20px\",\"paddingCondition\":true,\"segmentTypeConfig\":1},\"children\":[]},{\"id\":\"8a9b4bafa\",\"type\":\"Logo\",\"props\":{\"width\":120,\"height\":120,\"imgRatio\":1,\"src\":\"https://cdn.smartpushedm.com/frontend/smart-push/staging/1644395920444/1705904366610_253772e1.png?width=120&height=120\",\"href\":\"https://smartpush4.myshoplinestg.com\",\"align\":\"center\",\"containerBackgroundColor\":\"transparent\",\"paddingLeft\":\"20px\",\"paddingRight\":\"20px\",\"paddingTop\":\"20px\",\"paddingBottom\":\"20px\",\"paddingCondition\":true,\"segmentTypeConfig\":1},\"children\":[]}]}]},{\"id\":\"b8bbabad9\",\"type\":\"Footer\",\"props\":{\"backgroundColor\":\"#ffffff\",\"borderLeft\":\"1px none #ffffff\",\"borderRight\":\"1px none #ffffff\",\"borderTop\":\"1px none #ffffff\",\"borderBottom\":\"1px none #ffffff\",\"paddingTop\":\"0px\",\"paddingBottom\":\"0px\",\"paddingLeft\":\"0px\",\"paddingRight\":\"0px\",\"cols\":[12]},\"children\":[{\"id\":\"b3bcabad7\",\"type\":\"Column\",\"props\":{},\"children\":[{\"id\":\"b39b6a94a\",\"type\":\"Subscribe\",\"props\":{\"content\":\"<div class='sp-font-12'><p style=\\\"text-align: center; \\\" data-mce-style=\\\"text-align: center; \\\"><em><span class='sp-font-12' style=\\\"font-size: 12px; color: rgb(122, 132, 153);\\\" data-mce-style=\\\"font-size: 12px; color: #7a8499;\\\">Please add us to your email contacts list to receive exclusive recommendations!</span></em></p><p style=\\\"text-align: center; \\\" data-mce-style=\\\"text-align: center; \\\"><em><span class='sp-font-12' style=\\\"font-size: 12px; color: rgb(122, 132, 153);\\\" data-mce-style=\\\"font-size: 12px; color: #7a8499;\\\">You are receiving this message from [[shopName]] because you have signed up for subscriptions to receive information about products, services, and campaigns.</span></em></p></div><div class=\\\"sp-font-12\\\" style=\\\"color: rgb(122, 132, 153); font-family: arial, helvetica, sans-serif, Arial, Helvetica, sans-serif; font-size: 12px; text-align: center; margin-top: 12px;padding-left: 10px; padding-right: 10px; padding-bottom: 20px;\\\"><div>Questions? Please <span style=color:#479EEF;text-decoration:underline>contact us</span>, we are glad to help.</div><div>If you don't want to receive our message, just <span style=color:#479EEF;text-decoration:underline>click here</span> to cancel the subscription.</div></div><div class=\\\"sp-font-12\\\" style=\\\"color: rgb(122, 132, 153); font-size: 12px; text-align: center; font-style: oblique;\\\">Questions? Please <a href=[[customerEmail]] style=\\\"color:#479EEF;text-decoration:underline\\\" rel=\\\"noreferrer\\\">contact us</a>, we are glad to help.</div><div class=\\\"sp-font-12\\\" style=\\\"color: rgb(122, 132, 153); font-size: 12px; text-align: center; font-style: oblique;\\\">If you don't want to receive our message, just <a href=[[unsubscribe.url]] target=\\\"_blank\\\" style=\\\"color:#479EEF;text-decoration:underline\\\" rel=\\\"noreferrer\\\">click here</a> to cancel the subscription.</div>\",\"containerBackgroundColor\":\"transparent\"},\"children\":[]}]}]}],\"extend\":{\"version\":\"1.0.0\",\"updateTime\":\"2025-04-25T10:27:59.497Z\"}}",
269
- "currentHtml": "<!doctype html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\">\n <head>\n <title></title>\n <!--[if !mso]><!-->\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n <!--<![endif]-->\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <style type=\"text/css\">\n #outlook a { padding:0; }\n body { margin:0;padding:0;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%; }\n table, td { border-collapse:collapse;mso-table-lspace:0pt;mso-table-rspace:0pt; }\n img { border:0;line-height:100%; outline:none;text-decoration:none;-ms-interpolation-mode:bicubic; }\n pre{margin: 0;}p{ display: block;margin:0;}\n </style>\n <!--[if mso]>\n <noscript>\n <xml>\n <o:OfficeDocumentSettings>\n <o:AllowPNG/>\n <o:PixelsPerInch>96</o:PixelsPerInch>\n </o:OfficeDocumentSettings>\n </xml>\n </noscript>\n <![endif]-->\n <!--[if lte mso 11]>\n <style type=\"text/css\">\n .mj-outlook-group-fix { width:100% !important; }\n </style>\n <![endif]-->\n \n <!--[if !mso]><!-->\n <link href=\"https://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700\" rel=\"stylesheet\" type=\"text/css\">\n <style type=\"text/css\">\n @import url(https://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700);\n </style>\n <!--<![endif]-->\n\n \n \n <style type=\"text/css\">\n @media only screen and (min-width:480px) {\n .mj-column-per-100 { width:100% !important; max-width: 100%; }\n }\n </style>\n <style media=\"screen and (min-width:480px)\">\n .moz-text-html .mj-column-per-100 { width:100% !important; max-width: 100%; }\n </style>\n \n \n <style type=\"text/css\">\n \n \n </style>\n <style type=\"text/css\">\n @import url(https://fonts.googleapis.com/css?family=Arvo:400|Bodoni+Moda:400|DM+Sans:400|Poppins:400|Hammersmith+One:400|Libre+Baskerville:400|Lexend+Giga:400|Ubuntu:400|Montserrat:400|Nunito:400|News+Cycle:400|Roboto:400|Oswald:400);@import url(https://fonts.googleapis.com/css?family=Asar:400|Bruno+Ace:400|Cantata+One:400|League+Gothic:400|Long+Cang:400|Lovers+Quarrel:400|Nanum+Gothic+Coding:400|Nanum+Myeongjo:400|Noto+Sans+Kaithi:400|Noto+Sans+Kannada:400|Noto+Sans+Math:400|Noto+Sans+Syloti+Nagri:400|Noto+Serif+JP:400|Playwrite+AT+Guides:400|Saira+Extra+Condensed:400|Tsukimi+Rounded:400|Waiting+for+the+Sunrise:400);h1,\nh2,\nh3,\nh4,\nh5 {\n font-weight: bold;\n margin-bottom: 0;\n}\np {\n margin-top: 0;\n margin-bottom: 0;\n min-height: 1em;\n}\n\nul {\n margin-bottom: 0;\n}\n\nth {\n font-weight: bold;\n}\n\na {\n text-decoration: none;\n}\n\na::-webkit-scrollbar {\n -webkit-appearance: none;\n}\n\na::-webkit-scrollbar:horizontal {\n max-height: 8px;\n}\n\na::-webkit-scrollbar-thumb {\n border-radius: 8px;\n background-color: rgba(0, 0, 0, 0.5);\n}\n\nul,\nol,\ndl {\n margin-top: 16px !important;\n}\n\npre {\n word-break: break-word;\n padding: 0;\n margin: 0;\n white-space: inherit !important;\n}\n\npre p {\n word-break: break-word;\n padding: 0;\n margin: 0;\n color: #000000;\n}\n\nspan[style*='color'] a {\n color: inherit;\n}\n\n.mj-column-no-meida-100{\n width: 100% !important;\n}\n.mj-column-no-meida-50{\n width: 50% !important;\n}\n.mj-column-no-meida-33-333333333333336{\n width: 33.333333333333336% !important;\n}\n.mj-column-no-meida-25{\n width: 25% !important;\n}\n\n.white-nowrap {\n white-space: nowrap !important;\n}\n\n/* 间距 */\n.sp-m-p-0 {\n margin: 0;\n padding: 0;\n}\n\n.nps-content-span a {\n color: inherit !important;\n}.sp-font-12 {\n font-size: 12px !important;\n}\n\n.sp-font-14 {\n font-size: 14px !important;\n}\n\n.sp-font-16 {\n font-size: 16px !important;\n}\n\n.sp-font-18 {\n font-size: 18px !important;\n}\n\n.sp-font-20 {\n font-size: 20px !important;\n}\n\n.sp-font-22 {\n font-size: 22px !important;\n}\n\n.sp-font-24 {\n font-size: 24px !important;\n}\n\n.sp-font-26 {\n font-size: 26px !important;\n}\n\n.sp-font-28 {\n font-size: 28px !important;\n}\n\n.sp-font-30 {\n font-size: 30px !important;\n}\n\n.sp-font-32 {\n font-size: 32px !important;\n}\n\n.sp-font-34 {\n font-size: 34px !important;\n}\n\n.sp-font-36 {\n font-size: 36px !important;\n}\n\n.sp-font-38 {\n font-size: 38px !important;\n}\n\n.sp-font-40 {\n font-size: 40px !important;\n}\n\n.sp-font-42 {\n font-size: 42px !important;\n}\n\n.sp-font-44 {\n font-size: 44px !important;\n}\n\n.sp-font-46 {\n font-size: 46px !important;\n}\n\n.sp-font-48 {\n font-size: 48px !important;\n}\n\n.sp-font-50 {\n font-size: 50px !important;\n}\n\n.sp-font-52 {\n font-size: 52px !important;\n}\n\n.sp-font-54 {\n font-size: 54px !important;\n}\n\n.sp-font-56 {\n font-size: 56px !important;\n}\n\n.sp-font-58 {\n font-size: 58px !important;\n}\n\n.sp-font-60 {\n font-size: 60px !important;\n}\n\n.sp-image-icon {\n width: 50px;\n}\n\n@media only screen and (max-width:600px) {\n\n .sp-font-12 {\n font-size: 12px !important;\n }\n\n .sp-font-14 {\n font-size: 12px !important;\n }\n\n .sp-font-16 {\n font-size: 12px !important;\n }\n\n .sp-font-18 {\n font-size: 13px !important;\n }\n\n .sp-font-20 {\n font-size: 15px !important;\n }\n\n .sp-font-22 {\n font-size: 16px !important;\n }\n\n .sp-font-24 {\n font-size: 18px !important;\n }\n\n .sp-font-26 {\n font-size: 19px !important;\n }\n\n .sp-font-28 {\n font-size: 21px !important;\n }\n\n .sp-font-30 {\n font-size: 22px !important;\n }\n\n .sp-font-32 {\n font-size: 24px !important;\n }\n\n .sp-font-34 {\n font-size: 25px !important;\n }\n\n .sp-font-36 {\n font-size: 27px !important;\n }\n\n .sp-font-38 {\n font-size: 28px !important;\n }\n\n .sp-font-40 {\n font-size: 30px !important;\n }\n\n .sp-font-42 {\n font-size: 31px !important;\n }\n\n .sp-font-44 {\n font-size: 32px !important;\n }\n\n .sp-font-46 {\n font-size: 33px !important;\n }\n\n .sp-font-48 {\n font-size: 34px !important;\n }\n\n .sp-font-50 {\n font-size: 35px !important;\n }\n\n .sp-font-52 {\n font-size: 36px !important;\n }\n\n .sp-font-54 {\n font-size: 37px !important;\n }\n\n .sp-font-56 {\n font-size: 38px !important;\n }\n\n .sp-font-58 {\n font-size: 39px !important;\n }\n\n .sp-font-60 {\n font-size: 40px !important;\n }\n\n .sp-image-icon {\n width: 28px !important;\n }\n\n}@media only screen and (max-width:480px) {\n\n .sp-img-h-1-TwoVertical-11,\n .sp-img-h-1-TwoHorizontalColumns-11 {\n height: 170px !important;\n }\n\n .sp-img-h-1-TwoVertical-23,\n .sp-img-h-1-TwoHorizontalColumns-23 {\n height: 243px !important;\n }\n\n .sp-img-h-1-TwoVertical-34,\n .sp-img-h-1-TwoHorizontalColumns-34 {\n height: 227px !important;\n }\n\n .sp-img-h-1-TwoVertical-43,\n .sp-img-h-1-TwoHorizontalColumns-43 {\n height: 127px !important;\n }\n\n .sp-img-h-1-ThreeHorizontalColumns-11 {\n height: 109px !important;\n }\n\n .sp-img-h-1-ThreeHorizontalColumns-23 {\n height: 163px !important;\n }\n\n .sp-img-h-1-ThreeHorizontalColumns-34 {\n height: 145px !important;\n }\n\n .sp-img-h-1-ThreeHorizontalColumns-43 {\n height: 81px !important;\n }\n\n .sp-img-h-2-TwoVertical-11 {\n height: 164px !important;\n }\n\n .sp-img-h-2-TwoVertical-23 {\n height: 246px !important;\n }\n\n .sp-img-h-2-TwoVertical-34 {\n height: 218px !important;\n }\n\n .sp-img-h-2-TwoVertical-43 {\n height: 123px !important;\n }\n\n .sp-img-h-2-ThreeHorizontalColumns-11,\n .sp-img-h-2-TwoHorizontalColumns-11 {\n height: 76px !important;\n }\n\n .sp-img-h-2-ThreeHorizontalColumns-23,\n .sp-img-h-2-TwoHorizontalColumns-23 {\n height: 113px !important;\n }\n\n .sp-img-h-2-ThreeHorizontalColumns-34,\n .sp-img-h-2-TwoHorizontalColumns-34 {\n height: 101px !important;\n }\n\n .sp-img-h-2-ThreeHorizontalColumns-43,\n .sp-img-h-2-TwoHorizontalColumns-43 {\n height: 57px !important;\n }\n}@media only screen and (min-width: 320px) and (max-width: 599px) {\n .mj-w-50 {\n width: 50% !important;\n max-width: 50%;\n }\n}\n\n@media only screen and (max-width: 480px) {\n .shop-white-mobile {\n width: 100% !important;\n }\n .mj-td-force-100{\n display: inline-block;\n width: 100% !important;\n }\n\n .mj-ImageText-screen {\n width: 100% !important;\n }\n .mj-ImageText-img {\n margin: 0 auto;\n }\n\n .mj-ImageText-margin {\n margin: 0 !important;\n }\n\n .mj-ImageText-margin-zero {\n margin: 0 5px 0 0 !important;\n }\n\n .mj-ImageText-margin-one {\n margin: 0 0 0 5px !important;\n }\n .mj-column-per-50-force {\n width: 50% !important;\n max-width: 50%;\n }\n}\n\n@media only screen and (min-width: 480px) {\n .mj-imagetext-force-100{\n display: inline-block;\n width: 100% !important;\n }\n .mj-column-per-100 {\n width: 100% !important;\n max-width: 100%;\n }\n\n .mj-column-per-50 {\n width: 50% !important;\n max-width: 50%;\n }\n\n .mj-column-per-33-333333333333336 {\n width: 33.333333333333336% !important;\n max-width: 33.333333333333336%;\n }\n\n .mj-column-per-25 {\n width: 25% !important;\n max-width: 25%;\n }\n\n\n .mg-column-per-46-5 {\n width: 46.5% !important;\n max-width: 46.5%;\n }\n\n .mj-AbandonProduct-cloum-align-center {\n align-items: flex-start !important;\n }\n\n\n .mj-OrderInformation-padding-top-220 {\n padding-top: 20px !important;\n }\n\n .mj-OrderInformation-float-left {\n float: left !important;\n }\n}@media only screen and (max-width: 480px) {\n .mt-1{\n margin-top: 1px;\n }\n .mt-2{\n margin-top: 2px;\n }\n .mt-3{\n margin-top: 3px;\n }\n .mt-4{\n margin-top: 4px;\n }\n .mt-5{\n margin-top: 5px;\n }\n .mt-6{\n margin-top: 7px;\n }\n .mt-8{\n margin-top: 9px;\n }\n .mt-10{\n margin-top: 10px;\n }\n\n}\n </style>\n \n </head>\n <body style=\"word-spacing:normal;background-color:#EAEDF1;\">\n \n \n <div\n style=\"background-color:#EAEDF1;\"\n >\n <table className=\"pv-stage\">\n <tbody>\n <tr>\n <td style=\"display:table-column;\"><div style=\"width:1px; height:1px;\"><img style=\"width:1px; height:1px;\" width=\"1\" src=\"${SP_OPEN_EMAIL_URL}\" />\n </div></td>\n </tr>\n </tbody>\n </table><div mso-hide: all; position: fixed; height: 0; max-height: 0; overflow: hidden; font-size: 0; style=\"display:none;\">${emailSubtitle}</div>\n \n <!--[if mso | IE]><table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"\" role=\"presentation\" style=\"width:600px;\" width=\"600\" bgcolor=\"#ffffff\" ><tr><td style=\"line-height:0px;font-size:0px;mso-line-height-rule:exactly;\"><![endif]-->\n \n \n <div style=\"background:#ffffff;background-color:#ffffff;margin:0px auto;max-width:600px;\">\n \n <table\n align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"background:#ffffff;background-color:#ffffff;width:100%;\"\n >\n <tbody>\n <tr>\n <td\n style=\"border-bottom:1px none #ffffff;border-left:1px none #ffffff;border-right:1px none #ffffff;border-top:1px none #ffffff;direction:ltr;font-size:0px;padding:20px 0;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;text-align:center;\"\n >\n <!--[if mso | IE]><table role=\"presentation\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr><td class=\"\" style=\"vertical-align:top;width:598px;\" ><![endif]-->\n \n <div\n class=\"mj-column-per-100 mj-outlook-group-fix\" style=\"font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;\"\n >\n \n <table\n border=\"0\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"vertical-align:top;\" width=\"100%\"\n >\n <tbody>\n \n <tr>\n <td\n align=\"left\" style=\"font-size:0px;padding:10px 25px;padding-top:10px;padding-right:10px;padding-bottom:10px;padding-left:10px;word-break:break-word;\"\n >\n \n <table\n cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\" style=\"color:#000000;font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1.5;table-layout:fixed;width:100%;border:none;\"\n >\n <tr style=\"background-color:transparent;\"><td style=\"vertical-align:top;\" valign=\"top\"><table style=\"border-collapse: collapse;width:100%; table-layout: fixed;\"><tbody ><tr><td class=\"sp-font-16\" style=\"text-align:left;background-color:transparent;padding-left:10px;padding-right:10px;padding-top:0px;padding-bottom:0px;font-size:16px;border-style:none;border-color:#ffffff;border-width:1px;\"><pre class=\"mq_AS\" style=\"white-space: inherit;word-break: break-word;\"><p style=\"line-height: 3; text-align: right;\"><span style=\"color: #000000; font-size: 12px; font-family: arial, sans-serif;\"><a style=\"color: #000000;\" href=\"${viewInWebApiUrl}\">Can't see the email? Please <span style=\"color: #3598db;\">click here</span></a></span></p></pre></td></tr></tbody></table></td></tr>\n </table>\n \n </td>\n </tr>\n \n </tbody>\n </table>\n \n </div>\n \n <!--[if mso | IE]></td></tr></table><![endif]-->\n </td>\n </tr>\n </tbody>\n </table>\n \n </div>\n \n \n <!--[if mso | IE]></td></tr></table><table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"\" role=\"presentation\" style=\"width:600px;\" width=\"600\" bgcolor=\"#ffffff\" ><tr><td style=\"line-height:0px;font-size:0px;mso-line-height-rule:exactly;\"><![endif]-->\n \n \n <div style=\"background:#ffffff;background-color:#ffffff;margin:0px auto;max-width:600px;\">\n \n <table\n align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"background:#ffffff;background-color:#ffffff;width:100%;\"\n >\n <tbody>\n <tr>\n <td\n style=\"border-bottom:1px none #ffffff;border-left:1px none #ffffff;border-right:1px none #ffffff;border-top:1px none #ffffff;direction:ltr;font-size:0px;padding:20px 0;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;text-align:center;\"\n >\n <!--[if mso | IE]><table role=\"presentation\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr><td class=\"\" style=\"vertical-align:top;width:598px;\" ><![endif]-->\n \n <div\n class=\"mj-column-per-100 mj-outlook-group-fix\" style=\"font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;\"\n >\n \n <table\n border=\"0\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"vertical-align:top;\" width=\"100%\"\n >\n <tbody>\n \n <tr>\n <td\n align=\"left\" style=\"background:transparent;font-size:0px;padding:0;word-break:break-word;\"\n >\n \n <table\n cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\" style=\"color:#000000;font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:22px;table-layout:auto;width:100%;border:0;\"\n >\n <tr>\n <td align=\"center\">\n <table style=\"padding:0;margin:0;clear:both;\">\n <tbody style=\"padding:0;margin:0;clear:both;\">\n <tr style=\"padding:0;margin:0;clear:both;\">\n <td style=\"padding:0;margin:0;clear:both;width:120;padding-bottom:20px;padding-left:20px;padding-right:20px;padding-top:20px;\">\n <a href=\"https://smartpush4.myshoplinestg.com\" style=\"padding:0;margin:0;clear:both;\"><img src=\"https://cdn.smartpushedm.com/frontend/smart-push/staging/1644395920444/1705904366610_253772e1.png?width=120&height=120\" style=\"width:120px;max-width:100%;display:block;outline:none;text-decoration:none;height:auto;font-size:0px;object-fit:cover;\" width=\"120\" /></a>\n </td>\n </tr>\n </tbody>\n </table>\n </td>\n </tr>\n </table>\n \n </td>\n </tr>\n \n <tr>\n <td\n align=\"left\" style=\"background:transparent;font-size:0px;padding:0;word-break:break-word;\"\n >\n \n <table\n cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\" style=\"color:#000000;font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:22px;table-layout:auto;width:100%;border:0;\"\n >\n <tr>\n <td align=\"center\">\n <table style=\"padding:0;margin:0;clear:both;\">\n <tbody style=\"padding:0;margin:0;clear:both;\">\n <tr style=\"padding:0;margin:0;clear:both;\">\n <td style=\"padding:0;margin:0;clear:both;width:120;padding-bottom:20px;padding-left:20px;padding-right:20px;padding-top:20px;\">\n <a href=\"https://smartpush4.myshoplinestg.com\" style=\"padding:0;margin:0;clear:both;\"><img src=\"https://cdn.smartpushedm.com/frontend/smart-push/staging/1644395920444/1705904366610_253772e1.png?width=120&height=120\" style=\"width:120px;max-width:100%;display:block;outline:none;text-decoration:none;height:auto;font-size:0px;object-fit:cover;\" width=\"120\" /></a>\n </td>\n </tr>\n </tbody>\n </table>\n </td>\n </tr>\n </table>\n \n </td>\n </tr>\n \n </tbody>\n </table>\n \n </div>\n \n <!--[if mso | IE]></td></tr></table><![endif]-->\n </td>\n </tr>\n </tbody>\n </table>\n \n </div>\n \n \n <!--[if mso | IE]></td></tr></table><table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"\" role=\"presentation\" style=\"width:600px;\" width=\"600\" bgcolor=\"#ffffff\" ><tr><td style=\"line-height:0px;font-size:0px;mso-line-height-rule:exactly;\"><![endif]-->\n \n \n <div style=\"background:#ffffff;background-color:#ffffff;margin:0px auto;max-width:600px;\">\n \n <table\n align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"background:#ffffff;background-color:#ffffff;width:100%;\"\n >\n <tbody>\n <tr>\n <td\n style=\"border-bottom:1px none #ffffff;border-left:1px none #ffffff;border-right:1px none #ffffff;border-top:1px none #ffffff;direction:ltr;font-size:0px;padding:20px 0;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;text-align:center;\"\n >\n <!--[if mso | IE]><table role=\"presentation\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr><td class=\"\" style=\"vertical-align:top;width:598px;\" ><![endif]-->\n \n <div\n class=\"mj-column-per-100 mj-outlook-group-fix\" style=\"font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;\"\n >\n \n <table\n border=\"0\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"vertical-align:top;\" width=\"100%\"\n >\n <tbody>\n \n <tr>\n <td\n align=\"left\" style=\"font-size:0px;padding:0;word-break:break-word;\"\n >\n \n <table\n cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\" style=\"color:#000000;font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:22px;table-layout:fixed;width:100%;border:none;\"\n >\n <table style=\"margin:0;padding:0;width:100%;table-layout:fixed\" class=\"\" sp-id=\"subscribe-area-b39b6a94a\"><tbody><tr style=\"width:100%\"><td style=\"margin:0;padding:0;width:100%;text-align:center;padding-top:20px;padding-left:20px;padding-right:20px;padding-bottom:20px;background-color:transparent;font-family:arial,helvetica,sans-serif,Arial, Helvetica, sans-serif\" class=\"Subscribe\"><table cellPadding=\"0\" cellSpacing=\"0\" style=\"width:100%\"><tbody><tr><td align=\"center\" class=\"sp-font-16\" valign=\"middle\" style=\"padding-left:10px;padding-right:10px;padding-top:10px;text-align:left;font-size:16px\"><div><div class='sp-font-12'><p style=\"text-align: center; \" data-mce-style=\"text-align: center; \"><em><span class='sp-font-12' style=\"font-size: 12px; color: rgb(122, 132, 153);\" data-mce-style=\"font-size: 12px; color: #7a8499;\">Please add us to your email contacts list to receive exclusive recommendations!</span></em></p><p style=\"text-align: center; \" data-mce-style=\"text-align: center; \"><em><span class='sp-font-12' style=\"font-size: 12px; color: rgb(122, 132, 153);\" data-mce-style=\"font-size: 12px; color: #7a8499;\">You are receiving this message from [[shopName]] because you have signed up for subscriptions to receive information about products, services, and campaigns.</span></em></p></div><div class=\"sp-font-12\" style=\"color: rgb(122, 132, 153); font-family: arial, helvetica, sans-serif, Arial, Helvetica, sans-serif; font-size: 12px; text-align: center; margin-top: 12px;padding-left: 10px; padding-right: 10px; padding-bottom: 20px;\"><div>Questions? Please <span style=color:#479EEF;text-decoration:underline>contact us</span>, we are glad to help.</div><div>If you don't want to receive our message, just <span style=color:#479EEF;text-decoration:underline>click here</span> to cancel the subscription.</div></div><div class=\"sp-font-12\" style=\"color: rgb(122, 132, 153); font-size: 12px; text-align: center; font-style: oblique;\">Questions? Please <html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body><a href=\"mailto:[[customerEmail]]\" style=\"color:#479EEF;text-decoration:underline\" rel=\"noreferrer\">contact us</a></body></html>, we are glad to help.</div><div class=\"sp-font-12\" style=\"color: rgb(122, 132, 153); font-size: 12px; text-align: center; font-style: oblique;\">If you don't want to receive our message, just <html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body><a href=\"[[unsubscribe.url]]\" target=\"_blank\" style=\"color:#479EEF;text-decoration:underline\" rel=\"noreferrer\">click here</a></body></html> to cancel the subscription.</div></div></td></tr><tr><td align=\"center\" valign=\"middle\" height=\"20\" style=\"font-size:12px;font-family:arial,helvetica,sans-serif,Arial, Helvetica, sans-serif;padding-left:10px;padding-right:10px;padding-bottom:20px\"></td></tr><div><tr style=\"${hide_logo}\" sp-id=\"subscribe-dom-b39b6a94a\">\n <td class='sp-font-16' style=\"padding-left:20px;padding-right:20px;padding-top:20px;text-align:center;font-size:16px\" >\n <div style=\"border-top: 1px solid #EEF1F6\">\n <img src=\"https://cdn.smartpushedm.com/frontend/smart-push/product/image/1731577171577_83853d55.png\" style=\"padding: 10px;vertical-align: middle;width: 158px;\"alt=\"\" />\n </div>\n <p style=\"color:#343434;font-size:12px\">Providing content services for [[shopName]]</p>\n </td>\n </tr></div></tbody></table></td></tr></tbody></table>\n </table>\n \n </td>\n </tr>\n \n </tbody>\n </table>\n \n </div>\n \n <!--[if mso | IE]></td></tr></table><![endif]-->\n </td>\n </tr>\n </tbody>\n </table>\n \n </div>\n \n \n <!--[if mso | IE]></td></tr></table><![endif]-->\n \n \n </div>\n \n </body>\n</html>\n ",
270
- "previewJsonSchema": "{\"id\":\"a4a9fba2a\",\"type\":\"Stage\",\"props\":{\"backgroundColor\":\"#EAEDF1\",\"width\":\"600px\",\"fullWidth\":\"normal-width\"},\"children\":[{\"id\":\"84ba788da\",\"type\":\"Header\",\"props\":{\"backgroundColor\":\"#ffffff\",\"borderLeft\":\"1px none #ffffff\",\"borderRight\":\"1px none #ffffff\",\"borderTop\":\"1px none #ffffff\",\"borderBottom\":\"1px none #ffffff\",\"paddingTop\":\"0px\",\"paddingBottom\":\"0px\",\"paddingLeft\":\"0px\",\"paddingRight\":\"0px\",\"cols\":[12]},\"children\":[{\"id\":\"98d909a48\",\"type\":\"Column\",\"props\":{},\"children\":[{\"id\":\"8298cb99a\",\"type\":\"TextSet\",\"props\":{\"list\":[{\"borderWidth\":\"1px\",\"borderStyle\":\"none\",\"content\":\"<p style=\\\"line-height: 3; text-align: right;\\\"><span style=\\\"color: #000000; font-size: 12px; font-family: arial, sans-serif;\\\"><a style=\\\"color: #000000;\\\" href=\\\"${viewInWebApiUrl}\\\">Can't see the email? Please <span style=\\\"color: #3598db;\\\">click here</span></a></span></p>\",\"paddingLeft\":\"10px\",\"paddingRight\":\"10px\",\"paddingTop\":\"0px\",\"paddingBottom\":\"0px\",\"borderColor\":\"#ffffff\"}],\"containerBackgroundColor\":\"transparent\",\"paddingLeft\":\"10px\",\"paddingRight\":\"10px\",\"paddingTop\":\"10px\",\"paddingBottom\":\"10px\"},\"children\":[]}]}]},{\"id\":\"84ba7bbda\",\"type\":\"Section\",\"props\":{\"backgroundColor\":\"#ffffff\",\"borderLeft\":\"1px none #ffffff\",\"borderRight\":\"1px none #ffffff\",\"borderTop\":\"1px none #ffffff\",\"borderBottom\":\"1px none #ffffff\",\"paddingTop\":\"0px\",\"paddingBottom\":\"0px\",\"paddingLeft\":\"0px\",\"paddingRight\":\"0px\",\"cols\":[12]},\"children\":[{\"id\":\"8cab9aa48\",\"type\":\"Column\",\"props\":{},\"children\":[{\"id\":\"b98abb998\",\"type\":\"Logo\",\"props\":{\"width\":120,\"height\":120,\"imgRatio\":1,\"src\":\"https://cdn.smartpushedm.com/frontend/smart-push/staging/1644395920444/1705904366610_253772e1.png?width=120&height=120\",\"href\":\"https://smartpush4.myshoplinestg.com\",\"align\":\"center\",\"containerBackgroundColor\":\"transparent\",\"paddingLeft\":\"20px\",\"paddingRight\":\"20px\",\"paddingTop\":\"20px\",\"paddingBottom\":\"20px\",\"paddingCondition\":true,\"segmentTypeConfig\":1},\"children\":[]},{\"id\":\"8a9b4bafa\",\"type\":\"Logo\",\"props\":{\"width\":120,\"height\":120,\"imgRatio\":1,\"src\":\"https://cdn.smartpushedm.com/frontend/smart-push/staging/1644395920444/1705904366610_253772e1.png?width=120&height=120\",\"href\":\"https://smartpush4.myshoplinestg.com\",\"align\":\"center\",\"containerBackgroundColor\":\"transparent\",\"paddingLeft\":\"20px\",\"paddingRight\":\"20px\",\"paddingTop\":\"20px\",\"paddingBottom\":\"20px\",\"paddingCondition\":true,\"segmentTypeConfig\":1},\"children\":[]}]}]},{\"id\":\"b8bbabad9\",\"type\":\"Footer\",\"props\":{\"backgroundColor\":\"#ffffff\",\"borderLeft\":\"1px none #ffffff\",\"borderRight\":\"1px none #ffffff\",\"borderTop\":\"1px none #ffffff\",\"borderBottom\":\"1px none #ffffff\",\"paddingTop\":\"0px\",\"paddingBottom\":\"0px\",\"paddingLeft\":\"0px\",\"paddingRight\":\"0px\",\"cols\":[12]},\"children\":[{\"id\":\"b3bcabad7\",\"type\":\"Column\",\"props\":{},\"children\":[{\"id\":\"b39b6a94a\",\"type\":\"Subscribe\",\"props\":{\"content\":\"<div class='sp-font-12'><p style=\\\"text-align: center; \\\" data-mce-style=\\\"text-align: center; \\\"><em><span class='sp-font-12' style=\\\"font-size: 12px; color: rgb(122, 132, 153);\\\" data-mce-style=\\\"font-size: 12px; color: #7a8499;\\\">Please add us to your email contacts list to receive exclusive recommendations!</span></em></p><p style=\\\"text-align: center; \\\" data-mce-style=\\\"text-align: center; \\\"><em><span class='sp-font-12' style=\\\"font-size: 12px; color: rgb(122, 132, 153);\\\" data-mce-style=\\\"font-size: 12px; color: #7a8499;\\\">You are receiving this message from [[shopName]] because you have signed up for subscriptions to receive information about products, services, and campaigns.</span></em></p></div><div class=\\\"sp-font-12\\\" style=\\\"color: rgb(122, 132, 153); font-family: arial, helvetica, sans-serif, Arial, Helvetica, sans-serif; font-size: 12px; text-align: center; margin-top: 12px;padding-left: 10px; padding-right: 10px; padding-bottom: 20px;\\\"><div>Questions? Please <span style=color:#479EEF;text-decoration:underline>contact us</span>, we are glad to help.</div><div>If you don't want to receive our message, just <span style=color:#479EEF;text-decoration:underline>click here</span> to cancel the subscription.</div></div><div class=\\\"sp-font-12\\\" style=\\\"color: rgb(122, 132, 153); font-size: 12px; text-align: center; font-style: oblique;\\\">Questions? Please <a href=[[customerEmail]] style=\\\"color:#479EEF;text-decoration:underline\\\" rel=\\\"noreferrer\\\">contact us</a>, we are glad to help.</div><div class=\\\"sp-font-12\\\" style=\\\"color: rgb(122, 132, 153); font-size: 12px; text-align: center; font-style: oblique;\\\">If you don't want to receive our message, just <a href=[[unsubscribe.url]] target=\\\"_blank\\\" style=\\\"color:#479EEF;text-decoration:underline\\\" rel=\\\"noreferrer\\\">click here</a> to cancel the subscription.</div>\",\"containerBackgroundColor\":\"transparent\"},\"children\":[]}]}]}],\"extend\":{\"version\":\"1.0.0\",\"updateTime\":\"2025-04-25T10:27:59.497Z\"}}",
271
- "generatedHtml": False,
272
- "templateUrl": "https://cdn2.smartpushedm.com/material_ec2/2024-07-08/c316faf4623d4638893a127e150377f0/v2-545b3673f3db07397babfb71755ecee0_720w.png",
273
- "sendStrategy": "NOW",
274
- "totalReceiver": 0,
275
- "utmConfigEnable": False,
276
- "subtitle": "",
277
- "language": "en",
278
- "languageName": "English",
279
- "timezone": "Asia/Macao",
280
- "timezoneGmt": "GMT+08:00",
281
- "type": "FLOW",
282
- "relId": "FLOW6966717528141252274",
283
- "parentId": "0",
284
- "nodeId": "15630c25-75fa-4456-a6ee-a2bd1e3e64a1",
285
- "version": "2",
286
- "nodeOrder": 0,
287
- "sendType": "EMAIL",
288
- "productInfos": [],
289
- "blocks": [
290
- {
291
- "domId": "subscribe-dom-b39b6a94a",
292
- "blockId": "",
293
- "areaId": "",
294
- "type": "SP_LOGO",
295
- "column": 1,
296
- "fillStyle": 0,
297
- "ratio": "",
298
- "currencySymbolShow": 1,
299
- "thousandthSep": True,
300
- "decimalPoint": 2
301
- }
302
- ],
303
- "discountCodes": [],
304
- "reviews": [],
305
- "awards": [],
306
- "selectProducts": [],
307
- "createSource": "BUILD_ACTIVITY",
308
- "contentChange": True,
309
- "activityChange": False,
310
- "imageVersion": "1745576879501",
311
- "subActivityList": [],
312
- "warmupPack": 0,
313
- "boosterEnabled": False,
314
- "smartSending": True,
315
- "boosterCreated": False,
316
- "gmailPromotion": False,
317
- "sendTimeType": "FIXED",
318
- "sendTimezone": "B_TIMEZONE",
319
- "sendTimeDelay": False,
320
- "sendOption": 1,
321
- "hasUserBlock": False,
322
- "hasAutoBlock": False,
323
- "smsSendDelay": True,
324
- "payFunctionList": [],
325
- "minSendTime": "2025-04-25 18:27:37",
326
- "completedCount": 1,
327
- "skippedCount": 0,
328
- "openRate": 1,
329
- "clickRate": 0,
330
- "orderIncome": 0,
331
- "openDistinctUserRate": 1,
332
- "clickDistinctUserRate": 0
333
- },
334
- "completedCount": 1,
335
- "skippedCount": 0,
336
- "openRate": 1,
337
- "clickRate": 0,
338
- "orderIncome": 0,
339
- "openDistinctUserRate": 1,
340
- "clickDistinctUserRate": 0
341
- },
342
- "id": "15630c25-75fa-4456-a6ee-a2bd1e3e64a1"
343
- }
344
- ],
345
- "showDataStartTime": None,
346
- "showDataEndTime": None
347
- }
348
- # print(ccc)
206
+ # result = EmailUtlis.check_email_content(emailProperty=email_property, loginEmail=loginEmail, password=password)
207
+ # print(result)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: smartpush
3
- Version: 1.4.0
3
+ Version: 1.4.2
4
4
  Summary: 用于smartpush自动化测试工具包
5
- Author: 卢泽彬、邵宇飞、周彦龙
5
+ Author: lulu、felix、long
6
6
 
@@ -1,19 +1,19 @@
1
1
  smartpush/__init__.py,sha256=XJrl1vhGATHSeSVqKmPXxYqxyseriUpvY5tLIXir3EE,24
2
2
  smartpush/get_jira_info.py,sha256=Ej2JRlO_Kct6Koju57b27ySy_B4q43f0I2bFcS_fmaw,17801
3
- smartpush/test.py,sha256=vY8VQTNmI0QZM0FFKqUZGbmZMbNs-DFKtMP4GZsfhbY,76739
3
+ smartpush/test.py,sha256=loNW4VVi4kDOBIybCTjjYbROx-T5oIGFPRyVo7xxqRk,35699
4
4
  smartpush/export/__init__.py,sha256=D9GbWcmwnetEndFDty5XbVienFK1WjqV2yYcQp3CM84,99
5
5
  smartpush/export/basic/ExcelExportChecker.py,sha256=R_1gFy69vE2V5pY20zFsnhqWgJ42Vtf35zBtOPfhUpU,17590
6
6
  smartpush/export/basic/GetOssUrl.py,sha256=LeF1y1_uJaYXth1KvO6mEDS29ezb9tliBv5SrbqYkXc,6136
7
7
  smartpush/export/basic/ReadExcel.py,sha256=ZnG2mtYqLY-xuYx9SyulbdYUP_0E5jIeKDewfakAsTw,7342
8
8
  smartpush/export/basic/__init__.py,sha256=6tcrS-2NSlsJo-UwEsnGUmwCf7jgOsh_UEbM0FD-gYE,70
9
- smartpush/flow/MockFlow.py,sha256=9suuzEWMWAOGF1uHZMcriMEgB2DfFkEzZWMeb55ufyI,6630
9
+ smartpush/flow/MockFlow.py,sha256=lbGRhApso6wIeyBF-J65YAdckE3TXVuRn5Vo0dRmwl0,7960
10
10
  smartpush/flow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  smartpush/utils/DataTypeUtils.py,sha256=BC7ioztO3vAfKd1EOoNvXdVuXYY8qjNskV1DP7LhW-M,1082
12
12
  smartpush/utils/EmailUtlis.py,sha256=DAHd73bJ8hiJCLEXtD0xcwxPD7SOPSmBB7Jvlf6gN6s,11201
13
13
  smartpush/utils/ListDictUtils.py,sha256=qXxpMwWoyaXwOHhSNUt55HtFfwmqli-wZTWmiP9qhsI,1657
14
14
  smartpush/utils/StringUtils.py,sha256=n8mo9k0JQN63MReImgv-66JxmmymOGknR8pH2fkQrAo,4139
15
15
  smartpush/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- smartpush-1.4.0.dist-info/METADATA,sha256=_UiAcwcgV8JAr2gsP9E1oIWti0f8mw37VGN71mcNl6g,145
17
- smartpush-1.4.0.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
18
- smartpush-1.4.0.dist-info/top_level.txt,sha256=5_CXqu08EfbPaKLjuSAOAqCmGU6shiatwDU_ViBGCmg,10
19
- smartpush-1.4.0.dist-info/RECORD,,
16
+ smartpush-1.4.2.dist-info/METADATA,sha256=lMscyCht8TYWdOxjGbfLFuNqO5vMczvg0er6NbUwmzk,131
17
+ smartpush-1.4.2.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
18
+ smartpush-1.4.2.dist-info/top_level.txt,sha256=5_CXqu08EfbPaKLjuSAOAqCmGU6shiatwDU_ViBGCmg,10
19
+ smartpush-1.4.2.dist-info/RECORD,,