1

リモート/分離されたマシンで実行され、管理者に電子メールでエラー通知を送信することになっている 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

何かアドバイス?

4

3 に答える 3

9

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

于 2012-06-11T09:08:08.893 に答える
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;
于 2012-06-07T22:41:55.000 に答える