# Email 通知

本頁說明 IP 加入 Deny 名單時的 SMTP 通知、自訂主旨與內文，以及 `net/smtp` 帶來的連線限制。

## 觸發時機

只有 `Deny.Add` 會寄信，且在寫入 Redis 與名單檔成功後以 goroutine 非同步執行；`Config.Email` 為 `nil` 時不寄送。寄送失敗只記錄錯誤，不影響 `Add` 的回傳值。

## 設定

```go
subject := func(ip, reason string) string {
	return "[Sentry] banned " + ip
}

sentry, err := golangIPSentry.New(golangIPSentry.Config{
	Redis: golangIPSentry.Redis{Host: "localhost", Port: 6379},
	Email: &golangIPSentry.EmailConfig{
		Host:     "smtp.example.com",
		Port:     587,
		Username: "alert@example.com",
		Password: "app-password",
		From:     "alert@example.com",
		To:       []string{"ops@example.com"},
		Subject:  &subject,
	},
	Parameter: golangIPSentry.Parameter{
		BlockTimeMin: 5 * time.Minute,
		BlockTimeMax: 24 * time.Hour,
	},
})
if err != nil {
	log.Fatal(err)
}
```

| 欄位 | 預設 |
|---|---|
| `Subject` | `[IP Sentry] IP {ip} has been banned` |
| `Body` | `[IP Sentry] IP {ip} has been banned for {reason}` |

自訂函式回傳空字串時回退預設值。`Subject`／`Body` 帶 `json:"-"`，從 JSON 載入設定時只能另外以程式指定。

## SMTP 限制

寄送使用標準函式庫 `smtp.SendMail` 搭配 PLAIN 認證：

| 限制 | 影響 |
|---|---|
| 不支援隱含 TLS（465 埠） | 使用 587 埠，由伺服器提供 STARTTLS |
| PLAIN 認證拒絕在未加密連線送出密碼（localhost 除外） | 伺服器不支援 STARTTLS 時寄送失敗 |
| `CC` 只寫入信件標頭 | 收件者清單只有 `To`，副本收件人實際收不到，見 [已知問題](/zh/known-issues) |
| 沒有 `MIME-Version`／`Content-Type` 標頭，主旨未編碼 | 主旨或內文含中文時部分郵件客戶端會顯示亂碼 |
| 沒有重試與佇列 | 單次失敗即放棄 |
