从WPF应用程序使用默认电子邮件客户端发送电子邮件

时间:2020-03-25 11:28:19

标签: c# wpf email

我正在尝试找到一种可靠的方法,以便能够从WPF应用程序使用系统默认的外部邮件客户端发送电子邮件。

我知道类似的问题已经发布在stackoverflow(Open default mail client along with a attachment)上,但是它们已经过时了,我找不到足够强大的解决方案。

我的要求:

  • 在W10上的WPF桌面应用程序中工作
  • 使用外部电子邮件客户端,它是用户的电子邮件默认应用程序
  • 可与最受欢迎的电子邮件应用(Outlook,Thunderbird, Windows中的邮件应用程序)
  • 附件
  • HTML,纯文本和RTF正文
  • 电子邮件出现在草稿文件夹中,并被客户识别为新的未发送邮件

到目前为止我发现的东西:

  • mailto链接:不能执行,因为不支持附件
  • EML文件:必须明确设置“发件人”字段之类的问题,并且即使设置了“ X-Unsent:1”,某些客户端也不会将该消息标记为新的未发送消息
  • MAPI:由MS进行描述,他们本身不建议使用它。人们抱怨一些错误和问题。此外,默认邮件客户端在Windows 10上无法正确识别。

到目前为止,MAPI似乎是最好的选择,但老实说,我不喜欢其中任何一个,但找不到更好的选择。

1 个答案:

答案 0 :(得分:0)

您可以简单地使用Mailkit

  • 它可在任何使用.NET的应用程序中使用。
  • 它支持HTML,纯文本以及RTF正文
  • 是的,该电子邮件出现在草稿文件夹中并被识别为新邮件,您可以实现。
  • 它支持附件

用法非常简单,我可以举一个例子说明如何在我的爱好项目中使用它。

我没有使用附件,但是使用Mailkit可以很容易地做到这一点。 您可以检查他们的FAQ

但是无论如何,我将在这里发布我的使用方式。

1)首先创建消息类,它将负责处理与您要发送电子邮件的人有关的主题,内容和邮件信息。 使用简单的构造函数,您将把种子放入属性。

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();
                }
            }
        }
    }
}

最后一步是创建您的消息 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创建服务实例,但这取决于您。

待在家里,保持安全,祝您编码愉快。