我正在构建一个应该在远程/隔离计算机上运行的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
有什么建议吗?
答案 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
答案 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;