MimeKit.MessagePartial.Split C# (CSharp) Method

Split() public static method

Splits the specified message into multiple messages.
Splits the specified message into multiple messages, each with a message/partial body no larger than the max size specified.
/// is null. /// /// is less than 1. ///
public static Split ( MimeMessage message, int maxSize ) : IEnumerable
message MimeMessage The message.
maxSize int The maximum size for each message body.
return IEnumerable
		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;
		}