如何用新行分隔短信?
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
希望有一天这对某人有所帮助!
我注意到如果我通过电子邮件发送短信,它只允许 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
希望有一天这对某人有所帮助!