2012-06-07 8 views
0

Я создаю приложение форм Windows, которое должно работать на удаленной/изолированной машине, и отправлять уведомления об ошибках по электронной почте администраторам. Я пробовал с использованием System.Net.Mail классов для достижения этой цели, но я бегу в странные проблемы:Отправка электронной почты из приложения форм Windows

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, но не повезло. При подключении к моему SMTP-серверу с помощью PuTTY и выдаче той же последовательности команд, что и мое приложение (выбрано из анализатора пакетов), все работает отлично, и я могу отправить сообщение по электронной почте.

Вот код, который я использую:

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("[email protected]", "password") 
    smtpClient.EnableSsl = True 'Also tried setting this to false 

    Dim mm As New MailMessage 
    mm.From = New MailAddress("[email protected]") 
    mm.Subject = "Test Mail" 
    mm.IsBodyHtml = True 
    mm.Body = "<h1>This is a test email</h1>" 
    mm.To.Add("[email protected]") 

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

    mm.Dispose() 
    smtpClient.Dispose() 

    Return True 

End Function 

Любые советы?

+2

Можем ли мы увидеть код? –

+0

Добавил код в мой пост ... – Zishan

+0

Если вы используете этот код и используете учетные данные учетной записи gmail, например, получаете ли вы такую ​​же ошибку? точно так же, как Diogo упоминает ... –

ответ

4

В C# это работает так:

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

    private void btnTest_Click(object sender, RoutedEventArgs e) 
    { 
     MailAddress from = new MailAddress("[email protected]", "Name and stuff"); 
     MailAddress to = new MailAddress("[email protected]", "Name and stuff"); 
     List<MailAddress> cc = new List<MailAddress>(); 
     cc.Add(new MailAddress("[email protected]", "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;

I Thin к в VB она работает, как это, вот код, он может иметь некоторые ошибки, я не часто пишу в vb.net:

Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) 
    Dim _from As New MailAddress("[email protected]", "Name and stuff") 
    Dim _to As New MailAddress("[email protected]", "Name and stuff") 
    Dim cc As New List(Of MailAddress) 
    cc.Add(New MailAddress("[email protected]", "Name and stuff")) 
    SendEmail("Wan't to test this fucking 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

+0

Спасибо Thanatos, но это не сильно отличается от моего кода или от того, что опубликовано Diogo. Проблема заключается в том, что SMTP-сервер закрывает соединение, когда Visual Studio подключается к нему по кабельному соединению, которое я использую (никаких проблем с подключением к SMTP-портам с использованием того же кабельного соединения и другого клиента SMTP или Telnet). Но если я подключаюсь к другому соединению (мой вторичный 3G), у Visual Studio нет никаких проблем. – Zishan

+0

Пробовал ли вы использовать метод SendAsync? он может работать с этим, когда это было причиной тайм-аута. [link] (http://msdn.microsoft.com/en-us/library/x5x13z6h#Y0) это сайт MSDN, который может вам помочь. @Zishan – Tartori

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; 
+0

Спасибо Diogo, но я думаю, что это то же самое, что и код, который я только что разместил выше. Однако он не требует вызова System.Windows.Forms. – Zishan

+0

это прекрасно работает со мной, попробуйте проверить, правильно ли вы настроили свои smtp-конфиги. – Severiano

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