C #에서 첨부 파일이있는 이메일 보내기, 첨부 파일은 Thunderbird에서 Part 1.2로 도착합니다.


113

SMTP를 사용하여 Exchange 2007 서버를 통해 Excel 스프레드 시트 보고서를 이메일로 보내는 C # 응용 프로그램이 있습니다. Outlook 사용자에게는 잘 도착하지만 Thunderbird 및 Blackberry 사용자에게는 첨부 파일의 이름이 "Part 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속성 을 정의 / 변경하려고 했습니까 ?
Alex

아니요, "MIME 콘텐츠 유형 이름 값을 가져 오거나 설정"하지 않았습니다. 시도 할 값에 대한 제안이 있습니까? 감사.
Jon

Name첨부 파일과 함께 이메일이 수신 될 때 첨부 파일의 이름으로 표시됩니다. 그래서 당신은 어떤 가치를 시도 할 수 있습니다.
Alex

답변:


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
MailMessage 및 SmtpClient를 using 문으로 래핑하여 올바르게 처리되었는지 확인해야합니다.
Andrew

1
@Andrew-어떻게해야합니까?
Steam

이 코드를 시도하고 나는이 게시물에 표시되는 오류가있어 - stackoverflow.com/questions/20845469/...
스팀

1
당신은 다음과 같이 할 수 @Steamusing(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
attachment.Dispose ()를 잊지 마십시오. 그렇지 않으면이 파일이 잠긴 상태로 유지되며 데이터를 쓸 수 없습니다.
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에서 왔으며 언제 사용해야합니까?
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

이를 위해 짧은 코드를 만들었으며이를 여러분과 공유하고 싶습니다.

다음은 주요 코드입니다.

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

Ranadheer Reddy (위)에서 제공 한 코드를 시도해 보았고 훌륭하게 작동했습니다. 제한된 서버가있는 회사 컴퓨터를 사용하는 경우 SMTP 포트를 25로 변경하고 사용자 이름과 암호는 관리자가 자동으로 채우므로 공백으로 두어야 할 수 있습니다.

원래는 nugent 패키지 관리자의 EASendMail을 사용해 보았지만 30 일 평가판이있는 버전에 대한 지불이라는 것을 깨달았습니다. 구매할 계획이 아니라면 시간을 허비하지 마십시오. EASendMail을 사용하면 프로그램이 훨씬 더 빠르게 실행되는 것을 알 수 있었지만, 저에게는 무료가 훨씬 빠릅니다.

내 2 센트 가치.


0

이 방법을 사용하면 전자 메일 서비스에서 전자 메일 본문 및 첨부 파일을 Microsoft Outlook에 첨부 할 수 있습니다.

Outlook 사용 = Microsoft.Office.Interop.Outlook; // 나중에 빌드 에이전트를 사용하려는 경우 로컬 또는 nuget에서 Microsoft.Office.Interop.Outlook 을 참조합니다.

 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."
                    };
                }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.