آموزش
ارسال کد یکبارمصرف (OTP)
چطور ایمیل کد تأیید را سریع، بدون ارسال تکراری و بدون ردیابی بفرستید.
آخرین ویرایش: ۲۱ آبان ۱۴۰۵
کد یکبارمصرف (OTP) حساسترین ایمیل شماست: کاربر منتظر است و هر ثانیه تأخیر یعنی خروج از صفحه. این راهنما میگوید سندک برای چنین ایمیلی چه میکند و شما چه کار کنید.
۱. برچسب otp را بگذارید
{
"from": "no-reply@shop.ir",
"to": ["ali@gmail.com"],
"subject": "کد ورود شما",
"text": "کد ورود شما: 482913\nاین کد تا ۵ دقیقه معتبر است.",
"tags": ["otp"]
}ایمیلی که برچسب otp دارد:
- ردیابی (پیکسل و بازنویسی پیوند) به آن اضافه نمیشود، حتی اگر برای دامنه روشن باشد.
- لغو اشتراک جلوی آن را نمیگیرد. گیرندهای که خبرنامه را لغو کرده هنوز کد ورود میگیرد؛ ببینید فهرست حذف.
۲. با API بفرستید و کلید یکتایی بگذارید
ایمیل OTP را با SMTP نفرستید؛ API کلید یکتایی درخواست دارد و خطای روشن میدهد. کلید را از همان درخواست کاربر بسازید:
const key = `otp-${loginAttempt.id}`
const response = await fetch('https://api.sendak.ir/v1/emails', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SENDAK_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': key,
},
body: JSON.stringify({
from: 'no-reply@shop.ir',
to: [user.email],
subject: 'کد ورود شما',
text: `کد ورود شما: ${code}\nاین کد تا ۵ دقیقه معتبر است.`,
tags: ['otp'],
}),
signal: AbortSignal.timeout(5_000),
})اگر کاربر دوباره «ارسال مجدد» بزند، درخواست تازه و کلید تازه است (otp-${newAttemptId})؛ ولی اگر شبکهی شما بعد از ارسال قطع شد و همان درخواست را تکرار کردید، همان کلید را بفرستید. توضیح کامل.
۳. چهار عادت برای پایداری
| عادت | چرا |
|---|---|
| مهلت کوتاه و مشخص (۵ تا ۱۰ ثانیه) | درخواست گیر نکند و کاربر منتظر نماند |
| اتصال را دوباره استفاده کنید | برای هر ایمیل اتصال TLS تازه ساختن کند است |
فقط وقتی پاسخ نگرفتهاید دوباره بفرستید، و با همان Idempotency-Key | ارسال دوتایی ایجاد نشود |
شناسهی id که API برمیگرداند را کنار درخواست کاربر نگه دارید | بتوانید در «فعالیت» همان ایمیل را پیدا کنید |
۴. گیرندهی در فهرست حذف را بشناسید
اگر نشانی کاربر قبلاً برگشت خورده، پاسخ برای او status: "suppressed" است و ایمیل نمیرود:
{ "data": [ { "to": "ali@gmail.com", "id": null, "status": "suppressed" } ] }این را به کاربر بگویید («به این نشانی ایمیل نمیرسد»)، نه «ارسال شد».
۵. رسیدن را باور نکنید
202 یعنی ایمیل در صف است، نه اینکه رسیده. برای فهمیدن نتیجه وبهوک بگیرید و message.bounced را دنبال کنید تا به کاربر بگویید نشانیاش مشکل دارد.
۶. برای قطعی راه دوم داشته باشید
هشدار: در قطعی اینترنت بینالملل، ایمیل به Gmail و دیگر مقصدهای خارجی در صف میماند و نمیرسد؛ ببینید مسیر ایران و خارج. کدی که یک روز بعد برسد بیفایده است. اگر ورود کاربرانتان به این کد وابسته است، یک راه دوم (مثل پیامک) در برنامه بگذارید.
۷. متن کد را ساده نگه دارید
- موضوع کوتاه که نام برنامه را بگوید.
- کد در خط جدا و درشت، و مدت اعتبار.
- بدون تصویر و پیوند اضافه. این هم رسیدن را آسانتر میکند و هم کلاهبرداری را سختتر.
- از یک آدرس ثابت (مثل
no-reply@shop.ir) بفرستید تا شهرت آن آدرس بالا برود.