2016-08-20 22 views
5

Tôi đang sử dụng mới nhất SendGrid NET gói (8.0.3) để gửi e-mail từ ứng dụng web ASP.NET Lõi của tôi:SendGrid không làm việc kể từ Azure App Dịch vụ

public Task SendEmailAsync(string email, string subject, string message) 
{ 
    return Send(email, subject, message); 

} 

async Task Send(string email, string subject, string message) 
{ 
    dynamic sg = new SendGridAPIClient(_apiKey); 

    var from = new Email("[email protected]", "My Name"); 
    var to = new Email(email); 
    var content = new Content("text/html", message); 
    var mail = new Mail(from, subject, to, content); 

    await sg.client.mail.send.post(requestBody: mail.Get()); 
} 

Nó hoạt động tại địa phương, nhưng chạy trên một bản sao dịch vụ ứng dụng Azure thư không đi qua.

Mã chạy tốt mà không có bất kỳ ngoại lệ nào nên tôi có ít việc phải làm việc, nhưng tôi nghĩ đó có thể là một số vấn đề về tường lửa.

Có ai gặp phải sự cố tương tự không? Làm thế nào để tôi đi về để gỡ lỗi này?

+0

Bạn có bất kỳ hạn chế IP nào đối với tài khoản SendGrid của mình không? https://sendgrid.com/docs/User_Guide/Settings/ip_access_management.html – bwest

+0

Không, tôi không có giới hạn IP. Nhìn vào danh sách truy cập đã cố gắng, có vẻ như nỗ lực cuối cùng của Azure là ba tháng trước, vì vậy rõ ràng nỗ lực gọi SendGrid bị chặn ở đâu đó ở giữa. – severin

Trả lời

0

Tôi cũng sử dụng SendGrid trong Ứng dụng web Azure của mình. Tôi có thể gửi khi gỡ lỗi cục bộ VÀ sau khi triển khai để sản xuất trong Azure. Dưới đây là một vài điều cần kiểm tra:

  1. Khóa API - rõ ràng là khóa API; hãy kiểm tra lại cách bạn đang phổ biến nó. Thông thường, giá trị này được đặt thông qua cấu hình. Giá trị cấu hình được triển khai của bạn có giống với giá trị khi chạy cục bộ không? Có lẽ bạn có một chuyển đổi web.config nhận được theo cách trong quá trình triển khai, hoặc có lẽ bạn nên có một bộ ghi đè (nói trong Cài đặt ứng dụng của ứng dụng nếu bạn đang sử dụng dịch vụ ứng dụng web).
  2. SendGrid Activity & Suppressions - bạn đã kiểm tra nhật ký Hoạt động của SendGrid chưa? Vấn đề có thể nhận được yêu cầu của bạn để SendGrid, hoặc nó có thể được rằng SendGrid là nhận được yêu cầu của bạn nhưng không phải là hoàn thành nó. Kiểm tra Nguồn cấp dữ liệu hoạt động và tìm kiếm email cụ thể bạn đang mong đợi (nhật ký có thể tìm kiếm và được sắp xếp theo thời gian). Nếu bạn thấy nhật ký ở đây tương ứng với email của mình, thì vấn đề ở phía SendGrid. Đôi khi một email bị chặn và có thể xảy ra vì nhiều lý do (chuyển phát bị trả lại, bị gắn cờ là spam hoặc thậm chí máy chủ DNS của bạn không khả dụng để xác minh quyền sở hữu tên miền). Nhật ký sẽ cung cấp bằng chứng nếu đây là trường hợp. Bạn cũng có thể truy cập trực tiếp vào các Suppressions và tìm kiếm địa chỉ email ở đó.
  3. Tính khả dụng của mạng - nếu bạn đang lưu trữ ứng dụng của mình bằng dịch vụ ứng dụng web (có vẻ như trường hợp này), thì bạn có thể giả sử ứng dụng web của mình có thể thực hiện yêu cầu mạng, rõ ràng là bắt buộc phải nhấn API SendGrid hoặc SMTP máy chủ. Tuy nhiên, nếu bạn triển khai ứng dụng của mình cho máy ảo được lưu trữ trong Azure, thì có những thứ có thể cản trở, chẳng hạn như tường lửa. Đăng nhập vào máy ảo và tự xác nhận rằng bạn có thể yêu cầu mạng trực tiếp đến API SendGrid.
0

Tôi đã gặp vấn đề tương tự và vấn đề đối với tôi là tôi đã gửi apiKey SendGrid được lưu trữ dưới dạng biến môi trường trong dự án làm việc cục bộ nhưng không phải khi api được lưu trữ trên Azure.

0

Mặc dù câu hỏi là cũ Tôi đang cung cấp câu trả lời khi tôi gặp một vấn đề tương tự và không thể tìm thấy bất kỳ giải pháp rõ ràng nào. Lý do tại sao nó không hoạt động đối với tôi là vì

  • Tôi đã không tham chiếu Microsoft.Azure.WebJobs.Extensions.SendGrid. Giải pháp cho vấn đề này là thêm từ Nuget
  • Tôi đã không đợi gửi hoàn toàn không đồng bộ. Thêm .Wait() vào hàm async gửi email. Mã đầy đủ tôi sử dụng cho program.cs là dưới đây:

    static void Main() 
    { 
        var config = new JobHostConfiguration(); 
    
        if (config.IsDevelopment) 
        { 
         config.UseDevelopmentSettings(); 
        } 
        config.UseSendGrid(); 
    
    //The function below has to wait in order for the email to be sent 
        SendEmail(*Your SendGrid API key*).Wait(); 
    
    
    } 
    
    public static async Task SendEmail(string key) 
    { 
    
        dynamic sg = new SendGridAPIClient(key); 
    
        Email from = new Email("[email protected]"); 
        string subject = "Test"; 
        Email to = new Email("[email protected]"); 
    
        Content content = new Content("text/html", "CONTENT HERE"); 
        Mail mail = new Mail(from, subject, to, content); 
    
    
    
        dynamic s = await sg.client.mail.send.post(requestBody: mail.Get()); 
    
    } 
    

Vì vậy, tôi sẽ đề nghị bạn thêm.Chờ() để gọi hàm của bạn:

public Task SendEmailAsync(string email, string subject, string message) 
{ 
    //Added .Wait() 
    return Send(email, subject, message).Wait(); 
} 
Các vấn đề liên quan