Функция 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. Это имеет метод "добавить".