2011-12-13 13 views
6

Sto cercando di ottenere un file caricato da inviare come allegato nel mio file ashx. Ecco il codice che sto usando:Invia file caricato come allegato

HttpPostedFile fileupload = context.Request.Files[0]; 

//filename w/o the path 
string file = Path.GetFileName(fileupload.FileName); 

MailMessage message = new MailMessage(); 

//*****useless stuff******** 
message.To.Add("[email protected]"); 
message.Subject = "test"; 
message.From = new MailAddress("[email protected]"); 
message.IsBodyHtml = true; 
message.Body = "testing"; 
//*****useless stuff******** 

//Fault line 
message.Attachments.Add(new Attachment(file, MediaTypeNames.Application.Octet)) 

//Send mail 
SmtpClient smtp = new System.Net.Mail.SmtpClient("xxxx", 25); 
smtp.UseDefaultCredentials = false; 
smtp.Credentials = new NetworkCredential("xxx", "xxxx"); 
smtp.Send(message); 

Sono in grado di inviare l'e-mail senza l'allegato. Devo prima salvare il file e poi aggiungerlo all'allegato?

+0

È necessario prima salvare il file; vedi una domanda simile che riguarda il collegamento di un'immagine a un messaggio di posta qui: http://stackoverflow.com/questions/6105904/how-to-send-image-as-attachement-without-saving-it-in-file-system – dash

+0

Sì, ho capito. Non ho potuto utilizzare Server.MapPath(). la soluzione è HttpContext.Current.Server.MapPath(). – nikhil

risposta

2

NomeFile è il nome del file sul client, non sul server. Sarà necessario utilizzare SaveAs o InputStream per ottenere qualsiasi contenuto nell'allegato.

Here is a link alla documentazione MSDN.

+0

Grazie Aggiornamento del codice nella domanda. – nikhil

+2

NON è necessario salvarlo prima sul disco ... è una cattiva pratica. –

+0

@SerjSagan: mi dispiace, ma non sei corretto. È una buona pratica in qualsiasi tipo di ambiente aziendale o in qualsiasi ambiente che si preoccupi della sicurezza. Il salvataggio su disco consente ai controllori antivirus di eseguire la scansione del file prima di spostarsi in qualsiasi posizione al di fuori del server Web, impedendo così la diffusione di potenziali malware nella rete interna. –

3

Si può fare in questo modo:

private void btnSend_Click(object sender,EventArgs e) 
{ 
    MailMessage myMail = new MailMessage(); 
    myMail.To = this.txtTo.Text; 
    myMail.From = "<" + this.txtFromEmail.Text + ">" + this.txtFromName.Text; 
    myMail.Subject = this.txtSubject.Text; 

    myMail.BodyFormat = MailFormat.Html; 
    myMail.Body = this.txtDescription.Text.Replace("\n","<br>"); 

    //*** Files 1 ***// 
    if(this.fiUpload1.HasFile) 
    { 
     this.fiUpload1.SaveAs(Server.MapPath("MyAttach/"+fiUpload1.FileName)); 
     myMail.Attachments.Add(new MailAttachment(Server.MapPath("MyAttach/"+fiUpload1.FileName))); 
    } 

    //*** Files 2 ***// 
    if(this.fiUpload2.HasFile) 
    { 
     this.fiUpload2.SaveAs(Server.MapPath("MyAttach/"+fiUpload2.FileName)); 
     myMail.Attachments.Add(new MailAttachment(Server.MapPath("MyAttach/"+fiUpload2.FileName))); 
    } 


    SmtpMail.Send(myMail); 
    myMail = null; 
    this.pnlForm.Visible = false; 
    this.lblText.Text = "Mail Sending."; 
} 
+0

Funzionerebbe in un file aspx. Sto usando ashx – nikhil

+0

@nikhil sì, puoi cambiarlo dipende dalle tue esigenze ... –

12

NON è necessario, né si deve, salvare gli allegati al server inutilmente. Ecco un articolo su come farlo in ASP.NET WebForms http://www.aspsnippets.com/articles/Attach-files-to-email-without-storing-on-disk-using-ASP.Net-FileUpload-Control.aspx

farlo in C# MVC è ancora più bello:

 public IEnumerable<HttpPostedFileBase> UploadedFiles { get; set; } 

     var mailMessage = new MailMessage(); 
     // ... To, Subject, Body, etc 

     foreach (var file in UploadedFiles) 
     { 
      if (file != null && file.ContentLength > 0) 
      { 
       try 
       { 
        string fileName = Path.GetFileName(file.FileName); 
        var attachment = new Attachment(file.InputStream, fileName); 
        mailMessage.Attachments.Add(attachment); 
       } 
       catch(Exception) { } 
      } 
     } 
3

Seguendo the footsteps di Serj Sagan, ecco un gestore utilizzando WebForms, ma con <input type="file" name="upload_your_file" /> al posto del <asp:FileUpload> di controllo:

HttpPostedFile file = Request.Files["upload_your_file"]; 
if (file != null && file.ContentLength > 0) 
{ 
    string fileName = Path.GetFileName(file.FileName); 
    var attachment = new Attachment(file.InputStream, fileName); 
    mailMessage.Attachments.Add(attachment); 
} 

Questo è utile se non avete bisogno (o non è possibile aggiungere) un runat="server" sul tag form.

Problemi correlati