Python/Django über Google API emails versenden

Gast #5700626
Hallo,

wie es bereits im Titel beschrieben steht, suche ein eine Lösung über 
die google API über das Django Framework Emails zu versenden.

Aktuelle nutze ich Django 2.1 mit Python 3.6

In meinem Django Projekt nutze ich bereits den Login via Google mittels 
den Paket social-auth-app-django

in meinen settings.py
1
INSTALLED_APPS = [
2
    ...
3
    'social_django',
4
    ...
5
]
6

7
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = 'xxx.apps.googleusercontent.com'
8
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = 'xxx'

Wie kann man Django nun beibringen, dass er auch über diese API emails 
versenden darf, also user to user, keine System Emails. Als Absender 
soll jeder seine eigene Emailadrese verwenden und nicht die des Systems.

Ich suche seit einigen Tagen dazu weitere Informationen im Internet, 
aber bisher habe ich nichts brauchbares gefunden. daher erhoffe ich mir 
hier einen Hilfreichen rat.
Gast #5701216
Nochmal ein update, da ich das vorhin vergessen habe.

in der *views.py* generiere ich den Haupteil der Email.
Das sieht dann in etwa so aus:
1
current_user = request.user
2
user_signature = current_user.profile.signature
3
user_bcc = current_user.profile.BCC_email
4
access = current_user.profile.extra_data
5
    if request.method == 'POST':
6
        form_suggestion = Email_form_Suggestions(request.POST)
7
        current_user = request.user
8
        user_signature = current_user.profile.signature
9
        user_bcc = current_user.profile.BCC_email
10
        if form_suggestion.is_valid():
11

12
            email = form_suggestion.cleaned_data['email']
13
            subject = form_suggestion.cleaned_data['subject']
14
            message = form_suggestion.cleaned_data['message']
15
            signature = form_suggestion.cleaned_data['signature']
16
            msg = message + '<br><br>' + signature
17

18
            #email vars
19
            to = email
20
            sender = "me"
21
            subject = subject
22
            message_text_html = msg
23
            user_id = request.user
24
            bcc_email = user_bcc
25

26
            SendMessage(sender, to, bcc_email, subject, message_text_html, access)
27
            messages.success(request, 'Email successfully sent')
28
            return redirect(reverse('detail', kwargs={"album_id": album_id}))

In einer zweiten Datei *gmail_sender.py* werden alle diese Daten 
übernommen und verarbeitet.
1
# based on https://developers.google.com/gmail/api/quickstart/python
2
import httplib2
3
import os
4
import oauth2client
5
from oauth2client import client, tools, file
6
import base64
7
from email.mime.multipart import MIMEMultipart
8
from email.mime.text import MIMEText
9
from apiclient import errors, discovery
10

11

12
''' scopes
13
https://mail.google.com/
14
https://www.googleapis.com/auth/gmail.modify
15
https://www.googleapis.com/auth/gmail.compose
16
https://www.googleapis.com/auth/gmail.send
17
'''
18

19
CLIENT_SECRET_FILE = 'API_credentials.json'
20

21

22
def get_credentials(access):
23
    #print(access)
24
    home_dir = os.path.dirname(os.path.realpath(__file__))
25
    credential_dir = os.path.join(home_dir, '.credentials')
26

27
    credential_path = os.path.join(credential_dir, 'user_specific.json')
28
    store = oauth2client.file.Storage(credential_path)
29
    credentials = store.get()
30

31
    return credentials
32

33

34
def SendMessage(sender, to, bcc_email, subject, msgHtml, access):
35
    credentials = get_credentials(access)
36
    http = credentials.authorize(httplib2.Http())
37
    service = discovery.build('gmail', 'v1', http=http)
38
    message1 = CreateMessage(sender, to, bcc_email, subject, msgHtml
39
                             )
40
    SendMessageInternal(service, "me", message1)
41

42

43
def SendMessageInternal(service, user_id, message):
44
    try:
45
        message = (service.users().messages().send(userId=user_id, body=message).execute())
46
        print('Message Id: %s' % message['id'], 'sent')
47
        return message
48
    except errors.HttpError as error:
49
        print('An error occurred: %s' % error)
50

51

52
def CreateMessage(sender, to, bcc_email, subject, msgHtml):
53
    msg = MIMEMultipart('alternative')
54
    msg['Subject'] = subject
55
    msg['From'] = sender
56
    msg['To'] = to
57
    msg['Bcc'] = bcc_email
58
    msg.attach(MIMEText(msgHtml, 'html'))
59
    raw = base64.urlsafe_b64encode(msg.as_bytes())
60
    raw = raw.decode()
61
    body = {'raw': raw}
62
    return body

Hinter der Variable access, versteckt sich die derzeit manuell in der 
Datenbank eingetragene JSON des spezifischen Users.

Soweit so gut, access wird mir in der Konsole angezeigt.
1
def get_credentials(access):
2
    print(access)


Jetzt fehlt mir der nächste Punkt. Wie kann ich die *user_specific.json* 
ersetzten mit meiner variable access?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.