Получение сообщения электронной почты (.eml) в виде вложения в SharePoint ListItem

У меня есть SPEmailEventReceiver, который получает сообщение электронной почты, добавляет элемент списка в список, перебирает коллекцию вложений сообщений электронной почты и добавляет их в коллекцию вложений элемента списка. Мне также нужно получить само сообщение электронной почты (файл .eml) и добавить его в коллекцию вложений ListItem. Я могу получить тело письма, тему, отправителя и т. д., но не могу получить само сообщение. Любые предложения о том, что я могу использовать? Вот что у меня есть до сих пор.

   public class EInvoiceEmailEventReceiver : SPEmailEventReceiver
    {
    /// <summary>
    /// The list received an e-mail message.
    /// </summary>
    public override void EmailReceived(SPList list, SPEmailMessage emailMessage, String receiverData)
    {
        if (list == null)
            throw new ArgumentNullException("list", "null list parameter in EmailReceived");

        if (emailMessage == null)
            throw new ArgumentNullException("emailMessage", "null emailMessage parameter in EmailReceived");
        try
        {
            AddItemFromEmail(list, emailMessage, receiverData);
        }
        catch (Exception ex)
        {
            DiagnosticsService.WriteToLocalLog("ERROR: Error while adding eInvoice item from email: " +     
        }
    }

    private void AddItemFromEmail(SPList list, SPEmailMessage emailMessage, String receiverData)
     {
        string subject;
        try
        {
           subject = emailMessage.Headers["Subject"] ?? string.Empty;
        }
        catch
        {
            subject = string.Empty;
        }

        SPListItem item = list.Items.Add();

        SetItemFieldValue(item, "Title", "Crreated from email on " + DateTime.Now.ToString("yyyy-MM-dd 
                          HH:mm:ss.FFFFFFF"));
        SetItemFieldValue(item, "EmailFromAddress", emailMessage.Sender);

        SPAttachmentCollection itemAttachments = item.Attachments;
        base.EmailReceived(list, emailMessage, receiverData);
        SPEmailAttachmentCollection emailAttachments = emailMessage.Attachments;

        if (emailAttachments != null)
        {
            foreach (SPEmailAttachment emailAttachment in emailAttachments)
            {
                try
                {
                    byte[] emailAttachmentBytes = new byte[emailAttachment.ContentStream.Length];
                    emailAttachment.ContentStream.Read(emailAttachmentBytes, 0, emailAttachmentBytes.Length);
                    itemAttachments.Add(emailAttachment.FileName, emailAttachmentBytes);
                }
                catch (Exception ex)
                {
                    DiagnosticsService.WriteToLocalLog("Error while moving attachment from email to eInvoice  
                    item: " + ex.Message, LogLogLevel.Error, CategoryId.CustomAction);
                }
            }
           }

            item.Update();
        }
    private static void SetItemFieldValue(SPListItem item, string fieldName, string value)
     {
        try
        {
            item[fieldName] = value ?? string.Empty;
        }
        catch
        {
            DiagnosticsService.WriteToLocalLog(string.Format("Error while setting field {0} in eInvoice list.",   fieldName), LogLogLevel.Error, CategoryId.CustomAction);
        }
       }
     }
   }

person Life is good    schedule 23.06.2014    source источник


Ответы (1)


Вы можете использовать GetMessageStream метод SPEmailMessage для этого.

var emailStream = emailMessage.GetMessageStream();
var emailAsBytes = new byte[emailStream.Length];
emailStream.Read(emailAsBytes, 0, emailStream.Length);
itemAttachments.Add('Message.eml', emailAsBytes);
person Yevgeniy.Chernobrivets    schedule 23.06.2014
comment
Сначала я пытался использовать это, но это не сработало. Оказывается, у меня были проблемы с кэшированием сервером старых dll. Я перезапустил сервер, попробовал еще раз, и это сработало. Спасибо за ответ! - person Life is good; 24.06.2014