如何用新行分隔短信?

How to separate text messages by new lines?

我注意到如果我通过电子邮件发送短信,它只允许 159 个字符。 (我认为这是由于 smtp)

我发送的一些消息超过了 159 个字符,我可以按一下发送,但我更愿意以换行符分隔发送消息。

这是我的短信示例:

    (Need Bid)Salesman: Firstname Lastname
    Customer: CustFirstname CustLastname
    Customer Address: 1111 TheSteetAdd St, Lockport, New York 12124
    Customer Number: 111-222-3333
    Apt Date/Time: 1/17/2021 5:00 PM

括号中的文字是主题行。所以这也可能会改变它的总字符串数。 对于这些短信中的每一条,我还添加了“\r\n”,因此它会为用户创建一个不错的新行。

这是我希望如何执行此方法的示例。我不想只是随意地刺痛,我希望它是在新的线路上。

    (1/2)
    (Need Bid)Salesman: Firstname Lastname
    Customer: CustFirstname CustLastname
    Customer Address: 1111 TheSteetAdd St, Lockport, New York 12124
    
    (2/2)
    Customer Number: 111-222-3333
    Apt Date/Time: 1/17/2021 5:00 PM
        {
            MailAddress from = new MailAddress("email@gmail.com", "Firstname Lastname");
            MailAddress to = new MailAddress("1112223333@vtext.com", "Firstname Lastname");
            MailMessage message = new MailMessage(from, to);
            message.Subject = subject;
            message.Body = body;
            MailAddress bcc = new MailAddress("email@gmail.com");
            message.Bcc.Add(bcc);
            SmtpClient client = new SmtpClient("stuff", 26);
            client.Credentials = CredentialCache.DefaultNetworkCredentials;
            Debug.WriteLine("Sending an email message to {0} and {1}.",
                to.DisplayName, message.Bcc.ToString());

            var totalMessage = message.Subject + message.Body;

            //See if message is longer than 159 characters, if so send in another message
            if (message.Subject.Count() + message.Body.Count() > 159)
            {

                var splitBodyByNewLine = message.Body.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

                string[] arrayOfMessages = new string[] { };
                string currentString;

                int totalStingCount = message.Subject.Count();

                foreach (string aString in splitBodyByNewLine)
                {
                    var tempChecker = aString.Count();
                    var tempCheckerBPlusS = totalStingCount + aString.Count();

                    if (arrayOfMessages.Length == 0)
                    {
                        if (totalStingCount + aString.Count() < 159)
                        {

                        }
                    }
                    else if (aString.Count() < 159)
                    {

                    }
                }


                Debug.WriteLine("");
            }

            try
            {
                client.Send(message);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception caught in CreateBccTestMessage(): {0}",
                    ex.ToString());
            }

            
        }

我回答这个问题,觉得挑战不大。我没有考虑你的代码,从头开始有一个解决方案。

它是如何工作的,我们需要拆分行,因为您需要消息 pr。行,同时每条消息不应超过 159 个字符。我们完成该过程并检查行中的剩余文本,如果它们少于 159 个字符,我们将剩下的并停止。

所以让我们转到代码。

她是你给定的输入:

var fullMsg = "(Need Bid)Salesman: Firstname Lastname\r\n" +
              "Customer: CustFirstname CustLastname\r\n" +
              "Customer Address: 1111 TheSteetAdd St, Lockport, New York 12124\r\n" +
              "Customer Number: 111 - 222 - 3333\r\n" +
              "Apt Date/ Time: 1 / 17 / 2021 5:00 PM\r\n";

现在我们创建一个方法来获取我们的消息,代码是自我解释:

public static List<string> CreateSmallMessages(string fullMsg)
{
    const int MAX_STR = 159;
    var lines = fullMsg.Split("\r\n");

    StringBuilder sb = new StringBuilder();
    List<string> messages = new List<string>();
    int wordsCount = 0;

    for (int i = 0; i < lines.Length - 1; i++)
    {
        wordsCount += lines[i].Length;
        sb.Append(lines[i] + "\r\n");

        if (wordsCount + lines[i + 1].Length >= MAX_STR)
        {
            wordsCount = 0;
            messages.Add(sb.ToString());
            sb = new StringBuilder();
        }

        if (RemainWords(lines.Skip(i).ToArray()) < MAX_STR)
        {
            var remainText = new string(lines.Skip(i + 1).SelectMany(e => $"{e}\r\n").ToArray());
            messages.Add(remainText);
            break;
        }
    }

    return messages;
}

public static int RemainWords(string[] lines)
{
    return lines.SelectMany(e => e).Count();
}

现在让我们在 main 方法中尝试一下:

var messages = CreateSmallMessages(fullMsg);

for (var i = 0; i < messages.Count; i++)
{
    Console.WriteLine($"({i + 1}/{messages.Count})");
    Console.WriteLine(messages[i]);
}

这将为我们提供以下输出:

(1/2)
(Need Bid)Salesman: Firstname Lastname
Customer: CustFirstname CustLastname
Customer Address: 1111 TheSteetAdd St, Lockport, New York 12124

(2/2)
Customer Number: 111 - 222 - 3333
Apt Date/ Time: 1 / 17 / 2021 5:00 PM

现在你可以做一个循环来分别发送每条消息,那部分就留给你了。

注意:我很确定代码可以改进和优化,但这是一个概念性的答案,展示了我将如何做到这一点,欢迎您进一步推动它更上一层楼。

在花时间考虑所有场景和极端情况后,我的解决方案就在这里。

public static List<string> MessageSplitter(string splitterSubject, string splitterBody)
    {
        var splitBodyByNewLine = Regex.Split(splitterBody, @"(?<=\r\n)").Where(s => s != String.Empty);

        List<string> unGroupedStings = new List<string>();
        List<string> GroupedMessages = new List<string>();

        int maxMessageCount = 140;
        int currentStingCount = 0;

        foreach (string aString in splitBodyByNewLine)
        {
            if (unGroupedStings.Count() == 0 && GroupedMessages.Count() == 0 && currentStingCount == 0)
            {
                if (splitterSubject.Count() + aString.Count() < maxMessageCount)
                {
                    unGroupedStings.Add(splitterSubject + "##" + aString);

                    currentStingCount = splitterSubject.Count() + aString.Count();
                }
            }
            else if (currentStingCount + aString.Count() < maxMessageCount)
            {
                if (aString == splitBodyByNewLine.Last())
                {
                    unGroupedStings.Add(aString);

                    string lastTempSting = string.Join("", unGroupedStings);
                    string lastTempSting2 = lastTempSting.Remove(0, lastTempSting.IndexOf("##") + 2);

                    GroupedMessages.Add(lastTempSting2);
                    unGroupedStings.Clear();
                    currentStingCount = 0;
                }
                else
                {
                    unGroupedStings.Add(aString);
                    currentStingCount = currentStingCount + aString.Count();
                }
            }
            else if (currentStingCount + aString.Count() > maxMessageCount)
            {
                string tempSting = string.Join("", unGroupedStings);
                string tempSting2 = tempSting.Remove(0, tempSting.IndexOf("##") + 2);

                GroupedMessages.Add(tempSting2);
                unGroupedStings.Clear();
                unGroupedStings.Add(splitterSubject + "##" + aString);
                currentStingCount = aString.Count();
            }

            if (splitterBody == string.Join("", GroupedMessages))
            {
                //this is just a check to make sure messages have been separated correctly and matches the original
            }
        }
        return GroupedMessages;
    }

这是使用该方法的语法。

if (subject.Count() + body.Count() > 159)
        {
            MultiMessage = MessageSplitter(subject, body);

            int messageCount = 1;

            foreach (string eachMessage in MultiMessage)
            {
                //Send your message

                //I am using messageCount++ to label each message 
                //Here is the sample code
                //$" ({messageCount}/{MultiMessage.Count()})\r\n" + eachMessage

                messageCount++;
            }

            Debug.WriteLine(string.Join("", MultiMessage));
        }

输出

(Need Bid) (1/2)
Salesman: Firstname Lastname
Customer: CustFirstname CustLastname
Customer Address: 1111 TheSteetAdd St, Lockport, New York 12124

(Need Bid) (2/2)
Customer Number: 111-222-3333
Apt Date/Time: 1/17/2021 5:00 PM

希望有一天这对某人有所帮助!