सी # से अटैचमेंट के साथ ईमेल भेजना, अटैचमेंट थंडरबर्ड में भाग 1.2 के रूप में आता है


113

मेरे पास एक C # एप्लिकेशन है जो SMTP का उपयोग कर एक्सचेंज 2007 सर्वर के माध्यम से एक्सेल स्प्रेडशीट रिपोर्ट को ईमेल करता है। ये आउटलुक यूजर्स के लिए ठीक हैं, लेकिन थंडरबर्ड और ब्लैकबेरी यूजर्स के लिए अटैचमेंट को "पार्ट 1.2" के रूप में फिर से नाम दिया गया है।

मुझे यह लेख मिला , जो समस्या का वर्णन करता है, लेकिन मुझे कोई हल नहीं देता। मेरे पास एक्सचेंज सर्वर का नियंत्रण नहीं है इसलिए वहां परिवर्तन नहीं कर सकता। क्या मैं C # एंड पर कुछ भी कर सकता हूं? मैंने शरीर के लिए लघु फ़ाइल नाम और HTML एन्कोडिंग का उपयोग करने की कोशिश की है, लेकिन न तो कोई फर्क पड़ा।

मेरा मेल भेजने वाला कोड बस यही है:

public static void SendMail(string recipient, string subject, string body, string attachmentFilename)
{
    SmtpClient smtpClient = new SmtpClient();
    NetworkCredential basicCredential = new NetworkCredential(MailConst.Username, MailConst.Password);
    MailMessage message = new MailMessage();
    MailAddress fromAddress = new MailAddress(MailConst.Username);

    // setup up the host, increase the timeout to 5 minutes
    smtpClient.Host = MailConst.SmtpServer;
    smtpClient.UseDefaultCredentials = false;
    smtpClient.Credentials = basicCredential;
    smtpClient.Timeout = (60 * 5 * 1000);

    message.From = fromAddress;
    message.Subject = subject;
    message.IsBodyHtml = false;
    message.Body = body;
    message.To.Add(recipient);

    if (attachmentFilename != null)
        message.Attachments.Add(new Attachment(attachmentFilename));

    smtpClient.Send(message);
}

किसी भी मदद के लिए धन्यवाद।


क्या आपने Attachment.Nameसंपत्ति को परिभाषित / बदलने की कोशिश की है ?
एलेक्स

नहीं, मैंने ऐसा नहीं किया है - "MIME सामग्री प्रकार नाम मान हो जाता है या सेट हो जाता है", क्या आपके पास सुझाव है कि किस मूल्य पर प्रयास करना है? धन्यवाद।
जॉन

Nameजब अनुलग्नक के साथ ईमेल प्राप्त हो जाए लगाव के नाम के रूप में प्रदर्शित किया जाता है। तो आप किसी भी मूल्य की कोशिश कर सकते हैं।
एलेक्स

जवाबों:


115

अटैचमेंट के साथ ईमेल भेजने के लिए सरल कोड।

स्रोत: http://www.coding-issues.com/2012/11/sending-email-with-attachments-from-c.html

using System.Net;
using System.Net.Mail;

public void email_send()
{
    MailMessage mail = new MailMessage();
    SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
    mail.From = new MailAddress("your mail@gmail.com");
    mail.To.Add("to_mail@gmail.com");
    mail.Subject = "Test Mail - 1";
    mail.Body = "mail with attachment";

    System.Net.Mail.Attachment attachment;
    attachment = new System.Net.Mail.Attachment("c:/textfile.txt");
    mail.Attachments.Add(attachment);

    SmtpServer.Port = 587;
    SmtpServer.Credentials = new System.Net.NetworkCredential("your mail@gmail.com", "your password");
    SmtpServer.EnableSsl = true;

    SmtpServer.Send(mail);

}

21
आप स्टेटमेंट का उपयोग करने के साथ मेलमेज़ेज और SmtpClient लपेटें, यह सुनिश्चित करने के लिए कि वे सही ढंग
एंड्रयू

1
@ और - मैं ऐसा कैसे करूँ?
स्टीम करें

मैंने इस कोड की कोशिश की और मुझे इस पोस्ट में दिखाई गई त्रुटि मिली - stackoverflow.com/questions/20845469/…
स्टीम

1
@ आप इस तरह से कर सकते हैंusing(SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com")) { //code goes here using(MailMessage mail = new MailMessage()){ //code goes here } }
शमसेर के

92

ContentDisposition फ़ील्ड्स में स्पष्ट रूप से भरने ने चाल चली।

if (attachmentFilename != null)
{
    Attachment attachment = new Attachment(attachmentFilename, MediaTypeNames.Application.Octet);
    ContentDisposition disposition = attachment.ContentDisposition;
    disposition.CreationDate = File.GetCreationTime(attachmentFilename);
    disposition.ModificationDate = File.GetLastWriteTime(attachmentFilename);
    disposition.ReadDate = File.GetLastAccessTime(attachmentFilename);
    disposition.FileName = Path.GetFileName(attachmentFilename);
    disposition.Size = new FileInfo(attachmentFilename).Length;
    disposition.DispositionType = DispositionTypeNames.Attachment;
    message.Attachments.Add(attachment);                
}

BTW , जीमेल के मामले में, आपके पास ssl सुरक्षित या पोर्ट के बारे में कुछ अपवाद हो सकते हैं!

smtpClient.EnableSsl = true;
smtpClient.Port = 587;

2
तुम क्यों नहीं एक प्रयोग करेंगे FileInfoवस्तु प्राप्त करने के लिए CreationTime, LastWriteTimeऔर LastAccessTimeगुण? आप Lengthवैसे भी संपत्ति प्राप्त करने के लिए एक बना रहे हैं।
संपतसरिस

1
अनुलग्नक को मत भूलना। विरोध करें () या यह फ़ाइल लॉक रहती है और आप इस पर डेटा नहीं लिख सकते।
पऊ Dominguez

7

यहां अटैचमेंट के साथ एक साधारण मेल भेजने वाला कोड है

try  
{  
    SmtpClient mailServer = new SmtpClient("smtp.gmail.com", 587);  
    mailServer.EnableSsl = true;  

    mailServer.Credentials = new System.Net.NetworkCredential("myemail@gmail.com", "mypassword");  

    string from = "myemail@gmail.com";  
    string to = "reciever@gmail.com";  
    MailMessage msg = new MailMessage(from, to);  
    msg.Subject = "Enter the subject here";  
    msg.Body = "The message goes here.";
    msg.Attachments.Add(new Attachment("D:\\myfile.txt"));
    mailServer.Send(msg);  
}  
catch (Exception ex)  
{  
    Console.WriteLine("Unable to send email. Error : " + ex);  
}

C # में अनुलग्नक के साथ और अधिक ईमेल भेजना पढ़ें


4

फ़ाइल का पता लगाने के लिए Server.MapPath का उपयोग करते हुए, रणधीर का समाधान पूरा करना

System.Net.Mail.Attachment attachment;
attachment = New System.Net.Mail.Attachment(Server.MapPath("~/App_Data/hello.pdf"));
mail.Attachments.Add(attachment);

कहां Server.MapPathसे आता है और इसका उपयोग कब किया जाना चाहिए?
किममैक्स

1
private void btnSent_Click(object sender, EventArgs e)
{
    try
    {
        MailMessage mail = new MailMessage();
        SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");

        mail.From = new MailAddress(txtAcc.Text);
        mail.To.Add(txtToAdd.Text);
        mail.Subject = txtSub.Text;
        mail.Body = txtContent.Text;
        System.Net.Mail.Attachment attachment;
        attachment = new System.Net.Mail.Attachment(txtAttachment.Text);
        mail.Attachments.Add(attachment);

        SmtpServer.Port = 587;
        SmtpServer.Credentials = new System.Net.NetworkCredential(txtAcc.Text, txtPassword.Text);

        SmtpServer.EnableSsl = true;

        SmtpServer.Send(mail);
        MessageBox.Show("mail send");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

private void button1_Click(object sender, EventArgs e)
{
    MailMessage mail = new MailMessage();
    openFileDialog1.ShowDialog();
    System.Net.Mail.Attachment attachment;
    attachment = new System.Net.Mail.Attachment(openFileDialog1.FileName);
    mail.Attachments.Add(attachment);
    txtAttachment.Text =Convert.ToString (openFileDialog1.FileName);
}

1

मैंने ऐसा करने के लिए एक छोटा कोड बनाया है और मैं इसे आपके साथ साझा करना चाहता हूं।

यहाँ मुख्य कोड है:

public void Send(string from, string password, string to, string Message, string subject, string host, int port, string file)
{

  MailMessage email = new MailMessage();
  email.From = new MailAddress(from);
  email.To.Add(to);
  email.Subject = subject;
  email.Body = Message;
  SmtpClient smtp = new SmtpClient(host, port);
  smtp.UseDefaultCredentials = false;
  NetworkCredential nc = new NetworkCredential(from, password);
  smtp.Credentials = nc;
  smtp.EnableSsl = true;
  email.IsBodyHtml = true;
  email.Priority = MailPriority.Normal;
  email.BodyEncoding = Encoding.UTF8;

  if (file.Length > 0)
  {
    Attachment attachment;
    attachment = new Attachment(file);
    email.Attachments.Add(attachment);
  }

  // smtp.Send(email);
  smtp.SendCompleted += new SendCompletedEventHandler(SendCompletedCallBack);
  string userstate = "sending ...";
  smtp.SendAsync(email, userstate);
}

private static void SendCompletedCallBack(object sender,AsyncCompletedEventArgs e) {
  string result = "";
  if (e.Cancelled)
  {    
    MessageBox.Show(string.Format("{0} send canceled.", e.UserState),"Message",MessageBoxButtons.OK,MessageBoxIcon.Information);
  }
  else if (e.Error != null)
  {
    MessageBox.Show(string.Format("{0} {1}", e.UserState, e.Error), "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
  }
  else {
    MessageBox.Show("your message is sended", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
  }

}

आपके बटन में इस तरह से सामान है कि
आप अपनी jpg या पीडीएफ फाइलों को जोड़ सकते हैं और अधिक .. यह सिर्फ एक उदाहरण है

using (OpenFileDialog attachement = new OpenFileDialog()
{
  Filter = "Exel Client|*.png",
  ValidateNames = true
})
{
if (attachement.ShowDialog() == DialogResult.OK)
{
  Send("yourmail@gmail.com", "gmail_password", 
       "tomail@gmail.com", "just smile ", "mail with attachement",
       "smtp.gmail.com", 587, attachement.FileName);

}
}

0

इसे इस्तेमाल करे:

private void btnAtt_Click(object sender, EventArgs e) {

    openFileDialog1.ShowDialog();
    Attachment myFile = new Attachment(openFileDialog1.FileName);

    MyMsg.Attachments.Add(myFile);


}

0

मैंने रणधीर रेड्डी (ऊपर) द्वारा प्रदान किए गए कोड की कोशिश की और इसने बहुत अच्छा काम किया। यदि आप एक कंपनी के कंप्यूटर का उपयोग कर रहे हैं जिसमें एक प्रतिबंधित सर्वर है तो आपको एसएमटीपी पोर्ट को 25 में बदलने और अपने उपयोगकर्ता नाम और पासवर्ड को खाली छोड़ने की आवश्यकता हो सकती है क्योंकि वे आपके व्यवस्थापक द्वारा ऑटो भरेंगे।

मूल रूप से, मैंने nugent पैकेज मैनेजर से EASendMail का उपयोग करने की कोशिश की, केवल यह महसूस करने के लिए कि यह 30-दिवसीय परीक्षण के साथ संस्करण के लिए भुगतान है। जब तक आप इसे खरीदने की योजना नहीं बनाते हैं, तब तक इसके साथ अपना समय व्यतीत न करें। मैंने देखा कि कार्यक्रम EASendMail का उपयोग करके बहुत तेजी से भाग गया, लेकिन मेरे लिए, मुफ्त में तेजी से फटा।

मेरी तुच्छ राय में।


0

अपनी ईमेल सेवा के तहत इस पद्धति का उपयोग करें यह किसी भी ईमेल बॉडी और अनुलग्नकों को Microsoft आउटलुक में संलग्न कर सकता है

Outlook = Microsoft.Office.Interop.Outlook का उपयोग करना; // संदर्भ Microsoft.Office.Interop.Outlook स्थानीय या nuget से यदि आप बाद में एक बिल्ड एजेंट का उपयोग करेंगे

 try {
                    var officeType = Type.GetTypeFromProgID("Outlook.Application");
    
                    if(officeType == null) {//outlook is not installed
                        return new PdfErrorResponse {
                            ErrorMessage = "System cant start Outlook!, make sure outlook is installed on your computer."
                        };
                    } else {
                        // Outlook is installed.    
                        // Continue your work.
                        Outlook.Application objApp = new Outlook.Application();
                        Outlook.MailItem mail = null;
                        mail = (Outlook.MailItem)objApp.CreateItem(Outlook.OlItemType.olMailItem);
                        //The CreateItem method returns an object which has to be typecast to MailItem 
                        //before using it.
                        mail.Attachments.Add(attachmentFilePath,Outlook.OlAttachmentType.olEmbeddeditem,1,$"Attachment{ordernumber}");
                        //The parameters are explained below
                        mail.To = recipientEmailAddress;
                        //mail.CC = "con@def.com";//All the mail lists have to be separated by the ';'
    
                        //To send email:
                        //mail.Send();
                        //To show email window
                        await Task.Run(() => mail.Display());
                    }
    
                } catch(System.Exception) {
                    return new PdfErrorResponse {
                        ErrorMessage = "System cant start Outlook!, make sure outlook is installed on your computer."
                    };
                }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.