首页 > 解决方案 > 无法发送 docherize smpt 服务

问题描述

我有电子邮件服务,在对主 api 进行一些操作后触发。它是使用 webhost 构建的控制台应用程序:

public async Task SendMessageAsync(OrderUserDto mail)
    {
        var email = new MimeMessage();
        email.Sender = MailboxAddress.Parse(_mailSettings.Value.Mail);
        email.To.Add(MailboxAddress.Parse(mail.Email));
        email.Subject = mail.Email;

        var builder = new BodyBuilder();
        builder.HtmlBody = mail.OrderDetails.ToString();
        email.Body = builder.ToMessageBody();

        using var smtp = new SmtpClient();
        smtp.Connect(_mailSettings.Value.Host, _mailSettings.Value.Port, SecureSocketOptions.StartTls);
        smtp.Authenticate(_mailSettings.Value.Mail, _mailSettings.Value.Password);

        await smtp.SendAsync(email);
        smtp.Disconnect(true);
    }


class Program
    {
        static async Task Main(string[] args)
        {
            const string _appsettings = "appsettings.json";

            var builder = new HostBuilder()
                    .ConfigureAppConfiguration((hostingContext, config) =>
                    {
                        config.AddJsonFile(_appsettings, true);
                        config.AddEnvironmentVariables();

                        if (args != null)
                        {
                            config.AddCommandLine(args);
                        }
                    })
                    .ConfigureServices((hostContext, services) =>
                    {
                        services.AddOptions();
                        services.Configure<MailSettings>(hostContext.Configuration.GetSection("MailSettings"));
                        services.Configure<RabbitMQSettings>(hostContext.Configuration.GetSection("RabbitMQConnection"));

                        services.AddSingleton<IHostedService, MailingService>();
                        services.AddSingleton<IMailService, MailService>();
                    });

            await builder.RunConsoleAsync();
        }
    }

然后我把这个服务放到 dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 587
EXPOSE 465

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["ShoppingCart.Messaging.Service/ShoppingCart.Messaging.Service.csproj", "ShoppingCart.Messaging.Service/"]
RUN dotnet restore "ShoppingCart.Messaging.Service/ShoppingCart.Messaging.Service.csproj"
COPY . .
WORKDIR "/src/ShoppingCart.Messaging.Service"
RUN dotnet build "ShoppingCart.Messaging.Service.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "ShoppingCart.Messaging.Service.csproj" -c Release -o /app/publish

WORKDIR /app
COPY --from=build /app/build .
ENTRYPOINT ["dotnet", "ShoppingCart.Messaging.Service.dll"]

然后 docker-compose

  smtp:
   container_name: smtp
   build:
    context: .
    dockerfile: ShoppingCart.Messaging.Service/Dockerfile
   depends_on: [ rabbitmq ]
   ports:
    - "587:465"
    - "465:465"
   networks:
    - localdev

连接字符串到 RabbitMQ:

  "RabbitMQConnection": {
    "HostName": "localhost",
    "Username": "guest",
    "Password": "guest",
    "Port": 5672,
    "VirtualHost": "/",
    "AutomaticRecoveryEnabled": true,
    "RequestedHeartbeat": 30
  },

所以我在 docker 映像中运行它时遇到问题,每次我收到该服务时都无法到达主机。但是,可以连接其他服务。

标签: dockerdocker-composesmtp

解决方案


推荐阅读