# เกตเวย์ SMTP

เกตเวย์ SMTP รับการส่งเมลมาตรฐานและส่งต่อแต่ละข้อความไปยัง [Messaging API v2 `Notify`](/th/developer/api-reference/messaging-api-v2/notify/) ในรูปแบบอีเมลธุรกรรม ใช้เมื่อเครื่องมือเมลที่มีอยู่ — MTA, mailer ของเฟรมเวิร์ก, SDK — ง่ายต่อการเชื่อมต่อมากกว่าการส่งคำขอ JSON ไปยัง API

<Aside type="note">
เกตเวย์นี้ใช้สำหรับธุรกรรมเท่านั้น สำหรับกลุ่มเป้าหมาย การตั้งเวลา หรือแคมเปญ A/B ให้เรียกใช้ [`Notify`](/th/developer/api-reference/messaging-api-v2/notify/) โดยตรง
</Aside>

## วิธีการทำงาน

```
   any SMTP client          smtp gateway              Messaging API v2
   ──────────────── ──────> ──────────────── ──────> ─────────────────
       submission            STARTTLS                gRPC Notify
       AUTH PLAIN            + AUTH PLAIN            Authorization: Token
```

1. ไคลเอนต์เชื่อมต่อกับ `smtp.pushwoosh.com` บนพอร์ต `587` อัปเกรดการเชื่อมต่อเป็น TLS ด้วย `STARTTLS` จากนั้นตรวจสอบสิทธิ์ด้วย `AUTH PLAIN`
2. เกตเวย์จะแยกวิเคราะห์ข้อความ MIME และสร้างคำขอ `Notify` ด้วย `platforms: ["EMAIL"]` และ `message_type: TRANSACTIONAL`
3. โทเค็น API จาก `AUTH PLAIN` จะถูกส่งต่อไปยัง Messaging API เป็นส่วนหัว `Authorization` การตรวจสอบโทเค็น การจับคู่แอปพลิเคชัน ตัวตนผู้ส่ง และการจัดการการตีกลับทั้งหมดจะเกิดขึ้นที่ฝั่ง API

## Endpoint

| การตั้งค่า <div style="width:140px"></div> | ค่า <div style="width:340px"></div> |
|---------|-------|
| โฮสต์    | `smtp.pushwoosh.com` |
| พอร์ต    | `587` (SMTP submission) |
| TLS     | `STARTTLS` — จำเป็นต้องทำก่อน `AUTH` |
| การยืนยันตัวตน    | `AUTH PLAIN` |

## การตรวจสอบสิทธิ์

`AUTH PLAIN` ใช้ข้อมูลประจำตัวของ Pushwoosh สองอย่าง

| ฟิลด์ AUTH <div style="width:120px"></div> | ค่า Pushwoosh |
|------------|-----------------|
| `username` | [รหัสแอปพลิเคชัน](/th/developer/api-reference/api-identifiers/#application-code) ตัวอย่างเช่น `XXXXX-XXXXX` |
| `password` | [โทเค็น Server API](/th/developer/api-reference/api-access-token/#server-api-token) |

`AUTH` จะถูกปฏิเสธหากอยู่นอก TLS โทเค็นจะไม่ปรากฏในข้อความ — จะใช้เพื่ออนุญาตการเรียก `Notify` ที่ต้นทางเท่านั้น

## การจับคู่ข้อความกับ Notify

| ฟิลด์ MIME หรือ SMTP <div style="width:200px"></div> | ฟิลด์ Notify |
|--------------------|--------------|
| `RCPT TO`          | `target.users.list` — Pushwoosh จะแปลงที่อยู่เหล่านี้เป็นผู้สมัครสมาชิก |
| `username` ของ AUTH    | `application` |
| ส่วนหัว `Subject:`  | `email_payload.subject["default"]` (ถอดรหัส RFC 2047) |
| ส่วนหัว `From:`     | `email_payload.from` — `name` และ `email` |
| ส่วน HTML          | `email_payload.body` (จะถูกเลือกใช้เมื่อมีทั้งสองส่วน) |
| ส่วนข้อความธรรมดา    | `email_payload.body` (ใช้เมื่อไม่มี HTML) |
| `MAIL FROM`        | ถูกละเว้น — Pushwoosh จะใช้ตัวตนผู้ส่งของตนเองและจัดการการตีกลับเอง |

ทุกข้อความจะถูกส่งด้วย `schedule.send_date: now`

## ข้อจำกัด

| ข้อจำกัด <div style="width:280px"></div> | ค่า |
|-------|-------|
| ขนาดข้อความสูงสุด       | 25 MiB |
| จำนวนผู้รับสูงสุดต่อซองจดหมาย (`RCPT TO`) | 50 |

## การจับคู่ข้อผิดพลาด

รหัสสถานะ gRPC ที่ส่งคืนโดย Messaging API จะถูกแปลเป็นรหัสตอบกลับ SMTP มาตรฐานเพื่อให้ไคลเอนต์ SMTP ใด ๆ แสดงข้อผิดพลาดที่มีความหมาย

| สถานะ gRPC ต้นทาง <div style="width:280px"></div> | การตอบกลับ SMTP <div style="width:120px"></div> | ความหมาย |
|----------------------|------------|---------|
| `Unauthenticated`                                          | `535 5.7.8` | รหัสแอปพลิเคชันหรือโทเค็น API ไม่ถูกต้อง |
| `PermissionDenied`                                         | `550 5.7.1` | โทเค็นไม่มีสิทธิ์สำหรับแอปพลิเคชันนี้ |
| `InvalidArgument` / `FailedPrecondition` / `OutOfRange`    | `550 5.6.0` | เนื้อหา MIME ไม่ถูกต้อง (เช่น ไม่มีหัวเรื่องหรือเนื้อหา) |
| `NotFound`                                                 | `550 5.1.1` | ไม่พบแอปพลิเคชันหรือผู้รับ |
| `ResourceExhausted`                                        | `452 4.5.3` | ถึงขีดจำกัดอัตราแล้ว — ลองอีกครั้งในภายหลัง |
| `DeadlineExceeded` / `Unavailable`                         | `451 4.4.1` | ข้อผิดพลาดชั่วคราวจากต้นทาง — ลองอีกครั้งในภายหลัง |
| ความล้มเหลวอื่น ๆ                                          | `451 4.5.0` | ข้อผิดพลาดภายในชั่วคราว — ลองอีกครั้งในภายหลัง |

รหัสในช่วง `4xx` เป็นข้อผิดพลาดชั่วคราวและไคลเอนต์ควรลองอีกครั้ง รหัสในช่วง `5xx` เป็นข้อผิดพลาดถาวรและต้องมีการแก้ไขที่ฝั่งไคลเอนต์

## ตัวอย่าง: การส่งด้วย swaks

```bash
swaks --server smtp.pushwoosh.com:587 \
      --auth-user "XXXXX-XXXXX" \
      --auth-password "YOUR_API_TOKEN" \
      --tls \
      --from from@example.com \
      --to user@example.com \
      --header "Subject: Hello from SMTP gateway" \
      --body "Plain-text body"
```

ส่วนหัว `From:` ในเนื้อหา MIME คือสิ่งที่ไปถึง Pushwoosh — ส่วนซองจดหมาย `--from` (`MAIL FROM`) จะถูกทิ้งไป

## หมายเหตุ

- เกตเวย์เป็นแบบ stateless และไม่เก็บข้อความ เมื่อส่งต่อไปแล้ว การจัดส่งจะอยู่ภายใต้การดูแลของ Messaging API
- การตีกลับ การร้องเรียน และลิงก์ยกเลิกการสมัครจะได้รับการจัดการโดย Pushwoosh เช่นเดียวกับอีเมลธุรกรรมอื่น ๆ
- สำหรับการส่งแคมเปญ (กลุ่มเป้าหมาย การตั้งเวลา A/B) ให้ใช้ [`Notify`](/th/developer/api-reference/messaging-api-v2/notify/) โดยตรง — เกตเวย์ SMTP ใช้สำหรับการส่งเท่านั้น

## ดูเพิ่มเติม

<CardGrid>
  <LinkCard title="ภาพรวม Messaging API v2" href="/developer/api-reference/messaging-api-v2/" />
  <LinkCard title="Notify" href="/developer/api-reference/messaging-api-v2/notify/" />
  <LinkCard title="ข้อมูลอ้างอิงเพย์โหลดอีเมล" href="/developer/api-reference/messaging-api-v2/email-payload-reference/" />
  <LinkCard title="การตลาดเทียบกับธุรกรรม" href="/product/messaging-channels/marketing-vs-transactional/" />
</CardGrid>