Отправка электронной почты с почтовым клиентом по умолчанию из приложения WPF - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь найти надежный способ отправки электронной почты с помощью внешнего почтового клиента по умолчанию из моего приложения WPF.

Я знаю, что подобные вопросы уже размещены в stackoverflow ( Открыть по умолчанию почтовый клиент вместе с вложением ), но они устарели, и я не смог найти достаточно надежного решения.

Мои требования:

  • Работает из WPF настольное приложение на W10
  • Используйте внешний почтовый клиент, который является приложением пользователя по умолчанию для электронной почты
  • Работает с самыми популярными почтовыми приложениями (Outlook, Thunderbird, почтовое приложение в Windows)
  • Вложения
  • HTML, простой текст и текст в формате RTF
  • Письмо появляется в папке черновиков и распознается клиентами как новое неотправленное сообщение

Вещи, которые я нашел до сих пор:

  • mailto links: no- go, потому что нет поддержки вложений
  • EML-файл: такие проблемы, как поле from, должны быть явно установленным, а также месса Некоторые клиенты не помечают ge как новое неотправленное сообщение, даже если для параметра «X-Unsent: 1» установлено значение
  • MAPI: в зависимости от MS, и они сами не рекомендуют его использовать. Люди жалуются на несколько ошибок и проблем. Также почтовый клиент по умолчанию не распознается должным образом на Windows 10.

Пока что MAPI кажется лучшим вариантом, но, честно говоря, мне не нравится ни один из них, но я не смог найти ни одного лучшая альтернатива.

1 Ответ

0 голосов
/ 25 марта 2020

Вы можете просто использовать Mailkit

  • Он работает из любого приложения, которое использует. NET.
  • Он поддерживает HTML, обычный текст, а также текст RTF
  • Да, электронная почта появляется в папке черновиков и распознается как новая, ее можно достичь.
  • Он поддерживает вложения

Использование довольно просто, я могу привести пример того, как я использую его в своем хобби-проекте.

Я не использую вложения, но с Mailkit, это очень легко сделать. Вы можете проверить их FAQ

Но в любом случае я опубликую здесь, как я его использую.

1) Сначала создайте класс сообщения, который будет отвечать за обработку Subject, содержание и информация о человеке, которому вы отправляете письмо. С помощью простого конструктора вы начнете вводить свои свойства.

using System;
using MimeKit;

namespace SomeNamespace
{
    public class Message
    {
        public List<MailboxAddress> To { get; set; }
        public string Subject { get; set; }
        public string Content { get; set; }

        public Message(IEnumerable<string> to, string subject, string content)
        {
            To = new List<MailboxAddress>();

            To.AddRange(to.Select(x => new MailboxAddress(x)));
            Subject = subject;
            Content = content;
        }
    }
}

2) Вам также понадобится ваш класс конфигурации SMTP, который будет содержать информацию о вашей электронной почте. (Откуда вы будете отправлять почту)

using System;
namespace SomeNamespace
{
    public class EmailConfiguration
    {
        public string SMTPFrom { get; set; }
        public string SMTPHost { get; set; }
        public int SMTPPort { get; set; }
        public string SMTPLogin { get; set; }
        public string SMTPPassword { get; set; }
    }
}

3) Затем вы создадите свой простой интерфейс

  public interface IEmailSender
    {
        void SendEmail(Message message);
    }

4) Затем вы создадите реализацию вашего сервиса.

using System;
using MailKit.Net.Smtp;
using MimeKit;
using SomeNamespace.Configuration;
using SomeNamespace.Services.Interfaces;

namespace SomeNamespace
{
    public class EmailSender : IEmailSender
    {
        private readonly EmailConfiguration _emailConfig;

        public EmailSender(EmailConfiguration emailConfig)
        {
            _emailConfig = emailConfig;
        }

        public void SendEmail(Message message)
        {
            var emailMessage = CreateEmailMessage(message);

            Send(emailMessage);
        }

        private MimeMessage CreateEmailMessage(Message message)
        {
            var emailMessage = new MimeMessage();
            emailMessage.From.Add(new MailboxAddress(_emailConfig.SMTPFrom));
            emailMessage.To.AddRange(message.To);
            emailMessage.Subject = message.Subject;
            emailMessage.Body = new TextPart(MimeKit.Text.TextFormat.Text) { Text = message.Content };

            return emailMessage;
        }

        private void Send(MimeMessage mailMessage)
        {
            using (var client = new SmtpClient())
            {
                try
                {
                    client.Connect(_emailConfig.SMTPHost, _emailConfig.SMTPPort, true);
                    client.AuthenticationMechanisms.Remove("XOAUTH2");
                    client.Authenticate(_emailConfig.SMTPLogin, _emailConfig.SMTPPassword);

                    client.Send(mailMessage);
                }
                catch(Exception message)
                {
                    Console.WriteLine(message);
                    throw;
                }
                finally
                {
                    client.Disconnect(true);
                    client.Dispose();
                }
            }
        }
    }
}

Последний шаг - создание моделей Message и EmailConfiguration . Создайте экземпляр EmailSender и отправьте электронное письмо.

var message = new Message("whotosend@gmail.com", "Some example Subject", "Some example content");

var emailConfiguration = new EmailConfiguration()
{
    SMTPFrom = "yourSmtpAdress",
    SMTPHost = "yourSmtpHost",
    SMTPLogin = "yourSmtpLogin",
    SMTPPassword = "yourSmtpPassword",
    SMTPPort = 465
};

var _emailSender = new EmailSender(emailConfiguration);

_emailSender.SendEmail(message);

Конечно, вы можете использовать DI для создания своих экземпляров службы, но это зависит от вас.

Оставайся дома, будь в безопасности, с sh тебя радует кодирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...