2011-06-08 11 views
14

भेजने के लिए अपलोड और ईमेल भेजने के लिए मुझे फॉर्म को टेक्स्टरेरा और एक छवि अपलोड फ़ील्ड बनाने की आवश्यकता है। जब कोई इसे सबमिट करता है तो मैं इसे भेजना चाहता हूं (टेक्स्टरेरा से टेक्स्ट के साथ) अटैचमेंट्स (इनपुट फ़ाइल अपलोड फ़ील्ड से) मेरे लिएअनुलग्नक के साथ फॉर्म

मेरे साधारण से फ़ॉर्म कि तरह लग रहा है:

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset>   
      @Html.TextArea("Question");  
      <input type="file"/> 
      <input type="submit" value="Send" /> 

    </fieldset> 

} 

मैं PHP स्क्रिप्ट है कि ऐसा ही कुछ कर रहे हैं पाया है, लेकिन मैं कैसे ASP.NET MVC (जावास्क्रिप्ट के साथ हो सकता है) में यह कर सकता है? .NET में

उत्तर

23

यहां जीमेल के एसएमटीपी का उपयोग करने का एक उदाहरण है, लेकिन यदि आपके पास अपना स्वयं का एसएमटीपी सर्वर है तो आप आसानी से कोड को अनुकूलित कर सकते हैं।

public class QuestionViewModel 
{ 
    [Required] 
    public string Question { get; set; } 

    public HttpPostedFileBase Attachment { get; set; } 
} 

तो एक नियंत्रक:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new QuestionViewModel()); 
    } 

    [HttpPost] 
    public ActionResult Index(QuestionViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 

     using (var client = new SmtpClient("smtp.gmail.com", 587)) 
     { 
      client.EnableSsl = true; 
      client.Credentials = new NetworkCredential("[email protected]", "secret"); 
      var mail = new MailMessage(); 
      mail.From = new MailAddress("[email protected]"); 
      mail.To.Add("[email protected]"); 
      mail.Subject = "Test mail"; 
      mail.Body = model.Question; 
      if (model.Attachment != null && model.Attachment.ContentLength > 0) 
      { 
       var attachment = new Attachment(model.Attachment.InputStream, model.Attachment.FileName); 
       mail.Attachments.Add(attachment); 
      } 
      client.Send(mail); 
     } 
     return Content("email sent", "text/plain"); 
    } 
} 

और अंत में एक दृश्य:

@model QuestionViewModel 

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset>   
     <div> 
      @Html.LabelFor(x => x.Question) 
      @Html.TextAreaFor(x => x.Question) 
     </div> 
     <div> 
      <label for="attachment">Attachment</label> 
      <input type="file" name="attachment" id="attachment"/> 
     </div> 
     <input type="submit" value="Send" /> 
    </fieldset> 
} 

इस कोड को एक और सुधार

हमेशा की तरह मैं एक दृश्य के मॉडल के साथ शुरू होगा कुछ इंटरफेस को लागू करने और डी का उपयोग कर एक भंडार में मेल की वास्तविक प्रेषण को बाहरी करना होगा मैं नियंत्रक तर्क और मेल भेजने तर्क के बीच युग्मन कमजोर करने के लिए।

ध्यान दें कि आप भी web.config में आपके एसएमटीपी सेटिंग्स कॉन्फ़िगर कर सकते हैं:

<system.net> 
    <mailSettings> 
     <smtp from="[email protected]" deliveryMethod="Network"> 
     <network 
      enableSsl="true" 
      host="smtp.gmail.com" 
      port="587" 
      userName="[email protected]" 
      password="secret" 
     /> 
     </smtp> 
    </mailSettings> 
</system.net> 

और फिर बस:

using (var client = new SmtpClient()) 
{ 
    var mail = new MailMessage(); 
    mail.To.Add("[email protected]"); 
    mail.Subject = "Test mail"; 
    mail.Body = model.Question; 
    if (model.Attachment != null && model.Attachment.ContentLength > 0) 
    { 
     var attachment = new Attachment(model.Attachment.InputStream, model.Attachment.FileName); 
     mail.Attachments.Add(attachment); 
    } 
    client.Send(mail); 
} 
+0

बहुत कुछ है! यह बहुत अच्छा काम कर रहा है :) – Marta

+1

toaddress? मुझे नहीं पता था कि पैर पहनने वाले कपड़े पहनते थे! – AaronLS

+0

क्या होगा यदि आपने अपनी 'HttpPostedFileBase' फ़ाइल को पास करने के लिए $ .ajax का उपयोग करने का प्रयास किया है? मैं इसे एक साधारण $ .ajax कॉल के माध्यम से करने की कोशिश कर रहा हूं, लेकिन मुझे अपने नियंत्रक पर एक नल फ़ाइल मिली है। क्या यह सामग्री प्रकार है जो मुझे याद आ रही है? – AdrianoRR

3

MailMessage कक्षा कि संभाल करने के लिए आप के लिए सक्षम होना चाहिए:

http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.attachments.aspx

या आप कुछ अधिक विशिष्ट अपने वास्तविक कोड के लिए देख रहे हैं? (उदाहरण के लिए फ़ाइल को कैसे पढ़ा जाए और इसे अटैचमेंट में कैसे जोड़ें)?

+0

हाँ मैं कुछ और विशिष्ट खोज रहा हूं - फ़ॉर्म से फ़ाइल को कैसे पढ़ा जाए और इसे ईमेल से अनुलग्नक के रूप में जोड़ें और फिर यह ईमेल भेजें। – Marta

+0

क्षमा करें, बहुत धीमी है, लेकिन खुश है कि किसी ने आपको जवाब दिया :) –

1
if (model.Attachment != null && model.Attachment.ContentLength > 0) 
    { 
    foreach (HttpPostedFileBase item in fileUploader) 
     { 

     var attachment = new Attachment(model.Attachment.InputStream, model.Attachment.FileName); 
     mail.Attachments.Add(attachment); 
     } 
    } 
0

डैरन के जवाब देने के लिए इसके अलावा, आप की जरूरत नहीं है अपनी फ़ाइल में अपलोड करने के लिए इनपुट और लेबल को हार्डकोड करने के लिए। बस इसे वहां थप्पड़ मारें :)

@Html.TextBoxFor(model => model.Attachment, new { type = "file" }) 
@Html.LabelFor(model => model.Attachment) 
संबंधित मुद्दे