发送带附件C#的邮件

时间:2012-10-04 21:44:25

标签: c# asp.net .net web-farm

我正在编写一个应该发送电子邮件的应用程序,最多包含3个附件。

它只是一个非常简单的Web表单,有3个FileUpload控件可以浏览可能的附件。

应用程序部署在webfarm中,当然也可以在服务器端运行。

我设法让它发送电子邮件,但我的附件有问题。现在,我正在使用此过程附加文件:

                if (fuAttatchment.HasFile)
                {                        
                    fuAttatchment.SaveAs(Server.MapPath(fuAttatchment.FileName));
                    MyMessage.Attachments.Add(new System.Net.Mail.Attachment(Server.MapPath(fuAttatchment.FileName))); 

                    filesize += fuAttatchment.PostedFile.ContentLength;
                }

我提交的错误如下:

  

发送失败:System.UnauthorizedAccessException:访问路径' E:\ Inetpub \ IS \ MSTicketRequest \ wallpaper-3010.jpg'被拒绝。在System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)at System.IO.FileStream.Init(String path,FileMode mode,FileAccess access,Int32 rights,Boolean useRights,FileShare share,Int32 bufferSize,FileOptions options,SECURITY_ATTRIBUTES secAttrs) System.IO.FileStream上的System.IO.FileStream..ctor(String path,FileMode mode,FileAccess访问,FileShare共享,Int32 bufferSize,FileOptions选项,String msgPath,Boolean bFromProxy)中的,String msgPath,Boolean bFromProxy,Boolean useLongPath)位于System.Web.HttpPostedFile.SaveAs(String filename)的System(Web路径,FileMode模式),位于MSTicketRequest.WebForm1.btnSubmit_Click的System.Web.UI.WebControls.FileUpload.SaveAs(String filename)处。对象发送者,EventArgs e )在C:\ Users \ ggruschka \ Desktop \ ggruschka \ MSTicketRequest \ MSTicketRequest \ Default.aspx.cs:第54行

我无法弄清楚为什么会发生这种情况,可能是我在安全政策或其他类似方面遗漏了一些内容。

非常感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

而不是:

fuAttatchment.SaveAs(Server.MapPath(fuAttatchment.FileName));
                    MyMessage.Attachments.Add(new System.Net.Mail.Attachment(Server.MapPath(fuAttatchment.FileName))); 

这样做:

fuAttatchment.SaveAs("somewhere local"+fuAttatchment.FileName);
                    MyMessage.Attachments.Add(new System.Net.Mail.Attachment("somewhere local"+fuAttatchment.FileName)); 

您无需在服务器上保存附件!

答案 1 :(得分:1)

看起来运行该站点的用户无权写入目标文件路径。检查目录的安全权限,并确保IIS用户具有写访问权。

答案 2 :(得分:0)

取决于您的应用程序池的类型。但如果是网络服务,你必须添加网络服务。
用于ApplicationPoolIdentity的IIS_Users,但我不确定这个。 http://www.windowsecurity.com/articles/understanding-windows-ntfs-permissions.html

如果这样做有帮助,您可以尝试删除只读选项。

答案 3 :(得分:0)

您通过Gmail帐户发送电子邮件。这是怎么做的(如果它有帮助,我不知道)。 1.您需要在上传附件的文本框中。 2.按钮'浏览'和'OpenFileDialog1'。在“浏览”按钮中放置此

private void btnBrowse_Click(object sender, EventArgs e)
    {
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            txt_attachment.Text = openFileDialog1.FileName;
        }
    }

您需要使用“发送附件”按钮进行放置:

MailMessage mail = new MailMessage(txt_gmail.Text, txt_to.Text, txt_subject.Text, txt_body.Text);
        mail.Attachments.Add(new Attachment(txt_attachment.Text));
        SmtpClient client = new SmtpClient(txt_server.Text);
        client.Port = 587;
        client.Credentials = new System.Net.NetworkCredential(txt_gmail.Text, txt_password.Text);
        client.EnableSsl = true;
        client.Send(mail);
        MessageBox.Show("Mail sent", "Succes", MessageBoxButtons.OK);
        foreach (Control control in this.Controls)
        {
            TextBox box = control as TextBox;
            if (box != null)
            {
                box.Text = "";
            }
        }
    }

最后一件事(因为当你这样做时会显示一些错误)你需要创建Gmail.dll文件。以下是链接:Here you can create Gmail.dll

我希望这会有所帮助。