Я пишу службу Windows, используя c # .NET 4.0 (моя рабочая станция для разработки - Windows 7).
Целью является отправка электронного письма непосредственно из сервиса в случае ошибок при обработке.
Я включил фрагмент кода, чтобы показать, чего я пытаюсь достичь:
try
{
string emailAddresses = "me@sample.com";
string emailCCAddresses = "you@sample.com";
//Send the email
using (MailMessage mailMsg = new MailMessage())
{
mailMsg.To.Add(emailAddresses);
mailMsg.From = new MailAddress("winService@sample.com");
mailMsg.CC.Add(emailCCAddresses);
mailMsg.Subject = " Error Message ";
mailMsg.Body = DateTime.Now + " : Invalid File Encountered." ;
////Creating the file attachment
using (Attachment data = new Attachment("C:\\users\\sample.xml", MediaTypeNames.Application.Octet))
{
//Add timestamp info for the file
ContentDisposition disposition = data.ContentDisposition;
disposition.ModificationDate = File.GetLastWriteTime("C:\\users\\sample.xml");
mailMsg.Attachments.Add(data);
SmtpClient emailClient = new SmtpClient("example.Sample.com", 25);
emailClient.DeliveryMethod = SmtpDeliveryMethod.Network;
emailClient.UseDefaultCredentials = true;
emailClient.Send(mailMsg);
}
}//end using
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Проблема, с которой я сталкиваюсь, заключается в том, что опция электронной почты не работает из службы win на любом компьютере с Windows 7. Однако точно такой же код будет отлично работать на машине с Win XP. Будьте осторожны, это не может быть протестировано как консольное приложение. Он должен быть запущен как сервис, чтобы увидеть поведение. Я поместил тот же код в консольное приложение, и он отлично работал на моей машине win 7.
Кроме того, я включил функции окон клиента и сервера telnet и смог успешно отправлять электронную почту через командную строку.
Я попробовал несколько вещей, чтобы попытаться определить причину (ничего не помогло) -
Установка NetworkCredential в явном виде и установка UseDefaultCredentials = false.
emailClient.Credentials = new System.Net.NetworkCredential ("имя пользователя", "pwd", "Domain1");
изменив опцию «Вход в систему как» службы на мои ИД пользователя и pwd
- Адреса электронной почты От и До являются подлинными, а не фиктивными (в моем реальном коде это!)
Единственное отличие, которое я могу найти, заключается в том, что служба windows установлена под локальной системной учетной записью. Но изменение входа в систему на должно было привести к использованию моих данных аутентификации / учетных данных, указанных в коде. ИТ-специалист в моем офисе сказал, что единственное различие, которое он увидел, было то, что мое сообщение было отправлено как ретранслятор (не уверен, что это означает, что от / до и вход в систему как учетные записи при обновлении до моего логина не изменил результат)
Исключение, которое я вижу, будучи пойманным:
Возникло исключение SMTP: System.Net.Mail.SmtpException: сбой отправки почты. ---> System.Net.WebException: невозможно подключиться к удаленному серверу ---> System.Net.Sockets.SocketException: была сделана попытка получить доступ к сокету способом, запрещенным его правами доступа XXX.XXX.XXX .XXX XX
в System.Net.Sockets.Socket.DoConnect (EndPoint endPointSnapshot, SocketAddress socketAddress)
в System.Net.ServicePoint.ConnectSocketInternal (логическое connectFailure, сокет s4, сокет s6, сокет и сокет, IP-адрес и адрес, состояние ConnectSocketState, IAsyncResult asyncResult, тайм-аут Int32, исключение и исключение)
Любые идеи приветствуются!
Я чувствую, что это связано с политикой / функцией безопасности Windows 7, и, надеюсь, может быть так же просто, как изменить настройку по умолчанию.