从Windows窗体应用程序发送电子邮件

时间:2012-06-07 22:28:13

标签: c# vb.net winforms smtpclient

我正在构建一个应该在远程/隔离计算机上运行的Windows窗体应用程序,并通过电子邮件向管理员发送错误通知。我尝试使用System.Net.Mail类来实现这一目标,但我遇到了一个奇怪的问题:

1。我收到错误消息:

System.IO.IOException: Unable to read data from the transport connection: 
An existing connection was forcibly closed by the remote host.--->
System.Net.Sockets.SocketException: An existing connection was forcibly closed by 
the remote host at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, 
Int32 size, SocketFlags socketFlags) at System.Net.Sockets.NetworkStream.
Read(Byte[] buffer, Int32 offset, Int32 size)

2. 我试着嗅探网络活动,看看出了什么问题。所以这是怎么回事:

i) The DNS lookup for my SMTP server's hostname works
ii) My application connects to the SMTP server and sends "EHLO MY-HOSTNAME"
iii) SMTP server responds back with it's usual
iv) My application sends "AUTH login abcdxyz" and receives an acknowledgement packet

此时,似乎SMTP服务器似乎没有请求密码,或者我的机器在SMTP服务器请求密码之前关闭了与SMTP服务器的连接。

我尝试过使用不同的SMTP端口和SMTP主机。此外,我尝试禁用我的防火墙和AV,但没有运气。使用PuTTY连接到我的SMTP服务器并发出与我的应用程序相同的命令序列(从数据包嗅探器中挑选)时,一切正常,我可以发送电子邮件。

这是我正在使用的代码:

Imports System.Net
Imports System.Net.Mail

Public Function SendMail() As Boolean

     Dim smtpClient As New SmtpClient("smtp.myserver.com", 587) 'I tried using different hosts and ports
     smtpClient.UseDefaultCredentials = False
     smtpClient.Credentials = New NetworkCredential("username@domain.com", "password")
     smtpClient.EnableSsl = True 'Also tried setting this to false

     Dim mm As New MailMessage
     mm.From = New MailAddress("username@domain.com")
     mm.Subject = "Test Mail"
     mm.IsBodyHtml = True
     mm.Body = "<h1>This is a test email</h1>"
     mm.To.Add("someone@domain.com")

     Try
          smtpClient.Send(mm)
          MsgBox("SUCCESS!")
     Catch ex As Exception
          MsgBox(ex.InnerException.ToString)
     End Try

     mm.Dispose()
     smtpClient.Dispose()

     Return True

End Function

有什么建议吗?

3 个答案:

答案 0 :(得分:5)

在C#中它的工作原理如下:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void btnTest_Click(object sender, RoutedEventArgs e)
    {
        MailAddress from = new MailAddress("Someone@domain.topleveldomain", "Name and stuff");
        MailAddress to = new MailAddress("Someone@domain.topleveldomain", "Name and stuff");
        List<MailAddress> cc = new List<MailAddress>();
        cc.Add(new MailAddress("Someone@domain.topleveldomain", "Name and stuff"));
        SendEmail("Want to test this damn thing", from, to, cc);
    }

    protected void SendEmail(string _subject, MailAddress _from, MailAddress _to, List<MailAddress> _cc, List<MailAddress> _bcc = null)
    {
        string Text = "";
        SmtpClient mailClient = new SmtpClient("Mailhost");
        MailMessage msgMail;
        Text = "Stuff";
        msgMail = new MailMessage();
        msgMail.From = _from;
        msgMail.To.Add(_to);
        foreach (MailAddress addr in _cc)
        {
            msgMail.CC.Add(addr);
        }
        if (_bcc != null)
        {
            foreach (MailAddress addr in _bcc)
            {
                msgMail.Bcc.Add(addr);
            }
        }
        msgMail.Subject = _subject;
        msgMail.Body = Text;
        msgMail.IsBodyHtml = true;
        mailClient.Send(msgMail);
        msgMail.Dispose();
    }
}

不要忘记using System.Net.Mail;

我认为在VB中它的工作原理如下,这里是代码,它可能有一些错误,我不经常写在vb.net中:

Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    Dim _from As New MailAddress("Someone@domain.topleveldomain", "Name and stuff")
    Dim _to As New MailAddress("Someone@domain.topleveldomain", "Name and stuff")
    Dim cc As New List(Of MailAddress)
    cc.Add(New MailAddress("Someone@domain.topleveldomain", "Name and stuff"))
    SendEmail("Wan't to test this thing", _from, _to, cc)
End Sub

Protected Sub SendEmail(ByVal _subject As String, ByVal _from As MailAddress, ByVal _to As MailAddress, ByVal _cc As List(Of MailAddress), Optional ByVal _bcc As List(Of MailAddress) = Nothing)

    Dim Text As String = ""
    Dim mailClient As New SmtpClient("Mailhost")
    Dim msgMail As MailMessage
    Text = "Stuff"
    msgMail = New MailMessage()
    msgMail.From = _from
    msgMail.To.Add(_to)
    For Each addr As MailAddress In _cc
        msgMail.CC.Add(addr)
    Next
    If _bcc IsNot Nothing Then
        For Each addr As MailAddress In _bcc
            msgMail.Bcc.Add(addr)
        Next
    End If
    msgMail.Subject = _subject
    msgMail.Body = Text
    msgMail.IsBodyHtml = True
    mailClient.Send(msgMail)
    msgMail.Dispose()
End Sub

不要忘记导入System.Net.Mail

答案 1 :(得分:4)

SendMail.CS Page

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Mail;

namespace SendMailUsingWindowsForms
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {

                //Sending the email.
                //Now we must create a new Smtp client to send our email.

                SmtpClient client = new SmtpClient("smtp.gmail.com", 25);   //smtp.gmail.com // For Gmail
                                                                            //smtp.live.com // Windows live / Hotmail
                                                                            //smtp.mail.yahoo.com // Yahoo
                                                                            //smtp.aim.com // AIM
                                                                            //my.inbox.com // Inbox


                //Authentication.
                //This is where the valid email account comes into play. You must have a valid email account(with password) to give our program a place to send the mail from.

                NetworkCredential cred = new NetworkCredential("*******@gmail.com", "........");

                //To send an email we must first create a new mailMessage(an email) to send.
                MailMessage Msg = new MailMessage();

                // Sender e-mail address.
                Msg.From = new MailAddress(textBox1.Text);//Nothing But Above Credentials or your credentials (*******@gmail.com)

                // Recipient e-mail address.
                Msg.To.Add(textBox2.Text);

                // Assign the subject of our message.
                Msg.Subject = textBox3.Text;

                // Create the content(body) of our message.
                Msg.Body = textBox4.Text;

                // Send our account login details to the client.
                client.Credentials = cred;

                //Enabling SSL(Secure Sockets Layer, encyription) is reqiured by most email providers to send mail
                client.EnableSsl = true;

                //Confirmation After Click the Button
                label5.Text = "Mail Sended Succesfully";

                // Send our email.
                client.Send(Msg);



            }
            catch
            {
                // If Mail Doesnt Send Error Mesage Will Be Displayed
                label5.Text = "Error";
            }
        }


    }
}

SendMail.Design enter image description here

enter image description here

答案 2 :(得分:0)

尝试使用它:

    public SmtpClient client = new SmtpClient();
    public MailMessage msg = new MailMessage();
    public System.Net.NetworkCredential smtpCreds = new System.Net.NetworkCredential("mail", "password");

    public void Send(string sendTo, string sendFrom, string subject, string body)
    {
        try
        {
            //setup SMTP Host Here
            client.Host = "smtp.gmail.com";
            client.Port = 587;
            client.UseDefaultCredentials = false;
            client.Credentials = smtpCreds;
            client.EnableSsl = true;

            //converte string to MailAdress

            MailAddress to = new MailAddress(sendTo);
            MailAddress from = new MailAddress(sendFrom);

            //set up message settings

            msg.Subject = subject;
            msg.Body = body;
            msg.From = from;
            msg.To.Add(to);

            // Enviar E-mail

            client.Send(msg);

        }
        catch (Exception error)
        {
            MessageBox.Show("Unexpected Error: " + error);
        }
    }

别忘了打电话:

using System.Net.Mail;
using System.Windows.Forms;