# Email API

import { Badge } from '@astrojs/starlight/components';

<Aside type="caution" title="/createEmailMessage เลิกใช้งานแล้ว">
การผสานรวมใหม่ควรใช้ [Messaging API v2](/th/developer/api-reference/messaging-api-v2/) — ส่ง `platforms: ["EMAIL"]` และบล็อก [`email_payload`](/th/developer/api-reference/messaging-api-v2/email-payload-reference/) ไปยัง `Notify` ดู [คู่มือการย้าย](/th/developer/api-reference/messaging-api-v2/migration-from-v1/#from-createemailmessage)
</Aside>

## createEmailMessage <Badge text="เลิกใช้งานแล้ว" variant="caution" size="small" />

สร้างข้อความอีเมล

`POST` `https://api.pushwoosh.com/json/1.3/createEmailMessage`

### พารามิเตอร์ของ Request body

| ชื่อ | ประเภท <div style="width:80px"></div> | จำเป็น | คำอธิบาย |
|------|--------|:--------:|-------------|
| auth | `string` | ใช่ | [API access token](/th/developer/api-reference/api-identifiers/#api-access-token) จาก Pushwoosh Control Panel |
| application | `string` | ใช่ | [รหัสแอปพลิเคชัน Pushwoosh](/th/developer/api-reference/api-identifiers/#application-code) |
| notifications | `array` | ใช่ | อาร์เรย์ JSON ที่มีรายละเอียดข้อความอีเมล ดูตาราง **พารามิเตอร์ Notifications** ด้านล่าง |

#### พารามิเตอร์ Notifications

| ชื่อ | ประเภท <div style="width:50px"></div> | จำเป็น | คำอธิบาย |
|------|------|:--------:|-------------|
| send_date | `string` | ใช่ | กำหนดเวลาที่จะส่งอีเมล รูปแบบ: `YYYY-MM-DD HH:mm` หรือ `"now"` |
| preset | `string` | ใช่ | [รหัส Email preset](/th/developer/api-reference/api-identifiers/#email-content-code) คัดลอกจากแถบ URL ของ **Email Content Editor** ใน Pushwoosh Control Panel |
| subject | `string` หรือ `object` | ไม่ | หัวเรื่องของอีเมล อีเมลจะอยู่ในภาษาของเนื้อหาเสมอ หาก `subject` ไม่มีภาษาที่ตรงกับ `content` หัวเรื่องจะว่างเปล่า |
| content | `string` หรือ `object` | ไม่ | เนื้อหาของอีเมล สามารถเป็นสตริงสำหรับเนื้อหา HTML ธรรมดาหรืออ็อบเจกต์สำหรับเวอร์ชันที่แปลเป็นภาษาท้องถิ่น |
| attachments | `array` | ไม่ | ไฟล์แนบอีเมล มีไฟล์แนบได้เพียงสองไฟล์ แต่ละไฟล์ต้องมีขนาดไม่เกิน 1MB (เข้ารหัสแบบ base64) |
| list_unsubscribe | `string` | ไม่ | อนุญาตให้ตั้งค่า URL ที่กำหนดเองสำหรับส่วนหัว "Link-Unsubscribe" |
| campaign | `string` | ไม่ | [รหัสแคมเปญ](/th/developer/api-reference/api-identifiers/#campaign-code) เพื่อเชื่อมโยงอีเมลกับแคมเปญที่ระบุ |
| ignore_user_timezone | `boolean` | ไม่ | หากเป็น `true` จะส่งอีเมลทันทีโดยไม่สนใจเขตเวลาของผู้ใช้ |
| timezone | `string` | ไม่ | ส่งอีเมลตามเขตเวลาของผู้ใช้ ตัวอย่าง: `"America/New_York"` |
| filter | `string` | ไม่ | ส่งอีเมลไปยังผู้ใช้ที่ตรงกับ [เงื่อนไขตัวกรองที่ระบุ](/th/developer/api-reference/api-identifiers/#segment--filter-name) |
| devices | `array` | ไม่ | รายชื่อที่อยู่อีเมล (สูงสุด 1000) เพื่อส่งอีเมลเป้าหมาย หากใช้ พารามิเตอร์นี้ ข้อความจะถูกส่งไปยังที่อยู่เหล่านี้เท่านั้น จะถูกละเว้นหากใช้ Application Group |
| use_auto_registration | `boolean` | ไม่ | หากเป็น `true` จะลงทะเบียนอีเมลจากพารามิเตอร์ `devices` โดยอัตโนมัติ |
| users | `array` | ไม่ | หากตั้งค่าไว้ ข้อความอีเมลจะถูกส่งไปยัง [User ID](/th/developer/api-reference/api-identifiers/#user-id) ที่ระบุเท่านั้น (ลงทะเบียนผ่านการเรียก /registerEmail) ไม่เกิน 1000 User ID ในอาร์เรย์ หากระบุพารามิเตอร์ "devices" พารามิเตอร์ "users" จะถูกละเว้น |
| dynamic_content_placeholders | `object` | ไม่ | ตัวยึดตำแหน่งสำหรับเนื้อหาแบบไดนามิกแทนค่าแท็กของอุปกรณ์ |
| conditions | `array` | ไม่ | เงื่อนไขการแบ่งกลุ่มโดยใช้แท็ก ตัวอย่าง: `[["Country", "EQ", "BR"]]` |
| from | `object` | ไม่ | ระบุชื่อผู้ส่งและอีเมลที่กำหนดเอง เพื่อแทนที่ค่าเริ่มต้นในคุณสมบัติของแอปพลิเคชัน |
| reply-to | `object` | ไม่ | ระบุอีเมลตอบกลับที่กำหนดเอง เพื่อแทนที่ค่าเริ่มต้นในคุณสมบัติของแอปพลิเคชัน |
| bcc | `array` | ไม่ | BCC (Blind Carbon Copy): อาร์เรย์ของที่อยู่อีเมลที่ได้รับสำเนาของอีเมลโดยที่ผู้รับคนอื่นไม่เห็น |
| email_type | `string` | ไม่ | ระบุประเภทอีเมล: `"marketing"` หรือ `"transactional"` หากไม่ระบุ ผู้ใช้ที่มี `PW_ControlGroup: true` จะไม่ได้รับข้อความ |
| email_category | `string` | จำเป็นเมื่อ `email_type` เป็น `"marketing"` | ระบุชื่อหมวดหมู่ที่กำหนดค่าไว้ใน [ศูนย์การตั้งค่าการสมัครรับข้อมูล](/th/product/messaging-channels/emails/email-preferences/) (เช่น Newsletter, Promotional, Product Updates) |
| transactionId | `string` | ไม่ | ตัวระบุข้อความที่ไม่ซ้ำกันเพื่อป้องกันการส่งซ้ำในกรณีที่เกิดปัญหาเครือข่าย จัดเก็บไว้ที่ฝั่ง Pushwoosh เป็นเวลา 5 นาที |
| capping\_days | `integer` | ไม่ | จำนวนวัน (สูงสุด 30) ที่จะใช้การจำกัดความถี่ต่ออุปกรณ์ **หมายเหตุ:** ตรวจสอบให้แน่ใจว่าได้กำหนดค่า [Global frequency capping](/th/product/messaging-channels/global-frequency-capping/) ใน Control Panel แล้ว |
| capping\_count | `integer` | ไม่ | จำนวนอีเมลสูงสุดที่สามารถส่งจากแอปที่ระบุไปยังอุปกรณ์หนึ่งๆ ภายในระยะเวลา `capping_days` ในกรณีที่ข้อความที่สร้างขึ้นเกินขีดจำกัด `capping_count` สำหรับอุปกรณ์ ข้อความนั้นจะไม่ถูกส่งไปยังอุปกรณ์นั้น |
| capping\_exclude | `boolean` | ไม่ | หากตั้งค่าเป็น `true` อีเมลนี้จะไม่ถูกนับรวมในการจำกัดความถี่สำหรับอีเมลในอนาคต |
| capping\_avoid | `boolean` | ไม่ | หากตั้งค่าเป็น `true` การจำกัดความถี่จะไม่ถูกนำไปใช้กับอีเมลนี้โดยเฉพาะ |
| send\_rate | `integer` | ไม่ | จำกัดจำนวนข้อความที่สามารถส่งได้ต่อวินาทีสำหรับผู้ใช้ทั้งหมด ช่วยป้องกันการโอเวอร์โหลดของแบ็กเอนด์ในระหว่างการส่งปริมาณมาก |
| send\_rate\_avoid | `boolean` | ไม่ | หากตั้งค่าเป็น true ขีดจำกัดการควบคุมปริมาณจะไม่ถูกนำไปใช้กับอีเมลนี้โดยเฉพาะ |
### ตัวอย่างคำขอ
```json 
{
  "request": {
    "auth": "API_ACCESS_TOKEN",         // จำเป็น โทเค็นการเข้าถึง API จาก Pushwoosh Control Panel
    "application": "APPLICATION_CODE",  // จำเป็น รหัสแอปพลิเคชัน Pushwoosh
    "notifications": [{
      "send_date": "now",               // จำเป็น YYYY-MM-DD HH:mm หรือ 'now'
      "preset": "ERXXX-32XXX",          // จำเป็น คัดลอกรหัส Email preset จากแถบ URL ของ
                                        //           หน้า Email Content editor ใน Pushwoosh Control Panel
      "subject": {                      // ไม่จำเป็น หัวเรื่องข้อความอีเมล
        "de": "subject de",
        "en": "subject en"
      },
      "content": {                      // ไม่จำเป็น เนื้อหาของอีเมล
        "de": "<html><body>de Hello, moto</body></html>",
        "default": "<html><body>default Hello, moto</body></html>"
      },
      "attachments": [{                 // ไม่จำเป็น ไฟล์แนบอีเมล
        "name": "image.png",            //           "name" - ชื่อไฟล์
        "content": "iVBANA...AFTkuQmwC" //           "content" - เนื้อหาของไฟล์ที่เข้ารหัสแบบ base64
      }, {
        "name": "file.pdf",
        "content": "JVBERi...AFTarEGC"
      }],
      "list_unsubscribe": "URL",        // ไม่จำเป็น อนุญาตให้ตั้งค่า URL ที่กำหนดเองสำหรับส่วนหัว "Link-Unsubscribe"
      "campaign": "CAMPAIGN_CODE",      // ไม่จำเป็น หากต้องการกำหนดข้อความอีเมลนี้ให้กับแคมเปญใดแคมเปญหนึ่ง
                                        //           ให้เพิ่มรหัสแคมเปญที่นี่
      "ignore_user_timezone": true,     // ไม่จำเป็น
      "timezone": "America/New_York",   // ไม่จำเป็น ระบุเพื่อส่งข้อความตาม
                                        //           เขตเวลาที่ตั้งค่าไว้บนอุปกรณ์ของผู้ใช้
      "filter": "FILTER_NAME",          // ไม่จำเป็น ส่งข้อความไปยังผู้ใช้ที่ตรงตามเงื่อนไขตัวกรอง
      "devices": [                      // ไม่จำเป็น ระบุที่อยู่อีเมลเพื่อส่งข้อความอีเมลเป้าหมาย
        "email_address1",               //           ไม่เกิน 1000 ที่อยู่ในอาร์เรย์
        "email_address2"                //           หากตั้งค่าไว้ ข้อความจะถูกส่งไปยังที่อยู่ในรายการเท่านั้น
      ],                                //           จะถูกละเว้นหากใช้ Application Group
      "use_auto_registration": true,    // ไม่จำเป็น ลงทะเบียนอีเมลที่ระบุในพารามิเตอร์ "devices" โดยอัตโนมัติ
      "users": [                        // ไม่จำเป็น หากตั้งค่าไว้ ข้อความอีเมลจะถูกส่งไปยัง
        "userId1",                      //           User ID ที่ระบุเท่านั้น (ลงทะเบียนผ่านการเรียก /registerEmail)
        "userId2"                       //           ไม่เกิน 1000 User ID ในอาร์เรย์
      ],                                //           หากระบุพารามิเตอร์ "devices"
                                        //           พารามิเตอร์ "users" จะถูกละเว้น
      "dynamic_content_placeholders": { // ไม่จำเป็น ตัวยึดตำแหน่งสำหรับเนื้อหาแบบไดนามิกแทนค่าแท็กของอุปกรณ์
        "firstname": "John",
        "firstname_en": "John"
      }, 
      "conditions": [                   // ไม่จำเป็น เงื่อนไขการแบ่งกลุ่ม ดูหมายเหตุด้านล่าง
        ["Country", "EQ", "BR"],
        ["Language", "EQ", "pt"]
      ], 
      "from": {                         // ไม่จำเป็น ระบุชื่อผู้ส่งและที่อยู่อีเมลผู้ส่ง
        "name": "alias from",           //           เพื่อแทนที่ "From name" และ "From email" เริ่มต้น
        "email": "from-email@email.com" //           ที่ตั้งค่าไว้ในคุณสมบัติของแอปพลิเคชัน
      },
      "reply-to": {                     // ไม่จำเป็น ระบุที่อยู่อีเมลเพื่อแทนที่
        "name": "alias reply to ",      //           "Reply to" เริ่มต้นที่ตั้งค่าไว้ในคุณสมบัติของแอปพลิเคชัน
        "email": "reply-to@email.com"
      },
      "bcc": [                          // ไม่จำเป็น BCC: อาร์เรย์ของที่อยู่อีเมลที่ได้รับสำเนาโดยที่ผู้รับคนอื่นไม่เห็น
        "bcc1@example.com",
        "bcc2@example.com"
      ],
      "email_type": "marketing",        // ไม่จำเป็น "marketing" หรือ "transactional"
                                        // หากไม่ระบุ ผู้ใช้ที่มี PW_ControlGroup: true จะไม่ได้รับข้อความ
      "email_category": "category name",// จำเป็นเมื่อ email_type เป็น "marketing" ชื่อหมวดหมู่
      "transactionId": "unique UUID",   // ไม่จำเป็น ตัวระบุข้อความที่ไม่ซ้ำกันเพื่อป้องกันการส่งซ้ำ
                                        //           ในกรณีที่เกิดปัญหาเครือข่าย จัดเก็บไว้ที่ฝั่ง
                                        //           ของ Pushwoosh เป็นเวลา 5 นาที
      // พารามิเตอร์การจำกัดความถี่ ตรวจสอบให้แน่ใจว่าได้กำหนดค่า Global frequency capping ใน Control Panel แล้ว
      // การจำกัดความถี่ไม่มีผลกับข้อความธุรกรรม
      // ในกรณีอื่นๆ ทั้งหมด รวมถึงการละเว้น "email_type" การจำกัดความถี่จะมีผล
      "capping_days": 30,               // ไม่จำเป็น จำนวนวันสำหรับการจำกัดความถี่ (สูงสุด 30 วัน)
      "capping_count": 10,              // ไม่จำเป็น จำนวนอีเมลสูงสุดที่สามารถส่งจาก
                                        //           แอปที่ระบุไปยังอุปกรณ์หนึ่งๆ ภายในระยะเวลา 'capping_days'
                                        //           ในกรณีที่ข้อความที่สร้างขึ้นเกินขีดจำกัด
                                        //           'capping_count' สำหรับอุปกรณ์ ข้อความนั้นจะไม่
                                        //           ถูกส่งไปยังอุปกรณ์นั้น
      "capping_exclude": true,          // ไม่จำเป็น หากตั้งค่าเป็น true อีเมลนี้จะไม่
                                        //           ถูกนับรวมในการจำกัดความถี่สำหรับอีเมลในอนาคต
      "capping_avoid": true,            // ไม่จำเป็น หากตั้งค่าเป็น true การจำกัดความถี่จะไม่ถูกนำไปใช้กับ
                                        //           อีเมลนี้โดยเฉพาะ
      "send_rate": 100,                 // ไม่จำเป็น ขีดจำกัดการควบคุมปริมาณ
                                        //           จำกัดจำนวนข้อความที่สามารถส่งได้ต่อวินาทีสำหรับผู้ใช้ทั้งหมด
                                        //           ช่วยป้องกันการโอเวอร์โหลดของแบ็กเอนด์ในระหว่างการส่งปริมาณมาก
      "send_rate_avoid": true,          // ไม่จำเป็น หากตั้งค่าเป็น true ขีดจำกัดการควบคุมปริมาณจะไม่ถูกนำไปใช้กับ
                                        //           อีเมลนี้โดยเฉพาะ
    }]
  }
}
```

### ตัวอย่างการตอบกลับ
<Tabs>
<TabItem label="200">
```json
{
  "status_code": 200,
  "status_message": "OK",
  "response": null
}
```
</TabItem>

<TabItem label="403">
```json
{
  "status_code": 403,
  "status_message": "Token restrictions forbid this operation",
  "response": null
}
```
</TabItem>
</Tabs>

### เงื่อนไขแท็ก

เงื่อนไขแท็กแต่ละรายการเป็นอาร์เรย์เช่น `[tagName, operator, operand]` โดยที่

* tagName: ชื่อของแท็ก
* operator: "EQ" | "IN" | "NOTEQ" | "NOTIN" | "LTE" | "GTE" | "BETWEEN"
* operand: string | integer | array | date

#### คำอธิบาย Operand

* EQ: ค่าแท็กเท่ากับ operand;
* IN: ค่าแท็กตัดกับ operand (operand ต้องเป็นอาร์เรย์เสมอ);
* NOTEQ: ค่าแท็กไม่เท่ากับ operand;
* NOTIN: ค่าแท็กไม่ตัดกับ operand (operand ต้องเป็นอาร์เรย์เสมอ);
* GTE: ค่าแท็กมากกว่าหรือเท่ากับ operand;
* LTE: ค่าแท็กน้อยกว่าหรือเท่ากับ operand;
* BETWEEN: ค่าแท็กมากกว่าหรือเท่ากับค่า min operand แต่น้อยกว่าหรือเท่ากับค่า max operand (operand ต้องเป็นอาร์เรย์เสมอ)

#### แท็กสตริง

โอเปอเรเตอร์ที่ใช้ได้: EQ, IN, NOTEQ, NOTIN\
Operands ที่ใช้ได้:

* EQ, NOTEQ: operand ต้องเป็นสตริง;
* IN, NOTIN: operand ต้องเป็นอาร์เรย์ของสตริงเช่น `["value 1", "value 2", "value N"]`;

#### แท็กจำนวนเต็ม

โอเปอเรเตอร์ที่ใช้ได้: EQ, IN, NOTEQ, NOTIN, BETWEEN, GTE, LTE\
Operands ที่ใช้ได้:

* EQ, NOTEQ, GTE, LTE: operand ต้องเป็นจำนวนเต็ม;
* IN, NOTIN: operand ต้องเป็นอาร์เรย์ของจำนวนเต็มเช่น `[value 1, value 2, value N]`;
* BETWEEN: operand ต้องเป็นอาร์เรย์ของจำนวนเต็มเช่น `[min_value, max_value]`

#### แท็กวันที่

โอเปอเรเตอร์ที่ใช้ได้: EQ, IN, NOTEQ, NOTIN, BETWEEN, GTE, LTE\
Operands ที่ใช้ได้:

* `"YYYY-MM-DD 00:00"` (สตริง)
* unix timestamp `1234567890` (จำนวนเต็ม)
* `"N days ago"` (สตริง) สำหรับโอเปอเรเตอร์ EQ, BETWEEN, GTE, LTE

#### แท็กบูลีน

โอเปอเรเตอร์ที่ใช้ได้: EQ\
Operands ที่ใช้ได้: `0, 1, true, false`

#### แท็กรายการ

โอเปอเรเตอร์ที่ใช้ได้: IN\
Operands ที่ใช้ได้: operand ต้องเป็นอาร์เรย์ของสตริงเช่น `["value 1", "value 2", "value N"]`

<Aside type="danger">
โปรดจำไว้ว่าพารามิเตอร์ “filter” และ “conditions” ไม่ควรใช้ร่วมกัน\
นอกจากนี้ ทั้งสองพารามิเตอร์ **จะถูกละเว้น** หากใช้พารามิเตอร์ "devices" ในคำขอเดียวกัน
</Aside>

<Aside type="note">
**แท็กประเทศและภาษา**

ค่าแท็กภาษาเป็นรหัสสองตัวอักษรตัวพิมพ์เล็กตาม [ISO-639-1](https://en.wikipedia.org/wiki/List\_of\_ISO\_639-1\_codes)\
ค่าแท็กประเทศเป็นรหัสสองตัวอักษรตัวพิมพ์ใหญ่ตาม [ISO\_3166-2](https://en.wikipedia.org/wiki/ISO\_3166-2)\
ตัวอย่างเช่น หากต้องการส่งการแจ้งเตือนพุชไปยังผู้สมัครรับข้อมูลที่พูดภาษาโปรตุเกสในบราซิล คุณจะต้องระบุเงื่อนไขต่อไปนี้: `"conditions": [["Country", "EQ", "BR"],["Language", "EQ", "pt"]]`
</Aside>

## registerEmail

ลงทะเบียนที่อยู่อีเมลสำหรับแอป

`POST` `https://api.pushwoosh.com/json/1.3/registerEmail`

#### ส่วนหัวของคำขอ

| ชื่อ | จำเป็น | ค่า | คำอธิบาย |
|---------------|----------|---------------|------------------------------------------------------------|
| Authorization | ใช่ | Token `XXXX` | [API Device Token](/th/developer/api-reference/api-access-token/#device-api-token) เพื่อเข้าถึง Device API แทนที่ `XXXX` ด้วยโทเค็น Device API จริงของคุณ |


#### เนื้อหาของคำขอ

| ชื่อ | ประเภท | คำอธิบาย |
| --------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------- |
| application\* | string | [รหัสแอปพลิเคชัน Pushwoosh](/th/developer/api-reference/api-identifiers/#application-code) |
| email\* | string | ที่อยู่อีเมล |
| language | string | ภาษาท้องถิ่นของอุปกรณ์ ต้องเป็นรหัสสองตัวอักษรตัวพิมพ์เล็กตามมาตรฐาน ISO-639-1 |
| userId | string | [User ID](/th/developer/api-reference/api-identifiers/#user-id) ที่จะเชื่อมโยงกับที่อยู่อีเมล |
| tz\_offset | integer | ออฟเซ็ตเขตเวลาเป็นวินาที |
| tags | object | ค่าแท็กที่จะกำหนดให้กับอุปกรณ์ที่ลงทะเบียน |

<Tabs>
<TabItem label="200">
```json
{
  "status_code": 200,
  "status_message": "OK",
  "response": null
}
```
</TabItem>
<TabItem label="210">
```json
{
  "status_code": 210,
  "status_message": "this hwid (email) is blacklisted",
  "response": null
}
```
</TabItem>
<TabItem label="400">
```json
{
  "status_code": 400,
  "status_message": "Missing required argument: email",
  "response": null
}
```
</TabItem>
<TabItem label="403">
```json
{
  "status_code": 403,
  "status_message": "Token restrictions forbid this operation",
  "response": null
}
```
</TabItem>
<TabItem label="500">
```json
{
  "status_code": 500,
  "status_message": "Internal server error",
  "response": null
}
```
</TabItem>
</Tabs>

```json title="ตัวอย่าง"
{
  "request": {
    "application": "APPLICATION_CODE",   // จำเป็น รหัสแอปพลิเคชัน Pushwoosh
    "email":"email@domain.com",          // จำเป็น ที่อยู่อีเมลที่จะลงทะเบียน
    "language": "en",                    // ไม่จำเป็น ภาษาท้องถิ่น
    "userId": "userId",                  // ไม่จำเป็น User ID ที่จะเชื่อมโยงกับที่อยู่อีเมล
    "tz_offset": 3600,                   // ไม่จำเป็น ออฟเซ็ตเขตเวลาเป็นวินาที
    "tags": {                            // ไม่จำเป็น ค่าแท็กที่จะตั้งค่าสำหรับอุปกรณ์ที่ลงทะเบียน
       "StringTag": "string value",
       "IntegerTag": 42,
       "ListTag": ["string1","string2"], // ตั้งค่ารายการค่าสำหรับแท็กประเภท List
       "DateTag": "2024-10-02 22:11",    // หมายเหตุ: เวลาควรเป็น UTC
       "BooleanTag": true                // ค่าที่ใช้ได้คือ: true, false
    }
  }
}
```

#### รหัสการตอบกลับ

API สาธารณะจะส่งคืนผลลัพธ์ใน `status_code` ใช้ตารางด้านล่างเพื่อตัดสินใจว่าควรลองเรียกซ้ำเมื่อล้มเหลวหรือไม่

| `status_code` | ความหมาย | ลองใหม่? |
| ------------- | ------- | ------ |
| `200` | สำเร็จ — ที่อยู่อีเมลได้รับการลงทะเบียนแล้ว | ไม่ — เสร็จสิ้น |
| `210` | ข้อผิดพลาดของอาร์กิวเมนต์/การตรวจสอบความถูกต้อง — คำขอถูกเข้าใจแต่ถูกปฏิเสธ (ที่อยู่ถูกขึ้นบัญชีดำ, อีเมลไม่ถูกต้องหรือใช้แล้วทิ้ง, แพลตฟอร์มไม่ถูกต้องสำหรับแผนของบัญชี) ดู [ข้อความแสดงข้อผิดพลาด 210](#210-error-messages) ด้านล่าง | **ไม่** — คำขอเดิมจะส่งคืน `210` เดิม บันทึกที่อยู่และข้ามไป |
| `400` | คำขอมีรูปแบบไม่ถูกต้อง — JSON ไม่ถูกต้องหรือฟิลด์ที่จำเป็นหายไป | ไม่ — แก้ไขคำขอ อย่าทำซ้ำ |
| `403` | ถูกปฏิเสธ — โทเค็น Device API ไม่ถูกต้องหรือถูกจำกัด | ไม่ — แก้ไขการให้สิทธิ์ |
| `500` | ข้อผิดพลาดภายในเซิร์ฟเวอร์ — ปัญหาโครงสร้างพื้นฐานชั่วคราวหรือหมดเวลา | **ใช่**, ด้วย exponential backoff — เป็นกรณีชั่วคราวเพียงกรณีเดียว |

<Aside type="tip">
ลองใหม่เฉพาะการตอบกลับ `500` โดยใช้ exponential backoff — เป็นกรณีชั่วคราวเพียงกรณีเดียว การตอบกลับ `210`, `400` หรือ `403` ถือเป็นที่สิ้นสุด: เซิร์ฟเวอร์เข้าใจคำขอของคุณและปฏิเสธ ดังนั้นการทำซ้ำโดยไม่เปลี่ยนแปลงจะให้ผลลัพธ์เดิม ให้บันทึกที่อยู่ (สำหรับ `210`) หรือแก้ไขคำขอ/โทเค็น (สำหรับ `400`/`403`) แทน
</Aside>

#### ข้อความแสดงข้อผิดพลาด 210

การตอบกลับ `210` จะมีเหตุผลเฉพาะใน `status_message`

| `status_message` | ความหมาย |
| ---------------- | ------- |
| `this hwid (email) is blacklisted` | ที่อยู่นี้อยู่ในรายการระงับหลังจากเกิด hard bounce แบบถาวรและจะไม่ถูกลงทะเบียนใหม่ |
| `hwid (email) is invalid` / `has invalid semantic` | ที่อยู่ไม่ผ่านการตรวจสอบความถูกต้อง |
| `hwid (email) is empty` | ไม่ได้ระบุที่อยู่ |
| `hwid (email) has invalid count of parts` | มี `@` ขาดหรือเกิน |
| `hwid (email) has invalid local part` | ส่วนก่อน `@` ไม่ถูกต้อง |
| `hwid (email) has invalid domain part` | ส่วนโดเมนไม่ถูกต้อง |
| `hwid (email) has disposable domain` | ที่อยู่ใช้อีเมลโดเมนแบบใช้แล้วทิ้ง/ชั่วคราว (เช่น 10minutemail) |
| `hwid is not valid` | `hwid` เองมีรูปแบบไม่ถูกต้อง |
| `only email platform allowed for Email Only subscription` | บัญชีนี้อยู่ในแผน Email Only และไม่สามารถลงทะเบียนอุปกรณ์ที่ไม่ใช่อีเมลได้ |

<Aside type="note">
เฉพาะ **hard bounces แบบถาวร** เท่านั้นที่จะเพิ่มที่อยู่ลงในบัญชีดำ soft bounces และการร้องเรียนสแปม **ไม่** บล็อก `registerEmail` — เฉพาะ `this hwid (email) is blacklisted` เท่านั้นที่สะท้อนถึงการระงับ
</Aside>

## deleteEmail

ลบที่อยู่อีเมลออกจากฐานผู้ใช้ของคุณ

`POST` `https://api.pushwoosh.com/json/1.3/deleteEmail`

#### ส่วนหัวของคำขอ

| ชื่อ | จำเป็น | ค่า | คำอธิบาย |
|---------------|----------|---------------|------------------------------------------------------------|
| Authorization | ใช่ | Token `XXXX` | [API Device Token](/th/developer/api-reference/api-access-token/#device-api-token) เพื่อเข้าถึง Device API แทนที่ `XXXX` ด้วยโทเค็น Device API จริงของคุณ |


#### เนื้อหาของคำขอ

| ชื่อ | ประเภท | คำอธิบาย |
| ----------- | ------ | --------------------------------------------- |
| application | string | [รหัสแอปพลิเคชัน Pushwoosh](/th/developer/api-reference/api-identifiers/#application-code) |
| email | string | ที่อยู่อีเมลที่ใช้ในคำขอ [`/registerEmail`](/th/developer/api-reference/email-api/#registeremail) |

<Tabs>
<TabItem label="200">
```json
{
  "status_code": 200,
  "status_message": "OK",
  "response": null
}
```
</TabItem>
</Tabs>

```json title="ตัวอย่าง"
{
  "request": {
    "application": "APPLICATION_CODE",  // จำเป็น รหัสแอปพลิเคชัน Pushwoosh
    "email": "email@domain.com"         // จำเป็น อีเมลที่จะลบออกจากผู้สมัครรับข้อมูลของแอป
  }
}
```

## setEmailTags

ตั้งค่าแท็กสำหรับที่อยู่อีเมล

`POST` `https://api.pushwoosh.com/json/1.3/setEmailTags`

#### ส่วนหัวของคำขอ

| ชื่อ | จำเป็น | ค่า | คำอธิบาย |
|---------------|----------|---------------|------------------------------------------------------------|
| Authorization | ใช่ | Token `XXXX` | [API Device Token](/th/developer/api-reference/api-access-token/#device-api-token) เพื่อเข้าถึง Device API แทนที่ `XXXX` ด้วยโทเค็น Device API จริงของคุณ |

#### เนื้อหาของคำขอ

| ชื่อ | ประเภท | คำอธิบาย |
| ----------- | ------ | ------------------------------------------------------------- |
| application | string | [รหัสแอปพลิเคชัน Pushwoosh](/th/developer/api-reference/api-identifiers/#application-code) |
| email | string | ที่อยู่อีเมล |
| tags | object | อ็อบเจกต์ JSON ของแท็กที่จะตั้งค่า ส่ง 'null' เพื่อลบค่า |
| userId | string | [User ID](/th/developer/api-reference/api-identifiers/#user-id) ที่เชื่อมโยงกับที่อยู่อีเมล |

<Tabs>
<TabItem label="200">
```json
{
  "status_code": 200,
  "status_message": "OK",
  "response": {
    "skipped": []
  }
}
```
</TabItem>
</Tabs>

```json title="ตัวอย่าง"
{
  "request": {
    "email": "email@domain.com",                  // จำเป็น ที่อยู่อีเมลที่จะตั้งค่าแท็ก
    "application": "APPLICATION_CODE",            // จำเป็น รหัสแอปพลิเคชัน Pushwoosh
    "tags": { 
      "StringTag": "string value",
      "IntegerTag": 42,
      "ListTag": ["string1", "string2"],
      "DateTag": "2024-10-02 22:11",              // เวลาใน UTC
      "BooleanTag": true                          // ค่าที่ใช้ได้คือ: true, false
    },
    "userId": "userId"                            // ไม่จำเป็น User ID ที่เชื่อมโยงกับที่อยู่อีเมล
  }
}
```

<Aside type="note">
สำหรับอุปกรณ์ประเภทอื่นจะส่งคืน 200 OK แม้ว่าแท็กจะไม่ถูกบันทึก
</Aside>

<Aside type="caution">
โปรดหลีกเลี่ยงการตั้งค่าแท็กมากกว่า 50 ค่าในคำขอ `/setEmailTags` เดียว
</Aside>

## registerEmailUser

เชื่อมโยง [User ID](/th/developer/api-reference/api-identifiers/#user-id) ภายนอกกับที่อยู่อีเมลที่ระบุ

`POST` `https://api.pushwoosh.com/json/1.3/registerEmailUser`



<Aside type="note">
โปรดทราบว่าเมธอดนี้ **ไม่ได้ลงทะเบียนที่อยู่อีเมล** ในฐานผู้ใช้ของคุณ ควรใช้เพื่อกำหนด User ID ให้กับที่อยู่อีเมลที่ลงทะเบียนแล้วโดยคำขอ `/registerEmail` เท่านั้น
</Aside>

สามารถใช้ในการเรียก API `/createEmailMessage` (พารามิเตอร์ 'users')

#### ส่วนหัวของคำขอ

| ชื่อ | จำเป็น | ค่า | คำอธิบาย |
|---------------|----------|---------------|------------------------------------------------------------|
| Authorization | ใช่ | Token `XXXX` | [API Device Token](/th/developer/api-reference/api-access-token/#device-api-token) เพื่อเข้าถึง Device API แทนที่ `XXXX` ด้วยโทเค็น Device API จริงของคุณ |


#### เนื้อหาของคำขอ

| ชื่อ | ประเภท | คำอธิบาย |
| --------------------------------------------- | ------- | ---------------------------------------------- |
| application\* | string | [รหัสแอปพลิเคชัน Pushwoosh](/th/developer/api-reference/api-identifiers/#application-code) |
| email\* | string | ที่อยู่อีเมล |
| userId\* | string | [User ID](/th/developer/api-reference/api-identifiers/#user-id) ที่จะเชื่อมโยงกับที่อยู่อีเมล |
| tz\_offset | integer | ออฟเซ็ตเขตเวลาเป็นวินาที |

<Tabs>
<TabItem label="200">
```json
{
  "status_code": 200,
  "status_message": "OK",
  "response": null
}
```
</TabItem>

<TabItem label="400">
```json
{
  "status_code": 400,
  "status_message": "Request format is not valid."
}
```
</TabItem>

<TabItem label="403">
```json
{
  "status_code": 403,
  "status_message": "Forbidden."
}
```
</TabItem>
</Tabs>

```json title="ตัวอย่าง"
{
  "request": {
    "application": "APPLICATION_CODE", // จำเป็น รหัสแอปพลิเคชัน Pushwoosh
    "email": "email@domain.com",       // จำเป็น ที่อยู่อีเมลของผู้ใช้
    "userId": "userId",                // จำเป็น User ID ที่จะเชื่อมโยงกับที่อยู่อีเมล
    "tz_offset": 3600                  // ไม่จำเป็น ออฟเซ็ตเขตเวลาเป็นวินาที
  }
}
```

<Aside type="note">
หากต้องการดึงข้อมูลเกี่ยวกับ soft bounces, hard bounces และการร้องเรียนทางอีเมล รวมถึงวันที่ ที่อยู่อีเมล และเหตุผลของแต่ละ bounce ให้ใช้เมธอด [BouncedEmails](/th/developer/api-reference/statistics-api/message-statistics-api/#bouncedemails)
</Aside>