C# 如何在WinForms中将图片发送到电子邮件正文?

C# 如何在WinForms中将图片发送到电子邮件正文?,c#,winforms,C#,Winforms,我在Visual Studio 2010中开发了一个WinC表单应用程序,该页面是一个bug报告表单-我设置了所有详细信息,电子邮件发送很好,等等。我的问题是在邮件正文中附加一个屏幕截图,我设置了代码,允许用户查找和选择他们拍摄的屏幕截图并附加到表单,但在正文中,它只是给了我文本系统.Windows.Forms.Picturebox,或者如果我尝试的话,它与.image有很多相似之处 我已经通过Google和此处查看过,但只能找到与嵌入图像或附加图像相关的主题,因此需要输入特定的文件夹/图像等,

我在Visual Studio 2010中开发了一个WinC表单应用程序,该页面是一个bug报告表单-我设置了所有详细信息,电子邮件发送很好,等等。我的问题是在邮件正文中附加一个屏幕截图,我设置了代码,允许用户查找和选择他们拍摄的屏幕截图并附加到表单,但在正文中,它只是给了我文本系统.Windows.Forms.Picturebox,或者如果我尝试的话,它与.image有很多相似之处

我已经通过Google和此处查看过,但只能找到与嵌入图像或附加图像相关的主题,因此需要输入特定的文件夹/图像等,而我的用户将从不同的位置附加他们自己的图像和名称。是否有任何方法可以在不必硬编码我的用户每次都必须遵循的位置和名称的情况下获取图像

代码如下:

    private void btnBugEmail_Click(object sender, EventArgs e)
{
    Cursor.Current = Cursors.WaitCursor;
    try
    {
        SmtpClient client = new SmtpClient("details here");
        MailMessage message = new MailMessage();
        message.From = new MailAddress("email here");
        string mailBox = txtBugAdd.Text.Trim();
        message.To.Add(mailBox);
        string mailFrom = txtEmailFromBug.Text.Trim();
        message.CC.Add(mailFrom);
        string mailCC = txtMailCCBug.Text.Trim();
        message.Bcc.Add(mailCC);
        message.IsBodyHtml = true;
        message.Body = "Bug Report - please see below: " +
            "\n" + "<br>" + "<b>" + "1. What were you doing at the time of the error?" + "</b>" +
                "\n" + "<br>" + rtbTimeOfError.Text +
                "\n" + "<br>" + "<b>" + "2. Are you able to repeat the steps and achieve the same error?" + "</b>" +
                "\n" + "<br>" + rtbCanRepeat.Text +
                "\n" + "<br>" + "<b>" + "3. Does this problem happen again if you change any of the details you have entered?" + "</b>" +
                "\n" + "<br>" + rtbChangeDetails.Text;
        message.Subject = "Bug Report";
        var image = pboxBugImage.Image;
        using(var ms = new MemoryStream()) 
        {
          image.Save(ms, ImageFormat.Jpeg);            
          message.Attachments.Add(new Attachment(ms, "Screenshot.jpg"));    
          client.Credentials = new System.Net.NetworkCredential("credentials here");
          client.Port = System.Convert.ToInt32(25);
          client.Send(message);
        }
        new Endpage().Show();
        this.Close();
    }
    catch
    {
        MessageBox.Show("my comment here");
    }
}

请看下面的链接

您不能将winforms控件放入mailmessage中:它是通过ToString。。。这就是你在邮件中看到的

范例


查看您的资源并处理memorystream。对于这个示例,我没有这样做,因为我在编辑器中编写了它,要么附加图像,要么将图像放在可访问的地方,并在主体中添加适当的URL/img元素。前者可能更合适。代码更新-我说的空是指当我检查电子邮件并单击图像附件查看它时,它显示Windows Photo Viewer无法显示此图片,因为文件为空。请调试邮件发送并查看var Imageif它有大小等等。。。然后查看MemoryStream是否在Image.SaveDebug结果后保留一些字节-大小读取为高度173,宽度167,IsEmpty false。MemoryStream-这部分我不太确定?看看Length女士。。。它必须大于0断点,位于message.Attachments.Addnew Attachmentms,Screenshot.jpg;或者只做Console.WriteLinems.Length;在使用块内部的某个地方
private void btnBugEmail_Click(object sender, EventArgs e)
{
    Cursor.Current = Cursors.WaitCursor;
    try
    {
        SmtpClient client = new SmtpClient("details here");
        MailMessage message = new MailMessage();
        message.From = new MailAddress("email here");
        string mailBox = txtBugAdd.Text.Trim();
        message.To.Add(mailBox);
        string mailFrom = txtEmailFromBug.Text.Trim();
        message.CC.Add(mailFrom);
        string mailCC = txtMailCCBug.Text.Trim();
        message.Bcc.Add(mailCC);
        message.IsBodyHtml = true;
        message.Body = "Bug Report - please see below: " +
            "\n" + "<br>" + "<b>" + "1. What were you doing at the time of the error?" + "</b>" +
                "\n" + "<br>" + rtbTimeOfError.Text +
                "\n" + "<br>" + "<b>" + "2. Are you able to repeat the steps and achieve the same error?" + "</b>" +
                "\n" + "<br>" + rtbCanRepeat.Text +
                "\n" + "<br>" + "<b>" + "3. Does this problem happen again if you change any of the details you have entered?" + "</b>" +
                "\n" + "<br>" + rtbChangeDetails.Text;
        message.Subject = "Bug Report";
        var image = pboxBugImage.Image;
        using(var ms = new MemoryStream()) 
        {
          image.Save(ms, ImageFormat.Jpeg);            
          message.Attachments.Add(new Attachment(ms, "Screenshot.jpg"));    
          client.Credentials = new System.Net.NetworkCredential("credentials here");
          client.Port = System.Convert.ToInt32(25);
          client.Send(message);
        }
        new Endpage().Show();
        this.Close();
    }
    catch
    {
        MessageBox.Show("my comment here");
    }
}