Функция Azure SendGrid

Привет, я в основном выполняю запрос, который возвращает x количество писем, которые существуют в определенный день, и я хочу отправить письмо на все эти письма, используя api sendgrid. Вот мой код - я сталкиваюсь с множеством ошибок, перечисленных ниже. кто-нибудь пролил свет?

[код]

**#r "System.Data"
#r "SendGrid"

using System;
using System.Data;
using SendGrid.Helpers.Mail;

using System.Data.SqlClient;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;
using SendGrid;

        private SqlConnection conn = null;
        private SqlDataAdapter da = null;
        private SqlCommandBuilder cb = null;
        private DataSet ds = null;
        private String location = null;

public void Run(TimerInfo myTimer, TraceWriter log)
    {
        log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
        string connStr = "Data Source=sdc-hwsb.database.windows.net;Initial Catalog=SDC-HotelWSBooking;Integrated Security=False;User ID=sdchwsb;Password=Trivago17!;Connect Timeout=15;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
        SqlConnection conn = new SqlConnection(connStr);
        conn.Open();
        string query = "SELECT email FROM dbo.test_bookings2 WHERE startDate = @startDate";
        SqlCommand cmd = new SqlCommand(query, conn);
        cmd.Parameters.AddWithValue("@startDate", DateTime.Today.ToShortDateString());
        int k = 0;
        int f = Convert.ToInt32(cmd.ExecuteNonQuery());
        while (f > 0 & k < f)
        {
            conn = new SqlConnection(connStr);
            da = new SqlDataAdapter(query, conn);
            cb = new SqlCommandBuilder(da);
            ds = new DataSet();
            da.Fill(ds);
            String Email = Convert.ToString(ds.Tables[0].Rows[k]);
            Run1(Email,message);
            k++;

        }

    }


    public static void Run1(string email, out Mail message)
{
      message = new Mail
        {        
        Subject = "Azure news"          
    };
var personalization = new Personalization();
// change to email of recipient
personalization.AddTo(new Email(email));   

Content content = new Content
{
    Type = "text/plain",
    Value = "DD"
};
message.AddContent(content);
message.AddPersonalization(personalization);

}

**

Я получаю ошибки, связанные с объектом MessageGrid, который использует sendgrid, например:

    2017-09-25T18:50:37.754 Function started (Id=067b32b9-7bc3-47ca-9f32-b8b92c3b57e9)
2017-09-25T18:50:37.770 Function compilation error
2017-09-25T18:50:37.770 run.csx(38,28): error CS0103: The name 'message' does not exist in the current context
2017-09-25T18:50:37.807 Exception while executing function: Functions.TimerTriggerCSharp1. Microsoft.Azure.WebJobs.Script: Script compilation failed.
2017-09-25T18:50:37.948 Function completed (Failure, Id=067b32b9-7bc3-47ca-9f32-b8b92c3b57e9, Duration=196ms)

2 ответа

Как Майк С упомянул об отправке нескольких электронных писем с помощью ICollectorЯ проверил официальный документ о выходной привязке SendGrid и не нашел никакого образца, затем я следовал примеру кода из выходного примера очереди в C#, чтобы проверить эту функцию следующим образом:

run.csx

#r "SendGrid"

using System;
using SendGrid.Helpers.Mail;

public static void Run(TimerInfo myTimer, TraceWriter log, ICollector<Mail> mails)
{
    log.Info($"C# Timer trigger function executed at: {DateTime.Now}");

    for(int i=0;i<3;i++)
    {
        Mail message = new Mail()
        {
            Subject = $"Hello world from the SendGrid C# TimerTrigger!"
        };

        var personalization = new Personalization();
        personalization.AddTo(new Email("the-email-address-of-recipient"));  

        Content content = new Content
        {
            Type = "text/plain",
            Value = $"Hello world!{i}"
        };

        message.AddContent(content);  
        message.AddPersonalization(personalization); 
        mails.Add(message);
    }
}

function.json

{
  "bindings": [
    {
      "name": "myTimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "0 */5 * * * *"
    },
    {
      "type": "sendGrid",
      "name": "mails",
      "apiKey": "sendgrid-apikey",
      "direction": "out",
      "from":"<the-email-address-of-sender>"
    }
  ],
  "disabled": false
}

Результат:

Кроме того, для создания проекта библиотеки классов функций через VS2017, вы можете обратиться к этому руководству по выводу SendGrid.

Некоторые из этих ошибок - ошибки компиляции - исправьте их в первую очередь. Например, вам не хватает ")" в строке 28.

Вы также можете создавать функции в Visual Studio, что даст вам возможности настоящей IDE с C# intellisense и проверкой ошибок. Это будет ловить ошибки выше. Это полезно, как только ваши функции нетривиальны. Проверьте детали здесь: https://blogs.msdn.microsoft.com/appserviceteam/2017/08/14/azure-functions-tools-released-for-visual-studio-2017-update-3/

Привязка SendGrid должна быть в вашей функции Run().

public void Run(TimerInfo myTimer, TraceWriter log, out Mail message)

И тогда Run1 является просто внутренним помощником для генерации сообщения.

Если вам нужно отправить несколько сообщений, используйте ICollector / IAsyncCollector. Это имеет метод "добавить".

Другие вопросы по тегам