Проблема отправки почты многим пользователям в C # - PullRequest
1 голос
/ 05 апреля 2019

Привет

Я пытаюсь разработать приложение wpf для отправки массовых писем с помощью приложения Microsoft Outlook. Я использую datagridview, из которого будут извлечены to, cc и attachment. Кроме того, для каждого письма будет несколько to (s) и cc (s). Если поле to и / или cc содержит один почтовый адрес, это работает. Но если добавить несколько к или cc, он получит следующую ошибку.

System.Runtime.InteropServices.COMException: «Outlook не распознает одно или несколько имен. «

Я решил, что проблема с разделением почты, и приложил некоторые усилия для ее устранения

вот мои данные

Вот код для отправки почты.

   private void BtnSendMail_Click(object sender, RoutedEventArgs e)
    {

        foreach (DataRowView rows in dgdData.ItemsSource)
        {

            try
            {
                Outlook.Application oApp = new Outlook.Application();
                Outlook.MailItem oMsg = (Outlook.MailItem)oApp.CreateItem(Outlook.OlItemType.olMailItem);
                Outlook.Recipients oRecips = oMsg.Recipients;

                List<string> sTORecipsList = new List<string>();
                List<string> sCCRecipsList = new List<string>();


                var to = rows.Row.ItemArray[1].ToString();            
                var cc = rows.Row.ItemArray[2].ToString();
                var attachment = rows.Row.ItemArray[3].ToString();
                //var status = rows.Row.ItemArray[0] ="Sending";

                if (to.Contains(",") || to.Contains(";") || to.Contains(" "))
                {
                    string[] tos = Regex.Split(to, ",; ");
                    // string[] lines = Regex.Split(value, "\r\n");
                    for (int i = 0; i < tos.Length; i++)
                    {
                        //mail.To.Add(new MailAddress(tos[i]));

                        sTORecipsList.Add(tos[i]);

                    }
                }
                else
                {
                    sTORecipsList.Add(to);

                }

                if (cc.Contains(",") || cc.Contains(";") || cc.Contains(" "))
                {
                    string[] ccs = Regex.Split(cc, ",; ");
                    // string[] lines = Regex.Split(value, "\r\n");
                    for (int i = 0; i < ccs.Length; i++)
                    {
                        //mail.To.Add(new MailAddress(tos[i]));

                        sCCRecipsList.Add(ccs[i]);

                    }
                }
                else
                {
                    sCCRecipsList.Add(cc);

                }



                oMsg.Body = "Sample Text";///rtbBody.Text.ToString();


                string sDisplayName = "MyAttachment";
                int iPosition = oMsg.Body.Length + 1;
                int iAttachType = (int)Outlook.OlAttachmentType.olByValue;
                Outlook.Attachment oAttach = oMsg.Attachments.Add(attachment, iAttachType, iPosition, sDisplayName);

                oMsg.Subject = txtSubject.Text.ToString();

                foreach (string t in sTORecipsList)
                {
                    Outlook.Recipient recipTo = oMsg.Recipients.Add(t);
                    recipTo.Type = (int)Outlook.OlMailRecipientType.olTo;
                }

                foreach (string c in sCCRecipsList)
                {
                    Outlook.Recipient recipCc = oMsg.Recipients.Add(c);
                    recipCc.Type = (int)Outlook.OlMailRecipientType.olCC;
                }


                oMsg.Recipients.ResolveAll();

                Thread.Sleep(2000);

                oMsg.Send();
                rows.Row.ItemArray[0] = "Sent";

                sTORecipsList = null;
                sCCRecipsList = null;
                //recipTo = null;
                oRecips = null;
                oAttach = null;
                oMsg = null;
                oApp = null;


                Thread.Sleep(2000);



            }

            catch (Exception)
            {
                throw;
            }



        }

        MessageBox.Show("All message sent!!");
    }

В ожидании помощи экспертов. Заранее спасибо.

С уважением, Subrata

1 Ответ

0 голосов
/ 05 апреля 2019

Второй аргумент Regex.Split должен быть шаблоном регулярных выражений. Таким образом, чтобы сопоставить , или ; в качестве разделителя, вы должны использовать шаблон, подобный \s*[,;]\s* (\s* допускает необязательные пробелы вокруг разделителей):

string[] tos = Regex.Split(to, @"\s*[,;]\s*");

Обратите внимание, что для сохранения escape-символов используется символ @ в строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...