【问题标题】:How to send an RFC822 file in c#如何在 C# 中发送 RFC822 文件
【发布时间】:2014-11-20 02:03:22
【问题描述】:

我正在尝试转换一些 Python 代码以在 .Net 网站中使用。该代码检索以 RFC822 格式存储的消息,并使用以下命令再次将消息发送到 SMTP 服务器:

mail from: blah blah
rcpt to: blah blah
data
<send the text from the RFC822 file here>
.

因此不需要解析 RFC822 文件(幸运的是!)。在 Python 中,这很简单:

smtp = smtplib.SMTP(_SMTPSERVER)
smtp.sendmail(_FROMADDR, recipient, msg)

文件已读入变量msg的位置。有没有简单的方法在 C# 中做到这一点?

内置的 C# SMTP 对象不提供执行此操作的方法,或者至少我还没有找到方法。它们似乎是基于通过分别提供地址、主题和正文来构建 MailMessage 的原则。 SmtpClient 有一个 Send(string, string, string, string) 方法,但这又需要一个单独的主题和正文,所以我猜它会为你构造 RFC822 格式的消息。

如有必要,我可以编写自己的类来发送邮件。这是一个如此简单的要求,不会花很长时间。但是,如果有办法使用标准库,它们的错误可能比我的代码少。

【问题讨论】:

    标签: c# smtp rfc822


    【解决方案1】:

    这很容易做到,你只需要从 nuget 安装 MailKit 和 MimeKit。 请注意,如果您不需要身份验证,将“useSsl”设置为 false 是不够的,它不起作用。您需要设置 MailKit.Security.SecureSocketOptions.None

     var message = MimeMessage.Load("pathToEml");
                    using (var client = new MailKit.Net.Smtp.SmtpClient())
                    {
                        client.Connect("smtp.yourserver.yourdomain", 25, MailKit.Security.SecureSocketOptions.None);  //set last param to true for authentication
                        //client.Authenticate("username", "password");
                        client.Send(message);
                        client.Disconnect(true);
                    }
    

    【讨论】:

      【解决方案2】:

      我建议使用MimeKit 解析邮件文件,然后使用MailKit 通过SMTP 发送。 MailKit 基于 MimeKit,因此它们可以很好地协同工作,并且 MailKit 的 SmtpClient 优于 System.Net.Mail 的实现。

      解析消息就这么简单:

      var message = MimeMessage.Load (fileName);
      

      发送消息就像这几行一样简单:

      using (var client = new SmtpClient ()) {
          client.Connect ("smtp.gmail.com", 465, true);
          client.Authenticate ("username", "password");
          client.Send (message);
          client.Disconnect (true);
      }
      

      【讨论】:

      • 感谢 Jeffrey,但无需解析 RFC822 文件。它只需要按原样发送一个套接字到 SMTP 服务器。我花了大约一个小时编写了一个使用 TcpClient 发送文件的简单类。当我添加所有异常跟踪时,多项式对 50 行的估计相当乐观,但这仍然是一项很快的工作。
      【解决方案3】:

      你是对的,内置的东西并没有为此提供解决方案。

      我的建议是简单地编写一些代码,使用 TcpClient 和 StreamReader / StreamWriter 与 SMTP 服务器交互。它不需要超过 50 行代码。

      【讨论】:

      • 您不想重写 SmptClient 的可配置性。如果 OP 想要使用身份验证、加密、不同的服务器等,您需要使用代码读取配置。
      • @CodeCaster 为什么不呢? OP 的要求显然不符合 SmtpClient 的设计目的,而且他似乎只支持单个 SMPT 服务器(或其中的一小部分)。手动解决方案应该可以很好地完成工作。为此目的,SMTP 协议非常简单。
      • 谢谢,我怀疑我最终会自己做。我有一个我在石器时代写的 C++ SMTP 类,我可以很快在 C# 中重做它,所以没什么大不了的。如果没有建议,我明天会接受。
      猜你喜欢
      • 2021-04-09
      • 2011-10-21
      • 2021-12-31
      • 2020-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 2017-07-29
      相关资源
      最近更新 更多