C# 当我关闭应用程序时,电子邮件已成功发送

C# 当我关闭应用程序时,电子邮件已成功发送,c#,visual-studio-2010,visual-studio,email,sendmail,C#,Visual Studio 2010,Visual Studio,Email,Sendmail,我正在发送一封包含一些附件和一些基本信息的电子邮件。所以每件事都在发送 完美地但当我检查我的收件箱邮件还没有到那里时, 所以我试着关闭我的申请表。所以那个时候邮件来了 太累了很多时间,我发现当我发送邮件并关闭整个表单时,收件人邮箱会收到邮件。有什么想法吗 代码段: SmtpClient smtp = new SmtpClient(smtpserver, 25); MailMessage msg = new MailMessage(); msg

我正在发送一封包含一些附件和一些基本信息的电子邮件。所以每件事都在发送 完美地但当我检查我的收件箱邮件还没有到那里时, 所以我试着关闭我的申请表。所以那个时候邮件来了

太累了很多时间,我发现当我发送邮件并关闭整个表单时,收件人邮箱会收到邮件。有什么想法吗

代码段:

 SmtpClient smtp = new SmtpClient(smtpserver, 25);

            MailMessage msg = new MailMessage();

            msg.From = new MailAddress(email_From);
            msg.To.Add(email_Recipient);

            msg.IsBodyHtml = true;
            msg.Subject = email_Subject;

            ///Attachment's and Body


            try
            {
                    _f3.ShowDialog();
                    smtp.Send(msg);
                    MessageBox.Show("Email Successfully Sent!!!", "Mail!!!.");
                    Environment.Exit(0);// -->> if i keep this mail is going.. else i have to close
                    // my application to receive mail
            }

            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }   

尝试重新排列代码:

 smtp.Send(msg);
_f3.ShowDialog();

将发送电子邮件的行置于显示模式对话框的行上方。在关闭此表单之前,您的代码不会继续。

正如@TyCobb指出的,.NET 4+中的
SmtpClient
实现了
IDisposable
。你不调用
smtp.Dispose()
就是在破坏它的合同。使用块通常是最方便的方法。

因此,有很多方法可以发送电子邮件。Using语句是一种非常流行的语句

以下是发送邮件的另一种方法的链接:

我想问你一个问题,你想做什么

这是一个大型电子邮件发送者吗? 您可能需要使用邮件发送服务,例如sendgrid

如果这是一个为你自己的测试项目,它将发送低优先级的管理电子邮件或其他东西,你可能会对上述内容感到满意

无论如何,我会有一个类设置,您可以在其中传入以下内容:To、From、Subject、HTMLMessageContent、PlainTextMessageContent,至少

然后,此方法将处理从应用程序发送的所有电子邮件。以下是一个很好的起点

public bool SendMail(string from, string to, string subject, string htmlContent, string plainContent)
{
    //Email sending code - could be replaced by 3rd party mail sending API, etc.
    MailMessage mail = new MailMessage(from, to);
    SmtpClient client = new SmtpClient();
    client.Port = 25;
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.UseDefaultCredentials = false;
    client.Host = "smtp.google.com";
    mail.Subject = subject;
    mail.Body = htmlContent;
    client.Send(mail);
}
然后,您可以通过

//... code
SendMail(email_From, email_Recipient, email_Subject, email_body_HTML, email_body, plaintext);
//... code
显然,您可以执行一些操作,例如返回一个表示成功的bool、错误处理/捕获/记录、附件等

试试看这是否是一个好的起点

或者,以下链接也应该有一些用处:

尝试使用“使用块”,也可以使用Show()代替ShowDialog()


我以前有过这个问题。如果我没记错的话,我必须在完成时处理
SmtpClient
。您的目标是.NET的哪个版本?(VS2010中的C#编译器支持多目标)请参阅@BenVoigt我尝试过这也不起作用<代码>使用(smtp作为IDisposable){smtp.Send(msg);}理论。。。由于您的评论使它看起来像是附加文件,请确保您处理了所有可能的内容。很可能是由于某些东西使文件处于锁定状态,消息在释放之前无法发送——因此,在应用程序关闭后,它会发送消息。处置!:D
错误System.Net.Mail.SmtpClient'不包含'Dispose'的定义,并且找不到接受'System.Net.Mail.SmtpClient'类型的第一个参数的扩展方法'Dispose'。(是否缺少using指令或程序集引用?
@StacyKebler:。并解释了调用Dispose的重要性。如果它不像MSDN所说的那样公开,那么请尝试
((IDisposable)smtp).Dispose()
。或者像我说的那样,使用
无法将类型为“system.net.mail.smptclient”的对象强制转换为类型为“system.idisposable”
@StacyKebler正如Ben在问题评论中所问的那样,您运行的是什么版本的.net
SmtpClient
直到4.0才实现
IDisposable
MailMessage
在2.0中实现了
IDisposable
,但我怀疑调用它是否能解决您的问题。这是一件值得尝试的事情,我也尝试过同样的效果。。直到我关闭应用程序
Error'System.Net.mail.SmtpClient':当我使用
using(SmtpClient smtp=new SmtpClient(smtpserver,25))
时,using语句中使用的类型必须隐式转换为'System.IDisposable'
,不要使用using块,因为SmtpClient无法识别。圣母玛利亚!!我进入了项目属性->应用程序选项卡。并将框架从2.0版更改为4.0版。。noe my
smtp.Dispose()工作正常。。我的意思是当我改变框架时。。这会影响我的申请吗。。因为我需要这个应用程序在windows XP professional OSalso上运行,所以我想指出,这个应用程序运行在服务器中的两台不同的计算机上。那么有什么问题吗。我可以看到另一个名为
.netframework4clientprofile
的框架。。我需要选择那个吗。。如果我在网络域上运行此应用程序。。
using(SmtpClient smtp = new SmtpClient(smtpserver, 25))
{

        MailMessage msg = new MailMessage();

        msg.From = new MailAddress(email_From);
        msg.To.Add(email_Recipient);

        msg.IsBodyHtml = true;
        msg.Subject = email_Subject;

        ///Attachment's and Body


        try
        {
                _f3.ShowDialog(); //until you dont close the dialog, it will not send the msg. Maybe _f3.Show() solve your problem
                smtp.Send(msg);
                MessageBox.Show("Email Successfully Sent!!!", "Mail!!!.");
                //Environment.Exit(0);// -->> if i keep this mail is going.. else i have to close
                // my application to receive mail
        }

        catch (System.Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }   
}