Tìm kiếm


    Gửi Mail bằng Gmail API với Postman và ASP.NET Core | Phần 2


    Bài viết trước mình đã hướng dẫn các bạn sử dụng Gmail API để gửi mail bằng Postman rồi. Các bạn có thể xem bài viết đó tại Gửi Mail bằng Gmail API với Postman và ASP.NET Core | Phần 1

    Và trong phần 2 này mình sẽ chia sẻ với bạn Source Code để gửi mail sử dụng Gmail API sử dụng ASP.NET Core API

    Thông tin Quan Trọng

    Các bạn cần chuẩn bị các đồ nghề sau:

    • - Gmail Refresh Token, Client ID, Client Secret... (Xem cách TẠI ĐÂY)
    • - .NET Core 6 (Download TẠI ĐÂY)
    • - Visual Studio 2022 hoặc Rider (Xem cách Crack Rider TẠI ĐÂY

    Nuget Cần Thiết

    • Newtonsoft
    • - RestSharp

    Source Code

    Source các bạn Download ở bên dưới nhé mình sẽ nói nhanh qua các phần quan trọng cần lưu ý.

    Trước tiên sau khi lấy được Refresh Token, Client ID Client Secret các bạn chỉnh sửa file appsettings.json thêm các thông tin như sau:

    "GmailAPI": {
      "GmailAPIUrl": "https://www.googleapis.com/gmail/v1",
      "Oauth2": "https://accounts.google.com/o/oauth2",
      "RefreshToken": "YOUR_REFRESH_TOKEN",
      "ClientID": "YOUR_CLIENT_ID",
      "ClientSecret": "YOUR_CLIENT_SECRET",
      "GrandType": "refresh_token",
      "SenderName": "ProG Coder",
      "From": "YOUR_EMAIL"
    },

    Chỉnh sửa lại bằng các thông tin của các bạn nhé.

    Do nội dung email và các thông tin về gửi nhận, đọc mail của Gmail ở dạng Base64 nên mình sẽ viết hàm để Convert các thông tin đó qua Base64

    public static string BuildMessage(string subject, string senderName, string receiverName, string from, string to, string htmlContent)
    {
      // First, base64 encode the HTML content
      var base64HtmlContent = Convert.ToBase64String(Encoding.UTF8.GetBytes(htmlContent));
      var inputBytes = Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(subject)));
      var base64Subject = Convert.ToBase64String(inputBytes)
        .Replace('+', '-')
        .Replace('/', '_')
        .Replace("=", "");
    
      // Then, create the MIME message
      var mimeMessage = string.Join("\n",
        new string[]
                {
          "MIME-Version: 1.0", "Content-type: text/html; charset=utf-8", "Content-Transfer-Encoding: base64",
          $"From: {senderName} <{from}>", $"To: {receiverName} <{to}>",
          $"Subject: =?UTF-8?B?{base64Subject}?=", "", base64HtmlContent
        });
    
      // Finally, base64url encode the entire MIME message
      var base64MimeMessage = Convert.ToBase64String(Encoding.UTF8.GetBytes(mimeMessage));
      var base64UrlMimeMessage = Regex.Replace(base64MimeMessage, @"\+", "-");
      base64UrlMimeMessage = Regex.Replace(base64UrlMimeMessage, @"\/", "_");
      base64UrlMimeMessage = Regex.Replace(base64UrlMimeMessage, @"=+$", "");
    
      return base64UrlMimeMessage;
    }

    Bây giờ mình sẽ viết hàm để lấy acccess_token bằng refresh_token như sau:

    private async Task < string > GetTokenAsync()
    {
      var client = new RestClient(_gmailOption.Value.Oauth2 + "/token");
      var request = new RestRequest() { Method = Method.Post };
    
      request.AddParameter("client_id", _gmailOption.Value.ClientID);
      request.AddParameter("client_secret", _gmailOption.Value.ClientSecret);
      request.AddParameter("refresh_token", _gmailOption.Value.RefreshToken);
      request.AddParameter("grant_type", _gmailOption.Value.GrandType);
    
      var response = await client.ExecuteAsync(request);
    
      var jObject = JObject.Parse(response.Content ?? string.Empty);
    
      return jObject.ContainsKey("access_token") ? (string)jObject["access_token"]! : "";
    }

    Get Mail

    [HttpGet("Get")]
    public async Task < string > Get()
    {
        var accessToken = await GetTokenAsync();
        var client = new RestClient(_gmailOption.Value.GmailAPIUrl + "/users/me/messages");
        var request = new RestRequest() { Method = Method.Get };
    
        request.AddHeader("Authorization", "Bearer " + accessToken);
    
        var response = await client.ExecuteAsync(request);
    
        var json = JObject.Parse(response.Content);
    
        return json.ToString();
    }

    Read Mail

    [HttpGet("Read")]
    public async Task < string > Read(string messageId)
    {
        var accessToken = await GetTokenAsync();
        var client = new RestClient(_gmailOption.Value.GmailAPIUrl + $"/users/me/messages/{messageId}");
        var request = new RestRequest() { Method = Method.Get };
    
        request.AddHeader("Authorization", "Bearer " + accessToken);
    
        var response = await client.ExecuteAsync(request);
    
        var json = JObject.Parse(response.Content);
    
        return json.ToString();
    }

    Send Mail

    [HttpPost("Send")]
    public async Task < string > Send(MessageModel model)
    {
        var accessToken = await GetTokenAsync();
        var client = new RestClient(_gmailOption.Value.GmailAPIUrl + "/users/me/messages/send");
        var request = new RestRequest() { Method = Method.Post };
        var message = GmailMessageHelper.BuildMessage(model.Subject, _gmailOption.Value.SenderName, model.ReceiverName,
            _gmailOption.Value.From, model.SendTo, model.Content);
    
        request.AddHeader("Authorization", "Bearer " + accessToken);
        request.AddJsonBody(new
            {
                raw = message
            });
    
        var response = await client.ExecuteAsync(request);
    
        var json = JObject.Parse(response.Content);
    
        return json.ToString();
    }

    Testing Code

    dasd

    12

    dsa

    dá

    Tất cả đều ngon lành 😁

    Hi vọng code này giúp ích được cho các bạn.

    Chia sẻ giúp mình nếu thấy hay nhé 🤗


    Tiểu sử
    Are you one or zero?


    Bình luận