【发布时间】:2018-10-05 21:38:52
【问题描述】:
当我尝试向我自己的环境发送外部电子邮件时,我的 try{} catch{} 语句出现以下错误。在查看了多个帖子后,我找到了任何答案,因为我所有的 Smpt 配置似乎都是正确的。此错误仅发生在 gmail 地址...
错误:
System.Net.Mail.SmtpException: 'SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应是: 5.7.0 必须首先发出 STARTTLS 命令。 g18-v6sm1366471iob.79 - gsmtp'
配置:
MyServer.UseDefaultCredentials = false;
port is 587.
network host="smtp.gmail.com
enableSsl="true"
我的 catch 块出错:
catch (Exception ex)
{
System.Diagnostics.Debug.Print(ex.Message);
myReturn = 0;
throw;
}
完整代码:
public static int SendEmail(xxx.Models.Email passEmail, string fromEmail)
{
int myReturn = 0;
// Get SMTP properties for specific employee
SmtpSettings mySmtpSettings = ServiceAssistantService.SmtpSettingsService.GetSmtpSettings(passEmail.Employee.ID);
if ((mySmtpSettings == null || string.IsNullOrWhiteSpace(mySmtpSettings.UserID) || string.IsNullOrWhiteSpace(mySmtpSettings.Password) || string.IsNullOrWhiteSpace(mySmtpSettings.Server) || mySmtpSettings.Port == 0)
&& passEmail.EmailSettings != null)
mySmtpSettings = passEmail.EmailSettings;
SmtpClient MyServer = new SmtpClient();
MailMessage MyMessage = new MailMessage();
try
{
// Specify the properties of the SMTP Server
MyServer.Host = mySmtpSettings.Server.Trim();
MyServer.Port = mySmtpSettings.Port;
MyServer.EnableSsl = mySmtpSettings.UseSecure;
MyServer.UseDefaultCredentials = false;
// Provide specific credentials to SmptServer
NetworkCredential NC = new NetworkCredential();
NC.UserName = mySmtpSettings.UserID;
NC.Password = mySmtpSettings.Password;
MyServer.Credentials = NC;
if (fromEmail.IsValidEmailAddress())
{
MailAddress from = new MailAddress(fromEmail, fromEmail);
MyMessage.From = from;
}
// Create TO addresses
foreach (string myTo in passEmail.emailTo)
{
var myToAddresses = myTo.Replace(" ", "").Replace(";", ",").Split(',');
foreach(var toAddress in myToAddresses)
{
if (toAddress.Trim() != "" && toAddress.Trim().IsValidEmailAddress())
{
MailAddress receiver = new MailAddress(toAddress.Trim(), toAddress.Trim());
MyMessage.To.Add(receiver);
}
}
}
// Create CC address
foreach (string myCC in passEmail.emailCC)
{
if (myCC.Trim() != "" && myCC.Trim().IsValidEmailAddress())
{
MailAddress receiver = new MailAddress(myCC.Trim(), myCC.Trim());
MyMessage.CC.Add(receiver);
}
}
// Create BCC address
foreach (string myBCC in passEmail.emailBCC)
{
if (myBCC.Trim() != "" && myBCC.Trim().IsValidEmailAddress())
{
MailAddress receiver = new MailAddress(myBCC.Trim(), myBCC.Trim());
MyMessage.Bcc.Add(receiver);
}
}
// HTML or Plain Text
MyMessage.IsBodyHtml = passEmail.emailIsHTML;
// Populate Subject/Body
MyMessage.Subject = (passEmail.emailSubject ?? "").Trim();
MyMessage.Body = (passEmail.emailBody ?? "").Trim();
// Create Attachments
if (passEmail.emailAttachments != null)
{
foreach (Attachment myFile in passEmail.emailAttachments)
{
if (myFile != null)
{
MyMessage.Attachments.Add(myFile);
}
}
}
// VALIDATION START
if (mySmtpSettings.Server.Trim() == "" || mySmtpSettings.Port == 0)
{
throw new System.InvalidOperationException("E-Mail Server Not Configured");
}
else if (mySmtpSettings.UserID.Trim() == "" || mySmtpSettings.Password.Trim() == "")
{
throw new System.InvalidOperationException("E-Mail Sending Credentials Not Configured");
}
else if (MyMessage.From.Address == "")
{
throw new System.InvalidOperationException("Employee Not Configured For E-Mail");
}
// VALIDATION END
// Send the e-mail message
MyServer.Send(MyMessage);
// Populate the EMAIL LOG in the database
myReturn = ServiceAssistantService.EmailLogService.SaveEmailLog(new EmailLog()
{
CustomerID = passEmail.CustomerID,
EmployeeId = passEmail.Employee.ID,
actionId = passEmail.ActionID,
attemptId = passEmail.AttemptID,
ProgramId = passEmail.ProgramID,
ServiceId = passEmail.ServiceID,
From = fromEmail,
To = string.Join(",", passEmail.emailTo),
BCC = string.Join(",", passEmail.emailBCC),
CC = string.Join(",", passEmail.emailCC),
Subject = passEmail.emailSubject,
Body = passEmail.emailBody,
Attachments = (MyMessage.Attachments != null) ? MyMessage.Attachments.Count : 0,
});
}
catch (Exception ex)
{
System.Diagnostics.Debug.Print(ex.Message);
myReturn = 0;
throw;
}
finally
{
MyMessage.Dispose();
MyServer.Dispose();
}
return myReturn;
}
【问题讨论】:
-
你确定这行分配
true:MyServer.EnableSsl = mySmtpSettings.UseSecure;? -
是的,它设置为 true。我所有的变量都设置正确,所以我不确定我真的错过了什么......谢谢。