How to send an email with attachments using SmtpClient.SendAsync?

前端 未结 3 506
眼角桃花
眼角桃花 2020-12-02 16:00

I am using a service component through ASP.NET MVC. I would like to send the email in a asynchronous way to let the user do other stuff without having to wait for the sendin

相关标签:
3条回答
  • 2020-12-02 16:23

    Don't use "using" here. You are destroying the memory stream immediately after calling SendAsync, e.g. probably before SMTP gets to read it (since it's async). Destroy your stream in the callback.

    0 讨论(0)
  • 2020-12-02 16:26

    I have tried your function and it works even for email with in memory attachments. But here are some remarks:

    • What type of attachments did you try to send ? Exe ?
    • Are both sender and receiver on the same email server ?
    • You should “catch” exception and not just swallow it, than you will get more info about your problem.
    • What does the exception says ?

    • Does it work whan you use Send instead of SendAsync ? You are using 'using' clause and closing Stream before email is sent.

    Here is good text about this topic:

    Sending Mail in .NET 2.0

    0 讨论(0)
  • 2020-12-02 16:30

    An extension to the Solution supplied in the original question also correctly cleans up an attachments that may also require disposal.

        public event EventHandler EmailSendCancelled = delegate { };
    
        public event EventHandler EmailSendFailure = delegate { };
    
        public event EventHandler EmailSendSuccess = delegate { };
        ...
    
            MemoryStream mem = new MemoryStream();
            try
            {
                thisReport.ExportToPdf(mem);
    
                // Create a new attachment and put the PDF report into it.
                mem.Seek(0, System.IO.SeekOrigin.Begin);
                //Attachment att = new Attachment(mem, "MyOutputFileName.pdf", "application/pdf");
                Attachment messageAttachment = new Attachment(mem, thisReportName, "application/pdf");
    
                // Create a new message and attach the PDF report to it.
                MailMessage message = new MailMessage();
                message.Attachments.Add(messageAttachment);
    
                // Specify sender and recipient options for the e-mail message.
                message.From = new MailAddress(NOES.Properties.Settings.Default.FromEmailAddress, NOES.Properties.Settings.Default.FromEmailName);
                message.To.Add(new MailAddress(toEmailAddress, NOES.Properties.Settings.Default.ToEmailName));
    
                // Specify other e-mail options.
                //mail.Subject = thisReport.ExportOptions.Email.Subject;
                message.Subject = subject;
                message.Body = body;
    
                // Send the e-mail message via the specified SMTP server.
                SmtpClient smtp = new SmtpClient();
                smtp.SendCompleted += SmtpSendCompleted;
                smtp.SendAsync(message, message);
            }
            catch (Exception)
            {
                if (mem != null)
                {
                    mem.Dispose();
                    mem.Close();
                }
                throw;
            }
        }
    
        private void SmtpSendCompleted(object sender, AsyncCompletedEventArgs e)
        {
            var message = e.UserState as MailMessage;
            if (message != null)
            {
                foreach (var attachment in message.Attachments)
                {
                    if (attachment != null)
                    {
                        attachment.Dispose();
                    }
                }
                message.Dispose();
            }
            if (e.Cancelled)
                EmailSendCancelled?.Invoke(this, EventArgs.Empty);
            else if (e.Error != null)
            {
                EmailSendFailure?.Invoke(this, EventArgs.Empty);
                throw e.Error;
            }
            else
                EmailSendSuccess?.Invoke(this, EventArgs.Empty);
        }
    
    0 讨论(0)
提交回复
热议问题