【问题标题】:Deleting selected attachment from e-mail C#从电子邮件 C# 中删除选定的附件
【发布时间】:2018-10-23 10:47:14
【问题描述】:

我正在使用 smtp 协议编写电子邮件发件人。我使用OpenFileDialog 选择附件,然后文件名出现在附件列表框中。

我使用了两个列表来获得文件名和大小。当我在列表框中选择文件名并单击名为“Delete attachment”的按钮时,该按钮应从MailMessage 中删除选定的附件,其名称来自附件列表框,大小来自 sizeListBox。我做了最后两件事,但我不知道如何做第一件事,因为显示错误

(MailMessage 始终为空)。

MailMessage msg; //MailMessage is always nul
List<int> sizeAttachement = new List<int>();
List<string> nameAttachement = new List<string>();
if(ofd.ShowDialog()==DialogResult.OK) 
{

    path = ofd.FileName.ToString();
    FileInfo info = new FileInfo(ofd.FileName);
    sizeAttachement.Add(Convert.ToInt32(info.Length / (1024 * 1024)));
    nameAttachement.Add(ofd.FileName);
}
private void delAtchButton_Click(object sender, EventArgs e)
{
     if (attachementListBox.SelectedIndex == -1)
     {

     }
     else
     {
            ListBox.SelectedObjectCollection selectedItems = new 
            ListBox.SelectedObjectCollection(attachementListBox);
            selectedItems = attachementListBox.SelectedItems;
            if (attachementListBox.SelectedIndex != -1)
            {
                int attachementListBoxindex = attachementListBox.SelectedIndex;
                for (int i = selectedItems.Count - 1; i >= 0; i--)
                attachementListBox.Items.Remove(selectedItems[i]);
                msg.Attachments.RemoveAt(attachementListBoxindex); //Error always occurs     

              attachementProgressBar.Increment(-sizeAttachement[attachementListBoxindex]);
                sizeAttachement.RemoveAt(attachementListBoxindex);
                procentage = attachementProgressBar.Value * 4;
                procentageLabel.Text = Convert.ToString(procentage) + "%";


                for (int z = 0; z <= nameAttachement.Count; z++)
                {
                    foreach (Attachment attachment in msg.Attachments)
                    {
                        if (attachment.Name == Convert.ToString(nameAttachement[z]))
                        {
                            msg.Attachments.Remove(attachment); //Error to
                            break;
                        }
                    }
                }}                                                           

【问题讨论】:

  • msg 始终为空,因为您没有实例化它。 msg = 新邮件消息。

标签: c# email attachment delete-file


【解决方案1】:

试试这个解决方案。你应该摆脱错误。

  MailMessage msg  = new MailMessage();
    List<int> sizeAttachement = new List<int>();
    List<string> nameAttachement = new List<string>();
    if(ofd.ShowDialog()==DialogResult.OK) 
    {

        path = ofd.FileName.ToString();
        FileInfo info = new FileInfo(ofd.FileName);
        sizeAttachement.Add(Convert.ToInt32(info.Length / (1024 * 1024)));
        nameAttachement.Add(ofd.FileName);
    }
    private void delAtchButton_Click(object sender, EventArgs e)
    {
         if (attachementListBox.SelectedIndex == -1)
         {

         }
         else
         {
                ListBox.SelectedObjectCollection selectedItems = new 
                ListBox.SelectedObjectCollection(attachementListBox);
                selectedItems = attachementListBox.SelectedItems;
                if (attachementListBox.SelectedIndex != -1)
                {
                    int attachementListBoxindex = attachementListBox.SelectedIndex;
                    for (int i = selectedItems.Count - 1; i >= 0; i--)
                    {
                    attachementListBox.Items.Remove(selectedItems[i]);
                    msg.Attachments.RemoveAt(i); //Error always occurs                
                    attachementProgressBar.Increment(-sizeAttachement[i]);
                    sizeAttachement.RemoveAt(i);
                    procentage = attachementProgressBar.Value * 4;
                    procentageLabel.Text = Convert.ToString(procentage) + "%"; }

                    for (int z = 0; z <= nameAttachement.Count; z++)
                    {
                        foreach (Attachment attachment in msg.Attachments)
                        {
                            if (attachment.Name == Convert.ToString(nameAttachement[z]))
                            {
                                msg.Attachments.Remove(attachment); //Error to
                                break;
                            }
                        }
                    }
}  

【讨论】:

  • msg.Attachments.RemoveAt(attachmentListBoxindex);我得到 System.ArgumentOufOfRangeException 索引超出范围。
  • 更新了答案。我们需要使用 'i' 进行迭代以删除索引 i 处的附件
  • 但是我得到一个错误“名称“i”在当前上下文中不存在”
  • 我前段时间试过,但也显示错误“索引超出范围”。我检查了索引,“i”与我在上面的代码中使用的 attachmentListBoxindex 相同。所以我的问题是附件是如何存储在 MailMessage 中的?因为我找不到有关它的信息。
  • 我不得不用 z 变量改变 for 循环:for (int z = nameAttachement.Count-1; z >=0; z--) 然后它开始在这两种情况下工作。谢谢你的帮助:)
【解决方案2】:

你还没有像这样初始化 MailMessage:

msg = new MailMessage();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 2010-09-27
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    相关资源
    最近更新 更多