2

Ich habe also versucht, mehrere Dateien auf der Website, die ich mache, anzuhängen/hochzuladen. Der Name, E-Mail, Betreff & Nachricht wird gesendet, aber in der Nachricht ist kein Anhang vorhanden. Die Dateien werden im Ordner "~/App_Data/uploads" gespeichert, sie sind dort, aber ich erhalte sie nicht per E-Mail. Ich kann nicht herausfinden, was falsch ist. Bitte hilf mir. Ich bin neu in dieser Art von Sachen. Vielen Dank! Hier ist der Ansicht Code:Attachment sendet keine ASP.NET MVC

@using (Html.BeginForm("Index", "Home", null, FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @Html.AntiForgeryToken() 
    <div class="col-md-4"> 
     <div class="contact_form block"> 
      <div class="row"> 
       <div class="col-md-12 col-sm-12"> 
        <div id="note"></div> 
       </div> 
      </div> 
      <div id="fields"> 

       <div class="col-md-12 col-sm-6"> 
        @Html.LabelFor(m => m.FromName) 
        @Html.TextBoxFor(m => m.FromName, new { @class = "form-control" }) 
        @Html.ValidationMessageFor(m => m.FromName) 
       </div> 
       <div class="col-md-12 col-sm-6"> 
        @Html.LabelFor(m => m.FromEmail) 
        @Html.TextBoxFor(m => m.FromEmail, new { @class = "form-control" }) 
        @Html.ValidationMessageFor(m => m.FromEmail) 
       </div> 
       <div class="clear"></div> 
       <div class="col-md-12 col-sm-6"> 
        @Html.LabelFor(m => m.FromSubject) 
        @Html.TextBoxFor(m => m.FromSubject, new { @class = "form-control" }) 
        @Html.ValidationMessageFor(m => m.FromSubject) 
       </div> 
       <div class="col-md-12 col-sm-6"> 
        <form action="" method="post" enctype="multipart/form-data"> 

         <label for="file1">Attachments</label> 
         <input type="file" name="files" id="file1" multiple/> 

        </form> 
       </div> 
       <div class="col-md-12"> 
        @Html.LabelFor(m => m.Message) 
        @Html.TextAreaFor(m => m.Message, new { @class = "form-control" }) 
        @Html.ValidationMessageFor(m => m.Message) 
       </div> 
       <div class="col-md-12">     
        <div> 
         @if ((TempData["recaptcha"]) != null) 
         { 
          <p>@TempData["recaptcha"]</p> 
         } 
        </div> 
        <div class="g-recaptcha" data-sitekey="6LfVHx8TAAAAAMTDxxQrHDCxO1SyXf1GgbgNBZ5a"></div> 
       </div> 

       <div class="col-md-12"><input class="shortcode_button" type="submit" value="Send"></div> 

      </div> 
     </div> 
    </div> 
} 

Und hier ist der Controller:

public ActionResult Index() 
{ 
    return View(); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Index(EmailFormModel model, IEnumerable<HttpPostedFileBase> files) 
{ 
    if (ModelState.IsValid) 
    { 
     //logic here upload file logic here. 
     foreach (var file in files) 
     { 
      if (file.ContentLength > 0) 
      { 
       var fileName = Path.GetFileName(file.FileName); 
       var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 
       file.SaveAs(path); 
      } 
     } 

     //Rest of business logic here 
     string EncodedResponse = Request.Form["g-Recaptcha-Response"]; 
     bool IsCaptchaValid = (ReCaptcha.Validate(EncodedResponse) == "True" ? true : false); 
     if (IsCaptchaValid) 
     { 

      var body = "<p>Email From: {0} ({1})</p><p>Subject: {2} </p><p>Message:</p><p>{3}</p>"; 
      var message = new MailMessage(); 
      message.To.Add(new MailAddress("***@gmail.com")); // replace with valid value 
      message.From = new MailAddress("***@ymailcom"); // replace with valid value 
      message.Subject = "Your email subject"; 
      message.Body = string.Format(body, model.FromName, model.FromEmail, model.FromSubject, model.Message); 
      message.IsBodyHtml = true; 
      using (var smtp = new SmtpClient()) 
      { 
       var credential = new NetworkCredential 
       { 
        UserName = "***@gmail.com", // replace with valid value 
        Password = "***" // replace with valid value 
       }; 
       smtp.Credentials = credential; 
       smtp.Host = "smtp.gmail.com"; 
       smtp.Port = 587; 
       smtp.EnableSsl = true; 
       await smtp.SendMailAsync(message); 
       //return RedirectToAction("Sent"); 
       ViewBag.Message = "Your message has been sent!"; 

       //TempData["message"] = "Message sent"; 
       ModelState.Clear(); 
       return View("Index"); 
      } 

     } 
     else 
     { 
      TempData["recaptcha"] = "Please verify that you are not a robot!"; 
     } 
    } 
    return View(model); 
} 
+0

Nein, in Ihrem Code fügen Sie die Anhänge zur E-Mail hinzu. Sie müssen die Pfade, die Sie speichern, im Auge behalten, damit Sie sie später an die E-Mail anhängen können. – Nkosi

Antwort

1

Sie sind nicht in Ihrem Code Anbringen etwas . Sie müssen die Dateien an die MailMessage anhängen.

Wenn Sie die Dateien speichern, verfolgen Sie die Pfade in einer Liste.

List<string> paths = new List<string>(); 
//...other code 
foreach (var file in files) { 
    //...other code removed for brevity 
    //keep file path for attachments 
    paths.Add(path); 
} 

Wenn Ihre Nachricht erstellen, können Sie dann die Dateien anhängen

//Attach files 
foreach (var path in paths) { 
    //For file information 
    var fileInfo = new FileInfo(path); 
    //stream to store attachment 
    var memoryStream = new MemoryStream(); 
    //copy file from disk to memory 
    using (var stream = fileInfo.OpenRead()) { 
     stream.CopyTo(memoryStream); 
    } 
    //reset memory pointer 
    memoryStream.Position = 0; 
    //get file name for attachment based on path 
    string fileName = fileInfo.Name; 
    //add attachment to message 
    message.Attachments.Add(new Attachment(memoryStream, fileName)); 
} 

Die Dateien angehängt werden, basierend auf den Pfaden von dem die Dateien auf der Festplatte gespeichert wurden. Dieser Code kann für eine bessere Speicherverwaltung und -leistung umgestaltet werden, aber es ist ein Anfang. Sie sollten den Rest erledigen können.

+0

Vielen Dank für Ihre Hilfe Sir. Ich werde versuchen, dies zu tun und Sie zu aktualisieren, wenn es funktioniert. Ich hoffe, ich kann dir noch ein paar Fragen stellen, wenn etwas schief gelaufen ist. Bitte führe mich, ich bin wirklich neu in dieser Art von Sachen. Vielen Dank Ihre Hilfe wird sehr geschätzt. –

+0

Irgendwie gibt es einen Fehler, Sir. Ich denke, ich mache es falsch. Aber ich kann nicht herausfinden, was. Danke für Ihre Hilfe. –

+0

Wo und was ist der Fehler? – Nkosi

0

diesen Teil des Codes ersetzen und überprüfen es funktioniert oder nicht

 if (fileUploader != null) 
         { 
          HttpPostedFileBase fileUploader; 
          string fileName = Path.GetFileName(fileUploader.FileName); 
          mail.Attachments.Add(new Attachment(fileUploader.InputStream, fileName)); 
         } 
+0

Es funktioniert nicht Sir. –

+0

versuchst du, einzelne Anlage für jetzt oder mehrere zu senden? .. wenn mehrere zunächst versuchen, für eine Anlage – stylishCoder

+0

Ich versuche, eine mehrere Anhänge senden Sir. –