برنامه نویسی

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

این پروژه یک API سبک وزن است که با .NET ساخته شده است که ارسال ایمیل از طریق یک نقطه پایانی اختصاصی را امکان پذیر می کند. این یک معماری تمیز و حداقل با استفاده از کنترل کننده ها ، خدمات و تزریق وابستگی را دنبال می کند. پیکربندی از طریق AppSettings انجام می شود ، و رسیدگی به خطا برای جلب مشکلات در طی فرآیند ارسال وجود دارد. API برای آزمایش محلی و گسترش آینده ، مانند افزودن تأیید اعتبار ، برنامه ریزی یا پشتیبانی از پیوست ها آماده است.

🔰 مرحله 0

یک پروژه جدید ایجاد کنید و نوع پروژه “ASP.NET Core Web API” را انتخاب کنید

https%3A%2F%2Fdev to uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdqt0ylhufsz013dyy2l5

وابستگی های بسته Nuget که در این پروژه استفاده شده است به شرح زیر است:

  • پست
  • microsoft.aspnetcore.openapi
  • microsoft.openapi
  • newtonsoft.json
  • swashbuckle.aspnetcore.swagger
  • swashbuckle.aspnetcore.swaggengen
  • swashbuckle.aspnetcore.swaggerui

نمای کلی ساختار پروژه

راه حل به دنبال یک ساختار تمیز و مدولار سازماندهی می شود:

کنترل کننده/ – درخواست های HTTP و منطق خدمات را به خدمات ارائه می دهد.

مدل ها/ – شامل اشیاء انتقال داده (DTO) است که برای انتقال داده ها استفاده می شود.

خدمات/ – منطق اصلی ارسال ایمیل از طریق SMTP را پیاده سازی می کند.

برنامه – خدمات را پیکربندی می کند ، میانی های اساسی مانند تغییر مسیر HTTPS و Swagger را قادر می سازد و خط لوله برنامه را تنظیم می کند.

این طرح مسئولیت ها را به خوبی تفکیک می کند و باعث می شود پروژه مقیاس و حفظ آن آسان شود.

https%3A%2F%2Fdev to

بیایید شروع کنیم

💻 مرحله 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 وضعیت دریافت می کنیم. ( برای بزرگنمایی کلیک کنید)

برای بزرگنمایی کلیک کنید

ایمیل مشتری

در اینجا ایمیلی را که مشتری که استعلام را ارسال کرده است ، می بینیم.
https%3A%2F%2Fdev to

email ایمیل تجاری

در اینجا ایمیلی را که تجارت دریافت می کند می بینیم.
https%3A%2F%2Fdev to uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3wnj5ucicqkbj64czonb

منبع: https://github.com/educalok/emailsenderapi

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا