ایمیل ساده ارسال API با .NET

این پروژه یک API سبک وزن است که با .NET ساخته شده است که ارسال ایمیل از طریق یک نقطه پایانی اختصاصی را امکان پذیر می کند. این یک معماری تمیز و حداقل با استفاده از کنترل کننده ها ، خدمات و تزریق وابستگی را دنبال می کند. پیکربندی از طریق AppSettings انجام می شود ، و رسیدگی به خطا برای جلب مشکلات در طی فرآیند ارسال وجود دارد. API برای آزمایش محلی و گسترش آینده ، مانند افزودن تأیید اعتبار ، برنامه ریزی یا پشتیبانی از پیوست ها آماده است.
🔰 مرحله 0
یک پروژه جدید ایجاد کنید و نوع پروژه “ASP.NET Core Web API” را انتخاب کنید
وابستگی های بسته Nuget که در این پروژه استفاده شده است به شرح زیر است:
- پست
- microsoft.aspnetcore.openapi
- microsoft.openapi
- newtonsoft.json
- swashbuckle.aspnetcore.swagger
- swashbuckle.aspnetcore.swaggengen
- swashbuckle.aspnetcore.swaggerui
نمای کلی ساختار پروژه
راه حل به دنبال یک ساختار تمیز و مدولار سازماندهی می شود:
کنترل کننده/ – درخواست های HTTP و منطق خدمات را به خدمات ارائه می دهد.
مدل ها/ – شامل اشیاء انتقال داده (DTO) است که برای انتقال داده ها استفاده می شود.
خدمات/ – منطق اصلی ارسال ایمیل از طریق SMTP را پیاده سازی می کند.
برنامه – خدمات را پیکربندی می کند ، میانی های اساسی مانند تغییر مسیر HTTPS و Swagger را قادر می سازد و خط لوله برنامه را تنظیم می کند.
این طرح مسئولیت ها را به خوبی تفکیک می کند و باعث می شود پروژه مقیاس و حفظ آن آسان شود.
بیایید شروع کنیم
💻 مرحله 1:
یک مدل ساده برای نشان دادن داده های ارسال شده از فرم تماس ایجاد کنید.
در EmailDto
کلاس شامل سه قسمت مورد نیاز است:
-
To
: آدرس ایمیل گیرنده. -
ContactName
: نام شخصی که فرم را ارسال می کند. -
Body
: محتوای پیام واقعی.
این خصوصیات هنگام ارسال ایمیل از طریق API استفاده می شود.
namespace EmailSenderAPI.Models
{
public class EmailDto
{
[Required]
public string To { get; set; } = string.Empty;
[Required]
public string ContactName { get; set; } = string.Empty;
[Required]
public string Body { get; set; } = string.Empty;
}
}
🔄 مرحله 2:
رابط کاربری ایجاد کنید که قرارداد سرویس ایمیل را مشخص کند.
این رابط شامل روش SendEmail است که برای رسیدگی به منطق ارسال ایمیل پیاده سازی خواهد شد.
using EmailSenderAPI.Models;
namespace EmailSenderAPI.Services.EmailService
{
public interface IEmailService
{
void SendEmail(EmailDto request);
}
}
📧 مرحله 3:
حال بیایید منطق را برای ارسال ایمیل ها با استفاده از آن پیاده سازی کنیم پستبشر
در این مرحله ، شما ایجاد می کنید EmailService
طبقه ای که انجام می دهد IEmailService
قرارداد
این سرویس موارد زیر را انجام می دهد:
- ارسال می کند ایمیل تأیید به کاربر که فرم را پر کرده است.
- ارسال می کند پیام واقعی به صندوق ورودی تجارت.
- کاربردهای مقادیر پیکربندی از
appsettings.json
(میزبان SMTP ، بندر ، اعتبارنامه). - با استفاده از هرگونه خطایی را وارد کنید
ILogger
بشر
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
using MimeKit.Text;
using EmailSenderAPI.Models;
using Microsoft.Extensions.Logging;
namespace EmailSenderAPI.Services.EmailService
{
public class EmailService(IConfiguration config, ILogger<EmailService> logger) : IEmailService
{
private readonly IConfiguration _config = config ?? throw new ArgumentNullException(nameof(config));
private readonly ILogger<EmailService> _logger = logger ?? throw new ArgumentNullException(nameof(logger));
// Sends both emails: one to the business and one to the customer
public void SendEmail(EmailDto request)
{
ArgumentNullException.ThrowIfNull(request);
try
{
// Send confirmation email to the user
var confirmationEmail = CreateConfirmationEmail(request);
SendEmailMessage(confirmationEmail);
// Send original message to the business
var businessEmail = CreateBusinessEmail(request);
SendEmailMessage(businessEmail);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error sending email to {Recipient}", request.To);
throw;
}
}
// Email to the customer confirming receipt
private MimeMessage CreateConfirmationEmail(EmailDto request)
{
var email = new MimeMessage();
email.From.Add(MailboxAddress.Parse(_config["EmailUsername"]));
email.To.Add(MailboxAddress.Parse(request.To));
email.Subject = "Thank you for your message";
email.Body = new TextPart(TextFormat.Html)
{
Text = "Thank you for your email. We will get in touch with you shortly.
"
};
return email;
}
// Email to the business with the user's message
private MimeMessage CreateBusinessEmail(EmailDto request)
{
var email = new MimeMessage();
email.From.Add(MailboxAddress.Parse(_config["EmailUsername"]));
email.To.Add(MailboxAddress.Parse(_config["EmailUsername"]));
email.Subject = $"New message from {request.ContactName}";
email.Body = new TextPart(TextFormat.Html)
{
Text = $@"
New contact form submission
From:
{request.ContactName} ({request.To})
Message:
{request.Body}"
};
return email;
}
// Connects and sends the email
private void SendEmailMessage(MimeMessage email)
{
using var smtp = new SmtpClient();
var host = _config["EmailHost"];
var port = _config.GetValue<int>("Port");
var username = _config["EmailUsername"];
var password = _config["EmailPassword"];
if (string.IsNullOrWhiteSpace(host))
throw new InvalidOperationException("EmailHost configuration is missing");
if (port <= 0)
throw new InvalidOperationException("Invalid Port configuration");
if (string.IsNullOrWhiteSpace(username))
throw new InvalidOperationException("EmailUsername configuration is missing");
if (string.IsNullOrWhiteSpace(password))
throw new InvalidOperationException("EmailPassword configuration is missing");
smtp.Connect(host, port, SecureSocketOptions.StartTls);
smtp.Authenticate(username, password);
try
{
smtp.Send(email);
}
finally
{
smtp.Disconnect(true);
}
}
}
}
📬 مرحله 4:
بیایید یک کنترلر حداقل ایجاد کنیم تا یک نقطه پایانی پست را که داده های فرم تماس را دریافت می کند ، در معرض دید قرار دهیم و منطق ارسال ایمیل را تحریک می کند.
کنترل کننده:
- درخواست های پست را به
/api/email
- دریافت
EmailDto
شیء از بدن - تماس
SendEmail
روش سرویس تزریق شده - پاسخ HTTP 200 را در مورد موفقیت برمی گرداند
در اینجا کد وجود دارد:
using System.Net;
using EmailSenderAPI.Models;
using EmailSenderAPI.Services.EmailService;
using Microsoft.AspNetCore.Mvc;
namespace EmailSenderAPI.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class EmailController(IEmailService emailService) : ControllerBase
{
// Service for sending emails
private readonly IEmailService _emailService = emailService;
// POST api/email
[HttpPost]
public IActionResult SendEmail(EmailDto request)
{
// Call the service to send the email
_emailService.SendEmail(request);
// Return success response
return Ok(new { message = "Email sent successfully" });
}
}
}
⚙ مرحله 5:
حال بیایید برنامه را در پیکربندی کنیم Program.cs
به:
- ثبت خدمات لازم (کنترل کننده ها ، swagger ، مشتری HTTP)
- سفارشی ما را ثبت کنید
EmailService
- خط لوله Middleware را برای توسعه و تغییر مسیر HTTPS تنظیم کنید
در اینجا کد کامل وجود دارد:
using EmailSenderAPI.Services.EmailService;
using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args);
// ------ Service Configuration ------
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo
{
Title = "EmailSenderAPI",
Version = "v1",
Description = "Email sending API"
});
});
// Register custom services
builder.Services.AddScoped<IEmailService, EmailService>();
builder.Services.AddHttpClient();
var app = builder.Build();
// ------ Middleware Pipeline ------
if (app.Environment.IsDevelopment())
{
// Enable Swagger only in Development
app.UseSwagger();
app.UseSwaggerUI(); // Default endpoint: /swagger
}
app.UseHttpsRedirection();
app.MapControllers();
app.Run();
🛠 مرحله 6:
برای ایمن نگه داشتن اعتبار ایمیل و جزئیات سرور خود ، آنها را به خود اضافه کنید ، آنها را به خود اضافه کنید appsettings.json
پرونده:
{
"EmailHost": "smtp.example.com",
"EmailUsername": "your@email.com",
"EmailPassword": "yourEmailPassword",
"Port": 587,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
✅ توجه: مقادیر نگهدارنده مکان را با سرور واقعی SMTP ، آدرس ایمیل و اعتبار خود جایگزین کنید.
این مقادیر با استفاده از تزریق می شوند IConfiguration
در EmailService
کلاس.
🚀 اکنون وقت آن است که فرستنده ایمیل خود را آزمایش کنیم!
در Swagger ، داده های نمونه را برای انجام آزمایش وارد می کنیم. ( برای بزرگنمایی کلیک کنید)
آزمون موفقیت آمیز 🎉 ما یک کد 200 وضعیت دریافت می کنیم. ( برای بزرگنمایی کلیک کنید)
ایمیل مشتری
در اینجا ایمیلی را که مشتری که استعلام را ارسال کرده است ، می بینیم.
email ایمیل تجاری
در اینجا ایمیلی را که تجارت دریافت می کند می بینیم.
منبع: https://github.com/educalok/emailsenderapi