Как отправить несколько запросов по электронной почте нескольким пользователям

У меня есть программа, которая автоматически запускается с Windows через планировщик. Что он делает, так это запускает запрос, а затем отправляет результаты запроса по электронной почте. Это все работает. Что я хотел бы сделать, так это вывести программу на новый уровень. У нас есть 10 локаций. Локационный DM должен получать этот отчет ежедневно (только для своего магазина). Итак, в основном то, что я хотел бы сделать, это повторить код в виде другого адаптера таблицы и отправить эту информацию по электронной почте. Мой код С#:

Imports System.Net.Mail
Imports System.Linq

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


        Try
            Dim SmtpServer As New SmtpClient()
            Dim mail As New MailMessage()
            Me.Paid_Out_TbTableAdapter.Fill(Me.DataSet.Paid_Out_Tb)
            Dim payouts = _
            <html>
                <body>
                    <table border="1">
                        <tr><th>Store #</th><th>Date</th><th>Amount</th><th>User</th><th>Comment</th></tr>
                        <%= From paidOut In Me.DataSet.Paid_Out_Tb.AsEnumerable _
                            Select <tr><td><%= paidOut.Store_Id %></td>
                                       <td><%= Convert.ToDateTime(paidOut.Paid_Out_Datetime).ToString("M/d/yy") %>
                                       </td><td><%= "$" & paidOut.Paid_Out_Amount.ToString("0.00") %></td>
                                       <td><%= paidOut.Update_UserName %></td>
                                       <td><%= paidOut.Paid_Out_Comment %></td></tr> %>
                    </table>
                </body>

            </html>

            If (Me.DataSet.Paid_Out_Tb.Count = 0) Then 'This cheks to see if the dataset is Null.  We do not want to email if the set is Null

                Me.Close()

            Else

                SmtpServer.Credentials = New  _
                Net.NetworkCredential("*****", "****") 'Assign the network credentials
                SmtpServer.Port = 25 'Assign the SMTP Port
                SmtpServer.Host = "10.0.*.*" 'Assign the Server IP
                mail = New MailMessage() 'Starts a mail message
                mail.From = New MailAddress("***@***.com") 'Sets the "FROM" address
                mail.To.Add("****@****.com") 'Sets the "To" address
                'mail.CC.Add("****@****.com") 'set this if you would like to CC
                mail.Subject = "Paid Out Report for 1929"
                mail.IsBodyHtml = True
                mail.Body = payouts.ToString()
                SmtpServer.Send(mail)
                'MsgBox("mail send")
            End If

        Catch ex As Exception

            MsgBox(ex.ToString)


        End Try

Мой запрос:

SELECT        Store_Id, Paid_Out_Amount, Paid_Out_Comment, Paid_Out_Datetime, Update_UserName, Till_Number
FROM            Paid_Out_Tb
WHERE        (Store_Id = 1929) AND (Paid_Out_Datetime >= DATEADD(day, DATEDIFF(day, 0, GETDATE()) - 1, 0)) AND (Paid_Out_Datetime < DATEADD(day, DATEDIFF(day, 0, 
                         GETDATE()), 0)) AND (Paid_Out_Amount > 20) OR
                         (Store_Id = 1929) AND (Paid_Out_Datetime >= DATEADD(day, DATEDIFF(day, 0, GETDATE()) - 1, 0)) AND (Paid_Out_Datetime < DATEADD(day, DATEDIFF(day, 0, 
                         GETDATE()), 0)) AND (Paid_Out_Comment LIKE N'%' + 'Filter' + '%')

Опять же, это все работает. Но мой второй запрос будет точно таким же, за исключением того, что я заменю «112» на store_ID. Затем мне нужно будет отправить этот результат запроса по электронной почте на ДРУГОЙ адрес, чем идентификатор 1929 ... Любые предложения о том, как лучше всего это сделать?


person Shmewnix    schedule 30.07.2012    source источник
comment
Мне это кажется кодом VB.NET. Возможно, вы вставили не то?   -  person Bryan Crosby    schedule 30.07.2012
comment
Нет, это на С#. Я использовал .net для электронной почты...   -  person Shmewnix    schedule 30.07.2012
comment
Похоже, вы пытаетесь просмотреть результаты своего запроса и по электронной почте один раз каждому связанному пользователю. Это правильно? Кроме того, вы уверены, что это С#?   -  person Nick Vaccaro    schedule 30.07.2012
comment
Вы оба правы, извините, я забыл переключиться на VB для этого... Вы правы. @ Норла, более или менее да.   -  person Shmewnix    schedule 30.07.2012
comment
Проверьте этот вопрос: stackoverflow.com/questions/5991877/, в частности, ответ Брайана Вебстера.   -  person Nick Vaccaro    schedule 30.07.2012
comment
Как бы я разбил его на части, если бы я выполнил только один запрос? Проблема в том, что я отправляю информацию в форме XML по электронной почте на основе идентификатора магазина... Если идентификатор магазина не имеет никакой информации (проверка для 0 выше), то он не отправляется по электронной почте... Как бы я заставить его проверить номер магазина, и если у него нет результатов, не отправлять по электронной почте и перейти к следующему идентификатору магазина?   -  person Shmewnix    schedule 31.07.2012
comment
Вам, вероятно, понадобится база данных, которая содержит идентификатор магазина и адрес электронной почты человека, получающего электронное письмо. Затем вы в основном просто используете считыватель, чтобы извлечь все строки с идентификаторами и электронными письмами, и цикл For для динамического прохождения и вставки соответствующего идентификатора в запрос. Если запрос имеет результаты, отправьте электронное письмо соответствующему лицу. Если нет, пропустите его и перейдите к следующей строке Store_ID, Email. Надеюсь, это имеет смысл.   -  person Tony318    schedule 31.07.2012
comment
насколько сложно будет использовать для этого файл config.xml? Я никогда этого не делал...   -  person Shmewnix    schedule 31.07.2012


Ответы (1)


Imports System.Net.Mail
Imports System.Linq

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'DataSet.Paid_Out_Tb' table. You can move, or remove it, as needed.

        Try
            Dim SmtpServer As New SmtpClient()
            Dim mail As New MailMessage()
            Me.Paid_Out_TbTableAdapter.Fill(Me.DataSet.Paid_Out_Tb)
            Me.DataTable1TableAdapter.Fill(Me.DataSet.DataTable1)
            Dim payouts = _
            <html>
                <body>
                    <table border="1">
                        <tr><th>Store #</th><th>Date</th><th>Amount</th><th>User</th><th>Comment</th></tr>
                        <%= From paidOut In Me.DataSet.Paid_Out_Tb.AsEnumerable _
                            Select <tr><td><%= paidOut.Store_Id %></td>
                                       <td><%= Convert.ToDateTime(paidOut.Paid_Out_Datetime).ToString("M/d/yy") %>
                                       </td><td><%= "$" & paidOut.Paid_Out_Amount.ToString("0.00") %></td>
                                       <td><%= paidOut.Update_UserName %></td>
                                       <td><%= paidOut.Paid_Out_Comment %></td></tr> %>
                    </table>
                </body>

            </html>
            Dim Payouts453 = _
            <html>
                <body>
                    <table border="1">
                        <tr><th>Store #</th><th>Date</th><th>Amount</th><th>User</th><th>Comment</th></tr>
                        <%= From paidOut In Me.DataSet.DataTable1.AsEnumerable _
                            Select <tr><td><%= paidOut.Store_Id %></td>
                                       <td><%= Convert.ToDateTime(paidOut.Paid_Out_Datetime).ToString("M/d/yy") %>
                                       </td><td><%= "$" & paidOut.Paid_Out_Amount.ToString("0.00") %></td>
                                       <td><%= paidOut.Update_UserName %></td>
                                       <td><%= paidOut.Paid_Out_Comment %></td></tr> %>
                    </table>
                </body>

            </html>
            If (Me.DataSet.Paid_Out_Tb.Count = 0) Then 'This cheks to see if the dataset is Null.  We do not want to email if the set is Null

                Me.Close()


            Else

                SmtpServer.Credentials = New  _
                Net.NetworkCredential("****", "****") 'Assign the network credentials
                SmtpServer.Port = 25 'Assign the SMTP Port
                SmtpServer.Host = "10.0.*.**" 'Assign the Server IP
                mail = New MailMessage() 'Starts a mail message
                mail.From = New MailAddress("*@**.com") 'Sets the "FROM" address
                mail.To.Add("**@**.com") 'Sets the "To" address
                'mail.CC.Add("**@**.com") 'set this if you would like to CC
                mail.Subject = "Paid Out Report for 1929"
                mail.IsBodyHtml = True
                mail.Body = payouts.ToString() & Payouts453.ToString() 'this is to add another chart  You would use a seperate dataset obviously
                SmtpServer.Send(mail)
                'MsgBox("mail send")
            End If

        Catch ex As Exception

            MsgBox(ex.ToString)


        End Try






        Me.Close() 'Closes the program when it's finished.


    End Sub

Самый простой способ сделать это - добавить еще один адаптер таблицы и выполнить отдельный запрос... Вероятно, это не самый эффективный способ, но для объема передаваемых данных... он работает...

person Shmewnix    schedule 31.07.2012