6

MailKit ライブラリを使用して電子メールを処理していますが、これはうまく機能しています。ただし、メールを構成ファイルに分割しようとしています a) メインのメール (添付ファイルなし) b) ファイルシステムに保存する個々の添付ファイル。

添付ファイルを個別に保存できますが、メール本文コードから削除できないようです。つまり、メインのメールと一緒に保存されるため、データが複製されます。:/

私はもう試した:

foreach (MimePart part in inMessage.BodyParts)
{ 
    if (part.IsAttachment)
    {
        // Remove MimePart    < This function isn't available on the collection.
    }
}

また試してみました:

var builder = new BodyBuilder();
foreach (MimePart part in inMessage.BodyParts)
{ 
    if (!part.IsAttachment)
    {
        // Add MimeParts to collection    < This function isn't available on the collection.
    }
}
outMessage.Body = builder.ToMessageBody();

誰かがこれを手伝ってくれるなら、私はとても感謝しています。

実装されたソリューション 参考までに:

private string GetMimeMessageOnly(string outDirPath)
        {
            MimeMessage message = (Master as fsEmail).GetMimeMessage();

            if (message.Attachments.Any())
            {
                var multipart = message.Body as Multipart;
                if (multipart != null)
                {
                    while (message.Attachments.Count() > 0)
                    {
                        multipart.Remove(message.Attachments.ElementAt(0));
                    }
                }
                message.Body = multipart;
            }

            string filePath = outDirPath + Guid.NewGuid().ToString() + ".eml";
            Directory.CreateDirectory(Path.GetDirectoryName(outDirPath));
            using (var cancel = new System.Threading.CancellationTokenSource())
            {    
                using (var stream = File.Create(filePath)) 
                {
                    message.WriteTo(stream, cancel.Token);
                }
            }
            return filePath;
        }

添付ファイルのみを取得するには:

private List<string> GetAttachments(string outDirPath)
        {
            MimeMessage message = (Master as fsEmail).GetMimeMessage();

            List<string> list = new List<string>();
            foreach (MimePart attachment in message.Attachments)
            {
                using (var cancel = new System.Threading.CancellationTokenSource())
                {
                    string filePath = outDirPath + Guid.NewGuid().ToString() + Path.GetExtension(attachment.FileName);
                    using (var stream = File.Create(filePath))
                    {
                        attachment.ContentObject.DecodeTo(stream, cancel.Token);
                        list.Add(filePath);
                    }
                }
            }
            return list;
        }
4

3 に答える 3

10

MimePart添付ファイルhttps://github.com/jstedfast/MimeKit/blob/master/MimeKit/MimeMessage.cs#L734であるすべての を取得し、すべての を反復してhttps://github.com/jstedfast/Multipartを呼び出すことができます削除する添付ファイルのMimeKit/blob/master/MimeKit/Multipart.cs#L468

以下のサンプルでは、​​メールについていくつかの仮定をしています。たとえば、Multipart一部のメール クライアント (Outlook) は、メールの作成方法が非常に独創的です。

static void Main(string[] args)
{
    var mimeMessage = MimeMessage.Load(@"x:\sample.eml");
    var attachments = mimeMessage.Attachments.ToList();
    if (attachments.Any())
    {
        // Only multipart mails can have attachments
        var multipart = mimeMessage.Body as Multipart;
        if (multipart != null)
        {
            foreach(var attachment in attachments)
            {
                multipart.Remove(attachment);
            }
        }
        mimeMessage.Body = multipart;
    }
    mimeMessage.WriteTo(new FileStream(@"x:\stripped.eml", FileMode.CreateNew));
}
于 2014-06-11T19:48:03.230 に答える
7

MimeKit 0.38.0.0から、 MimeIteratorを使用して MIME ツリー構造をトラバースし、削除したい (そして削除したい) 添付ファイルのリストを収集できるようになります。これを行うには、コードは次のようになります。

var attachments = new List<MimePart> ();
var multiparts = new List<Multipart> ();
var iter = new MimeIterator (message);

// collect our list of attachments and their parent multiparts
while (iter.MoveNext ()) {
    var multipart = iter.Parent as Multipart;
    var part = iter.Current as MimePart;

    if (multipart != null && part != null && part.IsAttachment) {
        // keep track of each attachment's parent multipart
        multiparts.Add (multipart);
        attachments.Add (part);
    }
}

// now remove each attachment from its parent multipart...
for (int i = 0; i < attachments.Count; i++)
    multiparts[i].Remove (attachments[i]);
于 2014-06-14T23:15:35.723 に答える