【问题标题】:How to send an email with an attachment from a Windows Mobile 6 device如何从 Windows Mobile 6 设备发送带有附件的电子邮件
【发布时间】:2012-11-23 20:10:18
【问题描述】:

我了解到 .NET CF 不支持 SmtpClient 类。它最好的是我不想使用的 PocketOutlook 类。

我发现 OpenNETCF 确实有一个 OpenNETCF.Net.Mail 命名空间,它使 SmtpClient 类可用。不幸的是,它只是部分实现,不直接支持附件:http://community.opennetcf.com/forums/t/11325.aspx

该帖子表明仍然可以使用多部分 MIME 消息添加附件。

更新

在阅读 ctacke 的建议以查看 w3.org 文章后,我尝试像这样更改我的方法:

using OpenNETCF.Net.Mail;

    public void EmailPicture(string picLoc)
    {
        var smtpClient = new SmtpClient
                             {
                                 Host = MailProperties.SmtpHost,
                                 Credentials = new SmtpCredential(MailProperties.UserName, MailProperties.Password, MailProperties.Domain),
                                 DeliveryMethod = SmtpDeliveryMethod.Network,
                                 Port = MailProperties.Port
                             };

        var message = new MailMessage();
        var fromAddress = new MailAddress(MailProperties.From);

        message.To.Add(MailProperties.To);
        message.From = fromAddress;
        message.Subject = "Requested Picture";
        message.IsBodyHtml = false;

        message.Headers.Add("MIME-Version", "1.0");
        message.Headers.Add("Content-Type", "multipart/mixed; boundary=\"simple boundary\"");

        var bodyBuilder = new StringBuilder();
        //add text
        bodyBuilder.Append("--simple boundary\r\n");
        bodyBuilder.Append("Content-type: text/plain; charset=us-ascii\r\n\r\n");
        bodyBuilder.Append("Requested Picture is attached.\r\n\r\n");
        //add attachment
        bodyBuilder.Append("--simple boundary\r\n");
        bodyBuilder.Append("Content-type: image/jpg;\r\n\r\n");
        var fs = new FileStream(picLoc, FileMode.Open, FileAccess.Read);
        var picData = new byte[fs.Length];
        fs.Read(picData, 0, picData.Length);
        bodyBuilder.Append(picData);
        bodyBuilder.Append("\r\n\r\n");
        bodyBuilder.Append("--simple boundry--\r\n");

        message.Body = bodyBuilder.ToString();

        smtpClient.Send(message);
    }

我收到的电子邮件最终看起来像这样:

--简单边界 内容类型:文本/纯文本; charset=us-ascii

请求的图片已附上。

--简单边界 内容类型:图片/jpg;

System.Byte[]

--简单边界--

我有格式问题吗?还是缺少标题?

【问题讨论】:

  • 我从来没有做过这个客户端,但是你有什么办法可以把它交给一个可以发送电子邮件的存储过程?
  • 我没有考虑过存储过程。我不知道可以写一个来发送电子邮件。我正在考虑编写一个网络服务来传递附件,然后发送电子邮件。如果 .NET CF 没有那么糟糕,那将是一个更简洁的实现。
  • 您为什么不想使用 PocketOutlook?它是所有 Windows Mobile Pro 设备的标准配置和易于使用的 API。
  • 是的,不幸的是,CF 的功能不如其臃肿的桌面同胞...

标签: c# windows-mobile compact-framework opennetcf


【解决方案1】:

正如您指向的论坛帖子所说,附件未在 OpenNETCF 邮件代码中实现。我们只是没有时间去做。带有附件的电子邮件只是多部分 MIME 消息,它不是非常复杂,并且是 covered in RFC 1341。您必须扩展代码以构建多部分 MIME 消息,然后设置适当的内容类型。

【讨论】:

  • 我需要使用 OpenNETCF.Net.Mime 命名空间中的 ContentType 或 ContentDisposition 类吗?
  • 嗨 ctacke,假设 2019 年仍然如此,我是否正确?
【解决方案2】:

我做了一个粗略的工作,创建了自己的电子邮件类,它的方法和属性名称与 .NET 的 SMTP 使用的名称完全相同。

在我的类中,如果有附件,当我的电子邮件类的 Send 被调用时,它会被复制到我们的服务器。我的电子邮件也只发送到同一台服务器,发送到一个最小的应用程序,该应用程序位于 TCP 连接上并侦听消息。

Server一旦收到信息,就有能力构造一个SMTP邮件,使用复制过来的文件创建一个附件(如果附件路径为NULL,则没有附件),并将邮件发送到该地址在我的电子邮件课程的收件人、抄送和/或密件抄送字段中指定。

这是一个较长的完成它的方法,但它就像一个冠军!

代码相当大,但这更多是因为我希望它可以与我编写的应用程序套件中的其他东西一起使用。此外,显然还有两个项目:一个用于移动设备,一个用于 Windows 或 Web(服务器)。

【讨论】:

    猜你喜欢
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 2015-03-13
    • 2012-06-07
    相关资源
    最近更新 更多