【问题标题】:How to separate text messages by new lines?如何用换行符分隔短信?
【发布时间】:2022-03-19 21:18:10
【问题描述】:

我注意到,如果我通过电子邮件发送短信,它将只允许 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());
            }

            
        }

【问题讨论】:

  • 电子邮件文本中 159 个字符的限制将是一个严重的限制。我无法想象世界上有任何 smtp 服务器有这种限制。
  • 想象在任何电子邮件帐户中......新电子邮件中的每个文本段落,这会很有趣。
  • SMTP 协议指定允许至少 64k 八位字节(字节)。你可以阅读它here
  • @iPhoenix_ 不要误会我的意思,我想帮助你回答我的问题,但同时我可以看到它没有带来价值。我对您的另一个问题,在您输入的问题中,我没有看到 ## OR ?
  • @maytham-ɯɐɥʇʎɐɯ 感谢您的支持。我将它从 159 更改为 140 只是因为我必须考虑 [subject] + [currentMessageCounter](在我的示例中它是“(Need Bid)(1/2)”)。所以我只是给了自己一个安全的缓冲区(是的,140 不是确切的数字),我知道特殊字符比普通字符串字符要多于 1。我使用## 作为占位符,直到我对字符串进行分组。然后最后我在## bc SMTP 将主题与正文分开发送之前删除任何内容。 "(?

标签: c# arrays email smtp


【解决方案1】:

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

它是如何工作的,我们需要拆分行,因为您需要消息 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

现在您可以创建一个循环来分别发送每条消息,这部分留给您。

注意:我很确定代码可以改进和优化,但这是一个概念性的答案,展示了我将如何做到这一点,欢迎您将其推向更高的水平。

【讨论】:

  • 就像你说的这是概念性的答案,我正在寻找一个完整的解决方案。这个答案有很多事情没有考虑到。我现在正在研究一个完整的解决方案。
【解决方案2】:

在花时间考虑所有场景和边缘情况后,我的解决方案是。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多