電子メールを送信するために、webDAV 用の Independentsoft の dll ラッパーを使用しています。20 通の同一のメールを送信すると、1 ~ 5 通のメールが下書きフォルダーに到達しますが、実際には送信されません。Outlook で下書きメールを開いて [送信] をクリックすると送信されます。テストするたびに、少なくとも 1 つのメールの送信に失敗し、場合によってはそれ以上のメールが送信されません。20 通のメールの中で、1 番目、2 番目、15 番目など、失敗するメールが異なる場合があります。
コードは次のとおりです。
foreach (var email in emailsToSend)
{
try
{
var service = new Service("https://Ourserver/ews/Exchange.asmx", credentials);
ItemId messageId = null;
ItemInfoResponse sendResponse = null;
if (!string.IsNullOrWhiteSpace(email.messageID))
{
try
{
messageId = new ItemId(email.messageID);
sendResponse = service.Send(messageId);
if (sendResponse.ResponseClass == ResponseClass.Success)
{
email.Success = true;
email.SentTimeStamp = DateTime.Now;
email.messageID = messageId.Id;
return;
}
else
{
email.LastError = sendResponse.Message;
email.messageID = null;
}
}
catch(Exception ex)
{
email.LastError = ex.Message;
email.messageID = null;
email.ErrorCount++;
}
ctx.SubmitChanges();
}
var mm = new Message();
foreach (var to in email.Tos)
{
switch (to.Type)
{
case 0: mm.ToRecipients.Add(new Mailbox(to.Address, to.Name));
break;
case 1: mm.CcRecipients.Add(new Mailbox(to.Address, to.Name));
break;
case 2: mm.BccRecipients.Add(new Mailbox(to.Address, to.Name));
break;
}
}
var attachmentCollection = new List<Independentsoft.Exchange.Attachment>();
foreach (var att in email.Attachments)
{
var attachment = new FileAttachment(att.FileData.ToArray(), att.FileName);
attachmentCollection.Add(attachment);
}
var body = new Body(email.Body);
body.Type = email.IsHTML ? BodyType.Html : BodyType.Best;
mm.Body = body;
mm.Subject = email.Subject;
try
{
//check for use of secondary emailaddress
var response = service.ResolveNames(string.Format("smtp:{0}", email.FromAddress));
if (response.Resolutions.Count == 1 && response.Resolutions.Cast<Resolution>().First().Mailbox != null)
{
Mailbox userMailbox = response.Resolutions.Cast<Resolution>().First().Mailbox;
StandardFolderId userInboxFolder = new StandardFolderId(StandardFolder.Inbox, userMailbox);
Folder inbox = service.GetFolder(userInboxFolder);
if (inbox != null)
{
service.ExchangeImpersonation = new Identity(userMailbox.EmailAddress);
}
else
{
mm.ReplyTo.Add(new Mailbox(email.FromAddress, email.FromName));
}
}
else
{
mm.ReplyTo.Add(new Mailbox(email.FromAddress, email.FromName));
}
}
catch
{
mm.ReplyTo.Add(new Mailbox(email.FromAddress, email.FromName));
}
messageId = service.CreateItem(mm);
if (attachmentCollection.Count > 0)
{
IList<CreateAttachmentResponse> responses = service.CreateAttachment(attachmentCollection, messageId);
messageId.ChangeKey = responses.Last().Attachment.AttachmentId.RootItemChangeKey;
}
sendResponse = service.Send(messageId);
if (sendResponse.ResponseClass == ResponseClass.Success)
{
email.Success = true;
email.SentTimeStamp = DateTime.Now;
email.messageID = messageId.Id;
}
else
{
email.LastError = sendResponse.Message;
email.messageID = messageId.Id;
email.ErrorCount++;
}
ctx.SubmitChanges();
}
catch (Exception ex)
{
email.LastError = ex.Message;
email.ErrorCount++;
ctx.SubmitChanges();
}
}
下書きフォルダーから送信すると、成功したメール ヘッダーと失敗したメール ヘッダーの両方がほぼ同じになります。