Forum: PC-Programmierung Python/Django über Google API emails versenden


von Mirko (Gast)


Lesenswert?

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.

von Mirko (Gast)


Lesenswert?

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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.