使用c#发送经过验证的SMTP
本文关键字:验证 SMTP 经过 使用 | 更新日期: 2023-09-27 18:13:36
我已经向我的托管公司购买了一个经过身份验证的SMTP包。
我已经通过Outlook 2010成功测试了帐户设置。
前景设置:
: me@domain.com发送SMTP: smtp.hostingcompany.net
登录信息:- 用户
- : mydomain.com_account
- :密码
More Settings> Outgoing Server:
- 我的发送服务器(SMTP)需要身份验证 用户
- : mydomain
- :密码
我在指定NetworkCredentials时尝试了所有可能的组合,我一直得到SMTP异常:"发送电子邮件失败"InnerException: Base-64字符数组长度无效。
public static void SendEmail(string To, string Subject, string Body)
{
try
{
using (SmtpClient mySmtpClient = new SmtpClient(GlobalSettings.EmailHost))
{
mySmtpClient.UseDefaultCredentials = false;
//mySmtpClient.EnableSsl = false;
mySmtpClient.Credentials = new NetworkCredential(mydomain.com_account, GlobalSettings.EmailPassword);
MailAddress from = new MailAddress("email@mydomain");
MailAddress to = new MailAddress(To);
using (
MailMessage myMail = new MailMessage(from, to)
{
Subject = Subject,
SubjectEncoding = Encoding.UTF8,
Body = Body,
BodyEncoding = Encoding.UTF8,
IsBodyHtml = true
})
{
mySmtpClient.Send(myMail);
}
}
}
catch (SmtpException ex)
{
Log.WriteLog(string.Format("[Send Mail Exception] --> SMTPException has occurred: {0}", ex.Message), LogLevel.Error);
}
catch (Exception ex)
{
Log.WriteLog(string.Format("[Send Mail Exception] --> Exception has occurred: {0}", ex.Message), LogLevel.Error);
}
}
我已经为NetworkCredential()尝试了三个可能的用户名登录参数。
提前感谢。
EDIT: NTLM Hack
我在代码中添加了以下行:
FieldInfo transport = _client.GetType().GetField("transport",
BindingFlags.NonPublic | BindingFlags.Instance);
FieldInfo authModules = transport.GetValue(_client).GetType()
.GetField("authenticationModules",
BindingFlags.NonPublic | BindingFlags.Instance);
Array modulesArray = authModules.GetValue(transport.GetValue(_client)) as Array;
modulesArray.SetValue(modulesArray.GetValue(2), 0);
modulesArray.SetValue(modulesArray.GetValue(2), 1);
modulesArray.SetValue(modulesArray.GetValue(2), 3);
我现在收到一条新消息:
Mailbox unavailable. The server response was: relay not permitted
根据以下文章:"Hacking" System.Net.Mail。当SmtpClient选择使用NTLM身份验证时,可能会抛出异常。
文章提供了一个修复,尽管从文章的名称可以看出这是一个hack。
然而,在评论中,一位发帖者也指出,不正确的密码也会导致同样的异常。
你的第二个问题是:
邮箱不可用。服务器的响应是:relay not allowed
发生这种情况是因为服务器现在没有可接受的方法来验证您的身份,并且不愿意冒险获得"开放中继"的声誉。
这可能是可以修复的。问题是你使用的黑客手段太过强硬。当我们只需要覆盖NTLM时,它会覆盖除"Digest"之外的所有认证模块。
试试这个精简版:
FieldInfo transport = _client.GetType().GetField("transport",
BindingFlags.NonPublic | BindingFlags.Instance);
FieldInfo authModules = transport.GetValue(_client).GetType()
.GetField("authenticationModules",
BindingFlags.NonPublic | BindingFlags.Instance);
Array modulesArray = authModules.GetValue(transport.GetValue(_client)) as Array;
modulesArray.SetValue(modulesArray.GetValue(2), 1);