Softwareentwicklung
›
Thread
Python/Django über Google API emails versenden
M
Mirko
Gast
18.01.2019 10:28
#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.
M
Mirko
Gast
18.01.2019 18:23
#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 ?
↑ Nach oben
← Zurück zu Softwareentwicklung
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.