C #'dan eklerle e-posta gönderirken ekler, Thunderbird'de Bölüm 1.2 olarak gelir


113

SMTP kullanarak bir Exchange 2007 sunucusu aracılığıyla Excel elektronik tablo raporlarını e-postayla gönderen bir C # uygulamam var. Bunlar Outlook kullanıcıları için sorun değil, ancak Thunderbird ve Blackberry kullanıcıları için ekler "Bölüm 1.2" olarak yeniden adlandırıldı.

Sorunu açıklayan bu makaleyi buldum , ancak bana bir çözüm sağlamıyor gibi görünüyor. Exchange sunucusunun kontrolüne sahip değilim, bu yüzden orada değişiklik yapamam. C # ucunda yapabileceğim bir şey var mı? Kısa dosya adları ve gövde için HTML kodlaması kullanmayı denedim, ancak ikisi de bir fark yaratmadı.

Posta gönderme kodum basitçe şudur:

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);
}

Herhangi bir yardım için teşekkürler.


Attachment.NameÖzelliği tanımlamayı / değiştirmeyi denediniz mi?
Alex

Hayır, ben almadım - "MIME içerik türü adı değerini alır veya ayarlar", denenecek değer konusunda bir öneriniz var mı? Teşekkürler.
Jon

NameEki ile e-posta alındığında ekin adı olarak görüntülenir. Yani herhangi bir değeri deneyebilirsiniz.
Alex

Yanıtlar:


115

Ekli e-posta göndermek için basit kod.

kaynak: 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
Doğru şekilde bertaraf edildiklerinden emin olmak için MailMessage ve SmtpClient'i ifadelerle sarmalamanız gerekir
Andrew

1
@Andrew - bunu nasıl yaparım?
Steam

Bu kodu denedim ve bu yazıda gösterilen hatayı aldım - stackoverflow.com/questions/20845469/…
Steam

1
@Steam bunu yapabilirsinusing(SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com")) { //code goes here using(MailMessage mail = new MailMessage()){ //code goes here } }
Shamseer K

92

ContentDisposition alanlarının açık bir şekilde doldurulması hile yaptı.

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 , Gmail durumunda, ssl güvenli ve hatta bağlantı noktasıyla ilgili bazı istisnalarınız olabilir!

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

2
Neden değil kullanırsınız FileInfoalmak için nesneyi CreationTime, LastWriteTimeve LastAccessTimeözelliklerini? LengthYine de mülkü almak için bir tane yaratıyorsun .
sampathsris

1
Eki unutmayın.Dispose () yoksa bu dosya kilitli kalır ve üzerine veri yazamazsınız.
Pau Dominguez

7

İşte ekli basit bir posta gönderme kodu

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);  
}

Daha fazla bilgi C # ile ekli e-posta gönderme


4

Dosyayı bulmak için Server.MapPath kullanarak Ranadheer çözümünü tamamlama

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

Nereden Server.MapPathgeliyor ve ne zaman kullanılmalı?
Kimmax

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

Bunu yapmak için kısa bir kod yaptım ve sizinle paylaşmak istiyorum.

İşte ana kod:

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);
  }

}

Düğmenizde bunun gibi şeyler
yapın jpg veya pdf dosyalarınızı ve daha fazlasını ekleyebilirsiniz .. bu sadece bir örnek

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

Bunu dene:

private void btnAtt_Click(object sender, EventArgs e) {

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

    MyMsg.Attachments.Add(myFile);


}

0

Ranadheer Reddy (yukarıda) tarafından sağlanan kodu denedim ve harika çalıştı. Kısıtlı bir sunucusu olan bir şirket bilgisayarı kullanıyorsanız, SMTP bağlantı noktasını 25 olarak değiştirmeniz ve yöneticiniz tarafından otomatik olarak doldurulacağından kullanıcı adınızı ve şifrenizi boş bırakmanız gerekebilir.

Başlangıçta, nugent paket yöneticisinden EASendMail'i kullanmayı denedim, ancak bunun 30 günlük deneme sürümü için bir ödeme olduğunu fark ettim. Satın almayı planlamadığınız sürece vaktinizi onunla geçirmeyin. Programın EASendMail'i kullanarak çok daha hızlı çalıştığını fark ettim, ancak benim için ücretsiz olarak hızlı bir şekilde koz verildi.

Sadece 2 sentim değerinde.


0

Bu yöntemi e-posta hizmetiniz altında kullanın, herhangi bir e-posta gövdesini ve eklerini Microsoft Outlook'a ekleyebilir

Outlook = Microsoft.Office.Interop.Outlook kullanımı; // Daha sonra bir derleme aracısı kullanacaksanız yerel veya nuget'ten Microsoft.Office.Interop.Outlook'a başvurun

 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."
                    };
                }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.