【问题标题】:cannot convert from 'System.Drawing.Bitmap' to 'string', related to SMTP attachments无法从 'System.Drawing.Bitmap' 转换为 'string',与 SMTP 附件有关
【发布时间】:2020-12-05 18:37:55
【问题描述】:

下面的函数负责获取面板的屏幕截图并将其用作电子邮件中的附件,而不是将其存储在本地机器中。

我设法做到了,但有一个小问题,它给了我这个错误:

无法从“System.Drawing.Bitmap”转换为“字符串”

我知道有类似的问题,但我不知道如何解决这个问题。

private void btnSend_Click(object sender, EventArgs e)
{
    //using (var bmp = new Bitmap(workPanel.Width, workPanel.Height))
    //{
    //  workPanel.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
    //  bmp.Save(@"images/" + name.Text + ".png");
    //}
    try
    {
        using (var bmp = new Bitmap(workPanel.Width, workPanel.Height))
        {
            MailMessage mail = new MailMessage();
            SmtpClient smtp = new SmtpClient("smtp.gmail.com");
            mail.From = new MailAddress("email@gmail.com");
            mail.To.Add(txtTo.Text); // Receivers email address comes here
            mail.Subject = txtTitle.Text;
            mail.Body = txtBody.Text;
            mail.IsBodyHtml = true; // TO HAVE THE BODY AS HTML

            System.Net.Mail.Attachment attachment;
            //attachment = new System.Net.Mail.Attachment(lblLocation.Text);
            attachment = new System.Net.Mail.Attachment(bmp); // <-------- ERROR COMES HERE
            mail.Attachments.Add(attachment);

            smtp.Port = 587;
            smtp.Credentials = new System.Net.NetworkCredential("email@gmail.com", "password");
            smtp.EnableSsl = true;
            smtp.Send(mail);
            MessageBox.Show("Mail has been sent");
        }
    }
    catch(Exception ex)
    {
        //MessageBox.Show(ex.Message);
        MessageBox.Show("Something went wrong, this might be a problem from our end.\n" + ex.Message, "Please contact support team");
    }
}

【问题讨论】:

标签: c# .net winforms smtp


【解决方案1】:

错误的原因很简单:Attachment 类没有采用 BitMap 的构造函数。

幸运的是,有一个构造函数接受一个流。唉,BitMap 没有办法将其转换为 Stream。幸运的是 BitMap 实现了 ISerializable,所以我们可以将 BitMap 保存在流中,然后使用 Attachment(Stream, ...) 构造函数

让我们创建扩展方法来将 BitMap 转换为 Stream,并将 Stream 转换为 Attachment。见extension methods demystified

static System.IO.Stream ToStream(this System.Drawing.BitMap bmp)
{
    // TODO: exception if bmp null
    var stream = new MemoryStream();
    Bitmap.Save(ms, Bitmap.RawFormat);
    return stream;
}
static System.Net.Mail.Attachment ToAttachment(this System.Drawing.BitMap bmp)
{
    // TODO: bmp is null

    const string contentType = "image/jpg";
    return new System.Net.Mail.Attachment(bmp.ToStream(), contentType);
}

用法:

BitMap bmp = ...
Attcahment attachement = bmp.ToAttachment();

【讨论】:

    猜你喜欢
    • 2020-06-11
    • 1970-01-01
    • 2015-07-31
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多