Search code examples
c#imapemail-attachmentslumisoft

Lumisoft.net IMAP server can't add attachments to messages


I'm trying to set up an IMAP server which is pulling data from a SQL database. I've got the messages working no problems, but I can't work out how to attach attachments to them.

The attachments object on the Mail_Message object also only has a getter and a method called GetAttachments() which doesn't seem to connect to anywhere.

My current code is:

//this is my own object I'm using to pull data from the database
var cmMsg = _ml.GetMessage(mId, session.AuthenticatedUserIdentity.Name, -1);

var msgBody = new MIME_b_Text(MIME_MediaTypes.Text.html);
var msg = new Mail_Message();
msg.Body = msgBody;
msg.To = new Mail_t_AddressList();
msg.From = new Mail_t_MailboxList {new Mail_t_Mailbox(cmMsg.From, cmMsg.FromEmail)};
msg.Cc = new Mail_t_AddressList();
msg.Bcc = new Mail_t_AddressList();

foreach (var recipient in cmMsg.Recipients)
{
    if (recipient.isTo)
    {
        msg.To.Add(new Mail_t_Mailbox(recipient.FullName, recipient.SMTPAddress));
    }
    else if(recipient.isCC)
    {
        msg.Cc.Add(new Mail_t_Mailbox(recipient.FullName, recipient.SMTPAddress));
    }
    else if (recipient.isBCC)
    {
        msg.Bcc.Add(new Mail_t_Mailbox(recipient.FullName, recipient.SMTPAddress));
    }
}

//I tried adding a setter to the attachment object, but just get errors with this code
var a = new List<MIME_Entity>();

foreach (var attachment in cmMsg.Attachments)
{
    var aCT = new MIME_b_Multipart(new MIME_h_ContentType("application/octet-stream"));


    a.Add(new MIME_Entity
    {
        Body = aCT,
        ContentDisposition = new MIME_h_ContentDisposition("attachment"),

    });
}
msg.Attachments = a.ToArray();

msg.Subject = cmMsg.Subject;
msg.Date = cmMsg.TimeDate;
msg.MessageID = cmMsg.InternetMessageId;

if (e.FetchDataType == IMAP_Fetch_DataType.MessageStructure)
{

}
else if(e.FetchDataType == IMAP_Fetch_DataType.MessageHeader)
{

}
else
{
    msgBody.SetText(MIME_TransferEncodings.QuotedPrintable, Encoding.UTF8, cmMsg.HtmlBody);
    _da.MarkAsRead(archiveID, session.AuthenticatedUserIdentity.Name);
}

e.AddData(info, msg);

I'm not sure if I'm missing something or just got this set up wrong. I noticed there was a MySQL API in the example projects, but that didn't have anything to do with attachments in it either.


Solution

  • Ok so turns out I was going about it the complete wrong way. Below is the code required

    Effectively, it requires setting the message to be multipart mixes instead of just text. You can then add the attachments as a body part.

    var cmMsg = _ml.GetMessage(mId, session.AuthenticatedUserIdentity.Name, -1);
    
                MIME_h_ContentType contentType_multipartMixed = new MIME_h_ContentType(MIME_MediaTypes.Multipart.mixed);
                contentType_multipartMixed.Param_Boundary = Guid.NewGuid().ToString().Replace('-', '.');
                MIME_b_MultipartMixed multipartMixed = new MIME_b_MultipartMixed(contentType_multipartMixed);
                var msg = new Mail_Message();
                msg.To = new Mail_t_AddressList();
                msg.From = new Mail_t_MailboxList {new Mail_t_Mailbox(cmMsg.From, cmMsg.FromEmail)};
                msg.Cc = new Mail_t_AddressList();
                msg.Bcc = new Mail_t_AddressList();
                msg.Body = multipartMixed;
    
                foreach (var recipient in cmMsg.Recipients)
                {
                    if (recipient.isTo)
                    {
                        msg.To.Add(new Mail_t_Mailbox(recipient.FullName, recipient.SMTPAddress));
                    }
                    else if(recipient.isCC)
                    {
                        msg.Cc.Add(new Mail_t_Mailbox(recipient.FullName, recipient.SMTPAddress));
                    }
                    else if (recipient.isBCC)
                    {
                        msg.Bcc.Add(new Mail_t_Mailbox(recipient.FullName, recipient.SMTPAddress));
                    }
                }
    
                msg.Subject = cmMsg.Subject;
                msg.Date = cmMsg.TimeDate;
                msg.MessageID = cmMsg.InternetMessageId;
                msg.MimeVersion = "1.0";
                msg.Header.Add(new MIME_h_Unstructured("X-MS-Has-Attach", "yes"));
    
                if (e.FetchDataType == IMAP_Fetch_DataType.MessageStructure)
                {
    
                }
                else if(e.FetchDataType == IMAP_Fetch_DataType.MessageHeader)
                {
    
                }
                else
                {
                    MIME_Entity entity_text_plain = new MIME_Entity();
                    MIME_b_Text text_plain = new MIME_b_Text(MIME_MediaTypes.Text.plain);
                    entity_text_plain.Body = text_plain;
                    text_plain.SetText(MIME_TransferEncodings.QuotedPrintable, Encoding.UTF8, cmMsg.HtmlBody);
                    multipartMixed.BodyParts.Add(entity_text_plain);
    
    
                    foreach (var attachment in cmMsg.Attachments)
                    {
                        using (var fs = new FileStream(@"C:\test.txt", FileMode.Open))
                        {
                            multipartMixed.BodyParts.Add(Mail_Message.CreateAttachment(fs, "test.txt"));
                        }
                    }
                }
    
                e.AddData(info, msg);