public static IEnumerable<MimeMessage> Split (MimeMessage message, int maxSize)
{
if (message == null)
throw new ArgumentNullException ("message");
if (maxSize < 1)
throw new ArgumentOutOfRangeException ("maxSize");
using (var memory = new MemoryStream ()) {
message.WriteTo (memory);
memory.Seek (0, SeekOrigin.Begin);
if (memory.Length <= maxSize) {
yield return message;
yield break;
}
var streams = new List<Stream> ();
#if !PORTABLE && !COREFX
var buf = memory.GetBuffer ();
#else
var buf = memory.ToArray ();
#endif
long startIndex = 0;
while (startIndex < memory.Length) {
// Preferably, we'd split on whole-lines if we can,
// but if that's not possible, split on max size
long endIndex = Math.Min (memory.Length, startIndex + maxSize);
if (endIndex < memory.Length) {
long ebx = endIndex;
while (ebx > (startIndex + 1) && buf[ebx] != (byte) '\n')
ebx--;
if (buf[ebx] == (byte) '\n')
endIndex = ebx + 1;
}
streams.Add (new BoundStream (memory, startIndex, endIndex, true));
startIndex = endIndex;
}
var id = message.MessageId ?? MimeUtils.GenerateMessageId ();
int number = 1;
foreach (var stream in streams) {
var part = new MessagePartial (id, number++, streams.Count);
part.ContentObject = new ContentObject (stream);
var submessage = CloneMessage (message);
submessage.MessageId = MimeUtils.GenerateMessageId ();
submessage.Body = part;
yield return submessage;
}
}
yield break;
}