我想通过需要身份验证的smtp主机使用c#SmtpClient发送电子邮件,否则会因拒绝中继而失败。我已阅读了很多帖子,但没有一个能完全解决我的问题,即当我指定NetworkCredentials时,在与mailhost的通信中,没有传递凭据。这让我很困惑。
这是设置凭据并发送邮件的代码:
using (SmtpClient smtp = new SmtpClient
{
Host = smtpserver,
Port = port,
EnableSsl = ssl
})
{
if (username.Length > 0)
{
Console.WriteLine("Setting credentials to\nusername: {0}\npassword: {1}", username, password);
smtp.UseDefaultCredentials = false;
smtp.Credentials = new NetworkCredential(username, password);
}
smtp.Send(message);
}
正确的凭据将打印到控制台。
这是Wireshark捕获的TCP流:
220 mail.myhost.com Microsoft ESMTP MAIL Service ready at Tue, 20 Jan 2015 12:44:19 +0100
EHLO DK-XYZ-800SFF1
250-mail.myhost.com Hello [172.16.123.132]
250-SIZE 52428800
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-AUTH
250-8BITMIME
250-BINARYMIME
250 CHUNKING
MAIL FROM:<myemail@myhost.dk>
250 2.1.0 Sender OK
RCPT TO:<someemail@gmail.com>
550 5.7.1 Unable to relay
尽管已在SmtpClient上设置了凭据,但显然没有进行身份验证尝试。
答案 0 :(得分:0)
我解决了这个问题并在此过程中学到了一点。虽然我的代码是正确的,但我没有提供的参数之一是端口信息。从上面的SMTP日志中,我们可以看到AUTH行是空的,即没有可用于身份验证的协议。这就是为什么SmtpClient没有发送任何凭据的原因。
AUTH专线没有任何认证方法的原因是因为我使用端口25进行通信。当我切换到端口587时,smtp报告认证是可能的,并且发送了凭据并且邮件按预期发送。
答案 1 :(得分:-1)
public static void CreateTestMessage2(string server)
{
string to = "jane@contoso.com";
string from = "ben@contoso.com";
MailMessage message = new MailMessage(from, to);
message.Subject = "Using the new SMTP client.";
message.Body = @"Using this new feature, you can send an e-mail message from an application very easily.";
SmtpClient client = new SmtpClient(server);
// Credentials are necessary if the server requires the client
// to authenticate before it will send e-mail on the client's behalf.
client.UseDefaultCredentials = true;
try {
client.Send(message);
}
catch (Exception ex) {
Console.WriteLine("Exception caught in CreateTestMessage2(): {0}",
ex.ToString() );
}
}`