Надсилаючи електронний лист із вкладеннями з C #, вкладення надходять як частина 1.2 в Thunderbird


113

У мене є додаток C #, яке надсилає електронні листи звітів електронної таблиці Excel через сервер Exchange 2007 за допомогою SMTP. Вони підходять для користувачів Outlook, але для користувачів Thunderbird та Blackberry додатки перейменовано на "Частина 1.2".

Я знайшов цю статтю, яка описує проблему, але, здається, не дозволяє вирішити цю проблему. Я не маю контролю над сервером Exchange, тому не можу вносити зміни там. Чи можу я щось зробити на кінці 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", чи є у вас пропозиція щодо того, яке значення спробувати? Дякую.
Jon

NameВідображення назви вкладеного коли електронна пошта з додатком приймається. Тож ви можете спробувати будь-яке значення.
Олексій

Відповіді:


115

Простий код для надсилання електронного листа з вкладенням.

джерело: http://www.coding-isissue.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
Ви повинні обернути MailMessage і SmtpClient з використанням операторів, щоб переконатися, що вони розміщені правильно
Ендрю

1
@Andrew - як це зробити?
Steam

Я спробував цей код, і у мене з’явилася помилка, показана в цьому дописі - stackoverflow.com/questions/20845469/…
Steam

1
@Steam ви можете зробити такusing(SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com")) { //code goes here using(MailMessage mail = new MailMessage()){ //code goes here } }
Shamseer K

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 , у випадку Gmail, у вас можуть бути винятки щодо безпеки ssl або навіть порту!

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

2
Чому б вам не використовувати FileInfoоб'єкт , щоб отримати CreationTime, LastWriteTimeі LastAccessTimeвластивості? Ви все одно створюєте його, щоб отримати Lengthмайно.
sampathsris

1
Не забудьте вкладення. Вимкніть () або цей файл залишається заблокованим, і ви не можете записати на нього дані.
Pau 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

Завершення рішення Ranadheer, використовуючи 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 чи pdf тощо. Це лише приклад

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

Я спробував код, наданий Ранадхером Редді (вгорі), і він чудово працював. Якщо ви використовуєте комп'ютер компанії з обмеженим сервером, можливо, вам доведеться змінити порт SMTP на 25 і залишити своє ім’я користувача та пароль порожніми, оскільки вони автоматично заповняться вашим адміністратором.

Спочатку я намагався використовувати EASendMail від менеджера необхідних пакетів, тільки щоб зрозуміти, що це плата за версію з 30-денною пробною версією. Не витрачайте на це свій час, якщо ви не плануєте його купувати. Я помітив, що програма працювала набагато швидше за допомогою EASendMail, але для мене безкоштовна труба швидко.

Тільки мої 2 копійки коштують.


0

Використовуйте цей метод під службою електронної пошти, він може додавати будь-яке тіло електронної пошти та додатки до Microsoft Outlook

за допомогою 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.