У меня есть процесс, который будет сидеть на машине автоматической рассылки электронной почты для отправки электронных писем на основе плоского файла. Этот файл содержит Кому, Копия, Тема, Тело, Вложения и Отправитель. Когда электронное письмо отправлено, я хочу, чтобы любые неудавшиеся электронные письма или откаты возвращались отправителю, а не автоматизированной службе. Я пробовал два решения, которые работают ... частично.
Во-первых, используя SMTP, я могу задать адреса возврата и адреса От и получать отклоненные сообщения электронной почты, чтобы вернуться к отправителю. Однако политика компании заключается в том, что я не могу жестко кодировать идентификаторы пользователей и / или пароли. Я пытался использовать флаг «UseDefaultCredentials» без удачи. Наши AD логин и Exchange разные, а пароль один и тот же.
Вот код:
private void SendEmail(EmailProperties pEmail)
{
try
{
MailMessage mail = new MailMessage();
mail.Headers.Add("Return-Path", AddressLookup(pEmail.Sender));
foreach (string strTo in pEmail.To)
{
mail.To.Add(AddressLookup(strTo));
}
foreach (string strCC in pEmail.CC)
{
mail.CC.Add(AddressLookup(strCC));
}
mail.Subject = pEmail.Subject;
mail.Body = pEmail.Body;
mail.From = new MailAddress(AddressLookup(pEmail.Sender));
//mail.ReplyToList.Add(AddressLookup(pEmail.ReplyTo));
SmtpClient smtpClient = new SmtpClient("server", 25);
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpClient.UseDefaultCredentials = true;
//smtpClient.Credentials = new NetworkCredential("user", "pw");
smtpClient.EnableSsl = false;
smtpClient.Send(mail);
}
catch (Exception ex)
{
throw ex;
}
}
private string AddressLookup(string pstrAddr)
{
try
{
if (pstrAddr.Contains("@")) return pstrAddr;
Outlook.Application OutlookApp = new Outlook.Application();
Outlook.AddressLists addrLists = OutlookApp.Session.AddressLists;
Outlook.AddressList gal = addrLists["Global Address List"];
Outlook.AddressEntry entry = gal.AddressEntries[pstrAddr];
return entry.GetExchangeUser().PrimarySmtpAddress;
}
catch (Exception ex)
{
throw ex;
}
}
Во-вторых:
Я попытался с помощью Outlook Interop, и я могу отправить электронное письмо нормально, но все отказов возвращаются в автоматизированную службу. Вот код:
private void SendEmail(EmailProperties pEmail)
{
try
{
Outlook.Application OutlookApp = new Outlook.Application();
Outlook.MailItem mail = OutlookApp.CreateItem(
Outlook.OlItemType.olMailItem) as Outlook.MailItem;
Outlook.AddressEntry currentUser =
OutlookApp.Session.CurrentUser.AddressEntry;
if (currentUser.Type == "EX")
{
mail.To = pEmail.To;
mail.CC = pEmail.CC;
mail.Subject = pEmail.Subject;
mail.Body = pEmail.Body;
mail.ReplyRecipients.Add(pEmail.ReplyTo);
mail.Sender = AddressLookup(pEmail.Sender);
mail.Recipients.ResolveAll();
mail.ReplyRecipients.ResolveAll();
foreach (string e in pEmail.Attachments)
{
mail.Attachments.Add(e, Outlook.OlAttachmentType.olByValue,
Type.Missing, Type.Missing);
}
mail.Send();
}
}
catch (Exception ex)
{
throw ex;
}
}
Есть ли что-то, чего мне не хватает, или другое направление, в котором я могу пойти с этим. Я бы предпочел использовать взаимодействие для отправки писем и просто изменить заголовок письма. Если есть лучший способ сделать это, я открыт для предложений.
Спасибо!