C# SMTP 身份验证失败但凭据正确
C# SMTP authentication failed but credentials are correct
这是我的问题:我写了以下程序来测试我是否可以发送电子邮件:
class Program
{
static void Main(string[] args)
{
try {
Console.WriteLine("Mail To");
MailAddress to = new MailAddress("myemail@gmail.com");
Console.WriteLine("Mail From");
MailAddress from = new MailAddress("me@businessdomain.it");
MailMessage mail = new MailMessage(from, to);
Console.WriteLine("Subject");
mail.Subject = "test";
Console.WriteLine("Your Message");
mail.Body = "test";
SmtpClient smtp = new SmtpClient();
smtp.Host = "mail.domain.it";
smtp.Port = 25;
smtp.Credentials = new NetworkCredential(
"username", "password");
smtp.EnableSsl = false;
Console.WriteLine("Sending email...");
smtp.Send(mail);
}catch(Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
}
}
}
凭据正确(我使用 telnet、outlook 和 android 中的应用程序 k9mail 对其进行了测试,它们可以正常工作),如果我设置 gmail smtp 设置,程序就可以工作。
我真的无法理解这个错误的原因。
使用 wireshark 我发现了正在发生的事情:
S: 220 server1.business.it SMTP 服务器就绪
C: EHLO pc14
S:250server1.stargatenet.it你好[87.28.219.65] | 250 流水线 | 250 尺寸 25000000 | 250 8位MIME | 250 二进制 MIME | 250分块| 250 授权登录 CRAM-MD5 DIGEST-MD5 | 250 还行
C: AUTH登录用户:UsernameBase64
S: 334 VXNlcm5hbWU6
C: 密码: PasswordBase64
S: 334 UGFzc3dvcmQ6
程序似乎没有在询问时输入凭据。这怎么可能?
这个 link 救了我的命:link
这里对我遇到的问题进行了很好的描述:即使用户名是通过 AUTH LOGIN 传递的,服务器也会再次响应 AUTH_LOGIN_Username_Challenge。
此问题仅在使用 System.Net.Mail 时发生。 link 提出了三种可能的解决方案:
1)使用 CDOSYS(不发送带有 AUTH 登录名的用户名)
2)使用System.Web.Mail(不发送带有AUTH登录名的用户名)
3) 联系 SMTP 服务器所有者并让他们修复服务器。
不幸的是我不能成为 SMTP 服务器所有者,所以我不得不使用 System.Web.Mail。我知道它已被弃用,但不幸的是,在这种情况下,IMO 别无选择。
这是我的工作代码:
System.Web.Mail.MailMessage msg = new System.Web.Mail.MailMessage();
msg.Body = message.Body;
string smtpServer = "mail.business.it";
string userName = "username";
string password = "password";
int cdoBasic = 1;
int cdoSendUsingPort = 2;
if (userName.Length > 0)
{
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", smtpServer);
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", 25);
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", cdoSendUsingPort);
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", cdoBasic);
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", userName);
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", password);
}
msg.To = message.Destination;
msg.From = "me@domain.it";
msg.Subject = message.Subject;
msg.BodyFormat = MailFormat.Html;//System.Text.Encoding.UTF8;
SmtpMail.SmtpServer = smtpServer;
SmtpMail.Send(msg);
这个 answer 帮助我使用 System.Web.Mail。
虽然我遇到了同样的问题,但我找到了解决问题的方法here
总之,你必须使用
smtp.UseDefaultCredentials = false;
在
之后
smtp.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["email.username"].ToString(),
ConfigurationManager.AppSettings["email.password"].ToString());
如此简短的总结,看起来更像这样的东西应该可以工作:
SmtpClient smtp = new SmtpClient();
smtp.Host = ConfigurationManager.AppSettings["email.smtp"].ToString();
smtp.Port = Convert.ToInt32(ConfigurationManager.AppSettings["email.port"]);
smtp.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["email.username"].ToString(),
ConfigurationManager.AppSettings["email.password"].ToString());
smtp.UseDefaultCredentials = false;
smtp.EnableSsl = Convert.ToBoolean(ConfigurationManager.AppSettings["email.enablessl"]);
Console.WriteLine("Sending email..." + (i+1));
smtp.Send(mail);
任何感兴趣的人。我今天遇到了一个问题。并发现我的解决方案是订单。
SMTPClient client = new SMTPClient();
client.UseDefaultCredentials = false; // first after declare and needs to be false.
然后:
client.Credentials = new System.Net.NetworkCredential(sMTPSettings.SMTPLogin, sMTPSettings.SMTPPassword);
然后剩下的
希望对大家有所帮助
这是我的问题:我写了以下程序来测试我是否可以发送电子邮件:
class Program
{
static void Main(string[] args)
{
try {
Console.WriteLine("Mail To");
MailAddress to = new MailAddress("myemail@gmail.com");
Console.WriteLine("Mail From");
MailAddress from = new MailAddress("me@businessdomain.it");
MailMessage mail = new MailMessage(from, to);
Console.WriteLine("Subject");
mail.Subject = "test";
Console.WriteLine("Your Message");
mail.Body = "test";
SmtpClient smtp = new SmtpClient();
smtp.Host = "mail.domain.it";
smtp.Port = 25;
smtp.Credentials = new NetworkCredential(
"username", "password");
smtp.EnableSsl = false;
Console.WriteLine("Sending email...");
smtp.Send(mail);
}catch(Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
}
}
}
凭据正确(我使用 telnet、outlook 和 android 中的应用程序 k9mail 对其进行了测试,它们可以正常工作),如果我设置 gmail smtp 设置,程序就可以工作。 我真的无法理解这个错误的原因。
使用 wireshark 我发现了正在发生的事情:
S: 220 server1.business.it SMTP 服务器就绪
C: EHLO pc14
S:250server1.stargatenet.it你好[87.28.219.65] | 250 流水线 | 250 尺寸 25000000 | 250 8位MIME | 250 二进制 MIME | 250分块| 250 授权登录 CRAM-MD5 DIGEST-MD5 | 250 还行
C: AUTH登录用户:UsernameBase64
S: 334 VXNlcm5hbWU6
C: 密码: PasswordBase64
S: 334 UGFzc3dvcmQ6
程序似乎没有在询问时输入凭据。这怎么可能?
这个 link 救了我的命:link
这里对我遇到的问题进行了很好的描述:即使用户名是通过 AUTH LOGIN 传递的,服务器也会再次响应 AUTH_LOGIN_Username_Challenge。
此问题仅在使用 System.Net.Mail 时发生。 link 提出了三种可能的解决方案:
1)使用 CDOSYS(不发送带有 AUTH 登录名的用户名)
2)使用System.Web.Mail(不发送带有AUTH登录名的用户名)
3) 联系 SMTP 服务器所有者并让他们修复服务器。
不幸的是我不能成为 SMTP 服务器所有者,所以我不得不使用 System.Web.Mail。我知道它已被弃用,但不幸的是,在这种情况下,IMO 别无选择。
这是我的工作代码:
System.Web.Mail.MailMessage msg = new System.Web.Mail.MailMessage();
msg.Body = message.Body;
string smtpServer = "mail.business.it";
string userName = "username";
string password = "password";
int cdoBasic = 1;
int cdoSendUsingPort = 2;
if (userName.Length > 0)
{
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", smtpServer);
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", 25);
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", cdoSendUsingPort);
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", cdoBasic);
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", userName);
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", password);
}
msg.To = message.Destination;
msg.From = "me@domain.it";
msg.Subject = message.Subject;
msg.BodyFormat = MailFormat.Html;//System.Text.Encoding.UTF8;
SmtpMail.SmtpServer = smtpServer;
SmtpMail.Send(msg);
这个 answer 帮助我使用 System.Web.Mail。
虽然我遇到了同样的问题,但我找到了解决问题的方法here
总之,你必须使用
smtp.UseDefaultCredentials = false;
在
之后smtp.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["email.username"].ToString(),
ConfigurationManager.AppSettings["email.password"].ToString());
如此简短的总结,看起来更像这样的东西应该可以工作:
SmtpClient smtp = new SmtpClient();
smtp.Host = ConfigurationManager.AppSettings["email.smtp"].ToString();
smtp.Port = Convert.ToInt32(ConfigurationManager.AppSettings["email.port"]);
smtp.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["email.username"].ToString(),
ConfigurationManager.AppSettings["email.password"].ToString());
smtp.UseDefaultCredentials = false;
smtp.EnableSsl = Convert.ToBoolean(ConfigurationManager.AppSettings["email.enablessl"]);
Console.WriteLine("Sending email..." + (i+1));
smtp.Send(mail);
任何感兴趣的人。我今天遇到了一个问题。并发现我的解决方案是订单。
SMTPClient client = new SMTPClient();
client.UseDefaultCredentials = false; // first after declare and needs to be false.
然后:
client.Credentials = new System.Net.NetworkCredential(sMTPSettings.SMTPLogin, sMTPSettings.SMTPPassword);
然后剩下的
希望对大家有所帮助