【问题标题】:Send email with default email client from a WPF app从 WPF 应用程序使用默认电子邮件客户端发送电子邮件
【发布时间】:2020-11-24 16:04:54
【问题描述】:

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

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

我的要求:

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

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

  • mailto 链接:不支持,因为不支持附件
  • EML 文件:必须明确设置 from 字段等问题,并且即使设置了“X-Unsent: 1”,某些客户端也不会将消息标记为新的未发送消息
  • MAPI:被 MS 弃用,他们自己不建议使用它。人们抱怨几个错误和问题。此外,默认邮件客户端在 Windows 10 上也无法正确识别。

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

【问题讨论】:

标签: c# wpf email


【解决方案1】:

您可以简单地使用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();
                }
            }
        }
    }
}

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

待在家里,注意安全,祝您编码愉快。

【讨论】:

  • 您好,感谢您的详细回答,但我需要通过在用户计算机上设置为默认设置的外部邮件应用程序发送我的电子邮件。我们已经有了内置电子邮件客户端的解决方案,但我们还必须支持尽可能多的 3rdparty 电子邮件应用程序。
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 2022-01-13
  • 2014-07-11
  • 1970-01-01
相关资源
最近更新 更多