2017-09-06 2 views
0

Ich habe einen On-Demand-Azure-Webjob, der als Konsolenanwendung ausgeführt wird.Sendgrid sendet keine E-Mails in einem On-Demand-Azure-Webjob, der als Konsolenanwendung ausgeführt wird.

Ziel ist E-Mails an Kunden senden.

Problem ist es keine E-Mails senden.

Mein Code ist schwer angehoben von msdn Abschnitt Wie: Senden Sie eine E-Mail. Folgendes ist mein Code-Snippet.

class Program 
{ 
    static void Main(string[] args) 
    { 
Execute(Environment.GetEnvironmentVariable("WEBJOBS_COMMAND_ARGUMENTS")).Wait(); 
    } 

    static async Task Execute(string email) 
    { 
     DeserializedCustomer customer = JsonConvert.DeserializeObject<DeserializedCustomer>(email); 
     var apiKey = Environment.GetEnvironmentVariable("SENDGRID_APIKEY"); 
     var client = new SendGridClient(apiKey); 
     SendGridMessage msg = new SendGridMessage() 
     { 
      From = new EmailAddress(customer.Email, "From Email"), 
      Subject = $"Inquiry by - {customer.FirstName} {customer.LastName}", 
      PlainTextContent = customer.Comments + Environment.NewLine + $"Phone : {customer.Phone}", 
     }; 
     msg.AddTo(new EmailAddress(ToMail, ToMailName)); 

     if (!String.IsNullOrWhiteSpace(customer.Attachment)) 
     { 
      List<Attachment> attachments = new List<Attachment>() 
      { 
       new Attachment() 
       { 
        Content = customer.Attachment, 
        Type = customer.AttachmentType, 
        Filename = customer.AttachmentFileName, 
        Disposition = "inline", 
        ContentId = customer.AttachmentFileName + Guid.NewGuid() 
       } 
      }; 
      msg.Attachments = attachments; 
     } 
     await client.SendEmailAsync(msg); 

    } 
} 

suche ich ein SO post wo gibt Zeit zu senden E-Mail in einer Konsolenanwendung

Hinzufügen Zeit nicht helfen entweder sendgrid gefunden.

Wenn es etwas eigenartig ist, E-Mails von azurblauen Webjobs zu versenden, die als Konsolenanwendungen laufen, dann weiß ich es nicht.

Bei der weiteren Suche fand ich this SO Post, wo sie erfolgreich getestet E-Mails in der Konsolenanwendung, so dass ich dachte, es könnte helfen, aber es hat keine E-Mails gesendet.

Alle oben genannten Beispiele sind mehr als ein Jahr alt und keiner von ihnen funktioniert derzeit.

Ich habe versucht, eine frühere Version von SendGrid Bibliothek, aber ich bin auf

var transportWeb = new Web(credentials); 
transportWeb.DeliverAsync(myMessage); 

als SendGrid stecken Bibliothek aktualisiert wurde.

auf GitHub fand ich this dem eindeutig hervorgeht, dass nur Konsolenanwendungen mit transportWeb.DeliverAsync(myMessage).Wait arbeiten

deshalb versuche ich mit transportWeb.

Gibt es eine Verschmelzung von azurblauen mit On-Demand-Web-Job läuft als Konsole-Anwendung?

Kann jemand helfen?

aktualisieren

Nachdem ich Randy Minder Hilfe den Code der folgenden

aktualisiert
 static async Task Execute(string email) 
    { 
     try 
     { 

      DeserializedCustomer customer = new DeserializedCustomer(); 
      customer = JsonConvert.DeserializeObject<DeserializedCustomer>(email); 
      Console.WriteLine(customer); 
      SendGridMessage msg = new SendGridMessage(); 
      msg.From = new MailAddress(customer.EmailAddress, "From Email"); 
      msg.Subject = $"Inquiry by - {customer.FirstName} {customer.LastName}"; 
      msg.Text = customer.Comments + Environment.NewLine + $"Phone : {customer.Phone}"; 

      msg.AddTo(ToMail); 

      // Create a network credentials object 
      var credentials = new NetworkCredential(Environment.GetEnvironmentVariable("UserName"), Environment.GetEnvironmentVariable("Password")); 

      var transportWeb = new SendGrid.Web(credentials); 
      transportWeb.DeliverAsync(msg).Wait(); 
     } 
     catch (Exception ex) 
     { 
      DateTime now = DateTime.Now; 
      Trace.TraceError($"{now.ToLongDateString()} {now.ToLongTimeString()}" + Environment.NewLine + new ExceptionSerializer(ex)); 
     } 
    } 

Ich verwende SendGrid 6.1.0

<package id="Sendgrid" version="6.1.0" targetFramework="net47" /> 

Ich habe nicht jede Ausnahme und mein Webjob läuft zum Erfolg


[09/06/2017 17:48:42 > 1a8d37: SYS INFO] Run script 'SaSRizqTechCloudWhizEngineering.Backgr.exe' with script host - 'WindowsScriptHost' 
[09/06/2017 17:48:42 > 1a8d37: SYS INFO] Status changed to Running 
[09/06/2017 17:48:42 > 1a8d37: INFO] SerializedEmail - {"FirstName":"adsfkh","LastName":"adfkjladf","EmailAddress":"[email protected]","Phone":"","Comments":"lkjadf ","AttachmentType":"","AttachmentFileName":"","Attachment":null} 
[09/06/2017 17:48:42 > 1a8d37: INFO] FirstName adsfkh - LastName adfkjladf - EmailAddress [email protected] - Phone - Comments lkjadf - Attachment - AttachmentType - - AttachmentFileName 
[09/06/2017 17:48:44 > 1a8d37: SYS INFO] Status changed to Success 

aber ich keine E-Mail

Antwort

0

erhalten Sie, wenn Sie versuchen, eine E-Mail über SendGrid in einer Konsolenanwendung zu senden, haben Sie es ein bisschen anders zu machen.Hier ist eine Methode, die ich habe, die in einer Konsole App funktioniert:

/// <summary> 
/// Send the email async in a console app. 
/// </summary> 
public async Task SendAsync() 
{ 
    // Create a network credentials object 
    var credentials = new NetworkCredential(azureUserName, azurePassword); 

    // Create an Web transport for sending the email 
    var transportWeb = new Web(credentials); 

    transportWeb.DeliverAsync(this._email).Wait(); 
} 

Dies ist, was ich benutze in einer nicht-Konsole App:

/// <summary> 
    /// Send the email async in backend or MVC code. 
    /// </summary> 
    public async Task SendAsync() 
    { 
     // Create a network credentials object 
     var credentials = new NetworkCredential(azureUserName, azurePassword); 

    // Create an Web transport for sending the email 
    var transportWeb = new Web(credentials); 

    await transportWeb.DeliverAsync(this._email).ConfigureAwait(false); 
} 

Das eigentliche E-Mail-Objekt in this._email enthalten ist.

+0

, welche Version von SendGrid Nuget Paket verwenden Sie? Die neueste Version enthält keine Definition für var transportWeb = new Web (credentials); –

+0

Sind Sie sicher, dass var credentials = new NetworkCredential (azureUserName, azurePassword); im azurblauen Webjob? Die neueste Dokumentation schlägt vor, var apiKey = Environment.GetEnvironmentVariable ("SENDGRID_APIKEY") zu verwenden; –

+0

@ HamzaAhmedZia - Ganz sicher. Ich habe dies im Produktionscode ausgeführt. Die Version von SendGrid, die ich verwende, ist 4.0.30319 (Runtime) wie in den Eigenschaften gezeigt. Es gibt auch ein Feld Version, das 6.1.0.0 enthält. –

0

Entsprechend Ihrer Beschreibung habe ich auch eine Testdemo auf meiner Seite erstellt, es funktioniert gut. Ich habe das sendgird SDK 9.90 verwendet.

Die Details Codes ist wie wie folgt:

class Program 
{ 
    static void Main(string[] args) 
    { 

     string serializedEmail = args[0]; 

     Console.WriteLine($"SerializedEmail - {serializedEmail}"); 

     Customer customer = JsonConvert.DeserializeObject<Customer>(args[0]); 

     //Customer customer = new Customer() { Name = "aaaa" }; 
     Execute(customer).Wait(); 
     Console.WriteLine(customer.Name); 
     Console.ReadLine(); 

    } 


    static async Task Execute(Customer customer) 
    { 

     var client = new SendGridClient("apikey"); 
     var from = new EmailAddress("[email protected]", "Example User"); 
     var subject = "Sending with SendGrid is Fun"; 
     var to = new EmailAddress("[email protected]", "Example User"); 
     var plainTextContent = $"Name : {customer.Name}"; 
     var htmlContent = "<strong>and easy to do anywhere, even with C#</strong>"; 
     var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent); 
     var response = await client.SendEmailAsync(msg); 
    } 


} 

public class Customer 
{ 
    public string Name { get; set; } 
} 

Allerdings erhalte ich keine E-Mail

Ich schlage vor, Sie zunächst diese url zugreifen konnte die sendgird überprüfen hat die bereits senden E-Mail an die richtige E-Mail-Adresse.

Das Ergebnis ist wie folgt aus:

enter image description here

+0

Ich 1. versuchte Ihren Code 2. erstellt einen neuen sendgrid API-Schlüssel mit vollen Zugriffsberechtigungen, aber ich erhalte keine E-Mail. Ich vermute, dass Ihre Konsolen-E-Mails wegen der console.readline() am Ende Ihrer Hauptfunktion durchgehen. Ich bestätige, dass ich keine E-Mails über azure on demand web job bekomme. Danke für Ihre Hilfe. Irgendwelche anderen Gedanken? –

+0

Haben Sie die URL überprüft, die ich angegeben habe, um das E-Mail-Protokoll zum Senden zu sehen? –

+0

Ja, ich habe https://app.sendgrid.com/email_activity? und leider gibt es keine Mails auf diesem Bildschirm :-( –

Verwandte Themen