Einführung

Das programmatische Versenden von E-Mails mit Gmail erfordert in der Regel eine Authentifizierung. Während App-Passwörter häufig verwendet werden, sind diese aufgrund von Sicherheitsrichtlinien oder organisatorischen Vorgaben möglicherweise keine Option. OAuth2 bietet eine moderne, sichere Alternative zur Authentifizierung von SMTP-Clients, ohne dass Zugangsdaten offengelegt werden müssen.

Dieser Beitrag zeigt, wie man eine E-Mail über den SMTP-Server von Gmail mit OAuth2 in C# sendet.


Warum OAuth2 für Gmail SMTP verwenden?

  • Sicherer als passwortbasierte Authentifizierung
  • Entspricht den aktuellen Sicherheitsanforderungen von Google
  • Vermeidet die Nutzung von App-Passwörtern, die deaktiviert werden können

Moderner Ansatz für Authentifizierung und E-Mail-Versand

Statt Token manuell zu verwalten, verwenden Sie die .NET-Clientbibliotheken von Google zusammen mit MailKit, einem leistungsfähigen SMTP-Client, der OAuth2 unterstützt.

Voraussetzungen

  • Google Cloud-Projekt mit aktivierter Gmail API
  • Heruntergeladene OAuth 2.0 Zugangsdaten im JSON-Format
  • Installierte NuGet-Pakete:
    • Google.Apis.Auth
    • MailKit

Schritt 1: Autorisieren und Zugriffstoken erhalten

Verwenden Sie Google’s GoogleWebAuthorizationBroker, um sich zu authentifizieren und OAuth2-Token mit dem Scope https://mail.google.com/ abzurufen.

Schritt 2: E-Mail mit MailKit erstellen und senden

Nutzen Sie MailKits SmtpClient und authentifizieren Sie sich über SaslMechanismOAuth2 mit dem Zugriffstoken.

Vollständiges Beispiel in C#

using Google.Apis.Auth.OAuth2;
using Google.Apis.Util.Store;
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var to = "recipient@gmail.com";
        var from = "youraddress@gmail.com";
        var scopes = new[] { "https://mail.google.com/" };

        // Pfad zur OAuth2-Zugangsdaten-JSON-Datei
        var credentialPath = @"C:\path\to\credentials.json";

        var credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
            GoogleClientSecrets.FromFile(credentialPath).Secrets,
            scopes,
            "user",
            CancellationToken.None,
            new FileDataStore("TokenStore", true));

        var message = CreateEmailMessage(from, to);

        using var client = new SmtpClient();

        await client.ConnectAsync("smtp.gmail.com", 465, SecureSocketOptions.SslOnConnect);

        var oauth2 = new SaslMechanismOAuth2(from, credential.Token.AccessToken);
        await client.AuthenticateAsync(oauth2);

        await client.SendAsync(message);
        await client.DisconnectAsync(true);

        Console.WriteLine("E-Mail erfolgreich gesendet.");
    }

    static MimeMessage CreateEmailMessage(string from, string to)
    {
        var message = new MimeMessage();
        message.From.Add(new MailboxAddress("Absender", from));
        message.To.Add(new MailboxAddress("Empfänger", to));
        message.Subject = "Test-E-Mail per Gmail SMTP und OAuth2";
        message.Body = new TextPart("plain")
        {
            Text = "Dies ist eine Testnachricht, die sicher mit OAuth2 gesendet wurde."
        };
        return message;
    }
}

Zusammenfassung

  • Nutzen Sie Googles GoogleWebAuthorizationBroker für die OAuth2-Authentifizierung.
  • Verwenden Sie MailKits SmtpClient mit SaslMechanismOAuth2, um E-Mails über Gmail zu senden.
  • Vermeiden Sie manuelles Token-Parsing oder die Verwendung von App-Passwörtern.
  • Dieser Ansatz gewährleistet eine sichere, moderne Authentifizierung, die mit Gmail kompatibel ist.

Für fortgeschrittene Szenarien sollten Sie das Handling von Token-Aktualisierungen, Fehlerbehandlung und benutzerbasierte Einwilligungsabläufe in Betracht ziehen.