被 "在 Python 使用 Gmail API 發信 " 這個動作困擾了2天
結論:有三個步驟
1. 參考QuickStart 頁面 https://developers.google.com/gmail/api/quickstart/python ,先按下 "ENABLE GMAIL API" 以申請 project 的證書 (credentials) 的 json
2. 使用步驟 1 的 credentials ,利用上述 google QuickStart 頁面的程式得到某個帳號的使用權的 token.json
這裡要注意的是 SCOPES = 'https://www.googleapis.com/auth/gmail.readonly' 要換成 'https://mail.google.com/' ,因為權限不一樣,不然信會寄不出去。 請參考 https://stackoverflow.com/questions/32143126/how-do-i-get-around-httperror-403-insufficient-permission-gmail-api-python
3. 使用上述 token.json 寄信,寄信程式可簡化如下,當然要修改 xxx@gmail.com 的 xxx 與步驟 2 申請時的一樣
import httplib2
from apiclient import discovery, errors
import oauth2client
from oauth2client import tools
import base64
from email.mime.text import MIMEText
try:
import argparse
flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
flags = None
def SendMessage(service, user_id, message): # Send an email message.
try:
message = (service.users().messages().send(userId=user_id, body=message)
.execute())
print ('Message Id: %s' % message['id'])
return message
except errors.HttpError as error:
print ('An error occurred: %s' % error)
def create_message(sender, to, subject, message_text): # Create a message for an email.
message = MIMEText(message_text)
message['to'] = to
message['from'] = sender
message['subject'] = subject
raw = base64.urlsafe_b64encode(bytes(str(message), "utf-8"))
return {'raw': raw.decode()}
def main( sender, recepient, subject, text_body ):
store = oauth2client.file.Storage('token.json')
credentials = store.get()
http = credentials.authorize(httplib2.Http())
service = discovery.build('gmail', 'v1', http=http)
testMessage = create_message( sender, recepient, subject, text_body )
SendMessage( service, sender, testMessage )
if __name__ == '__main__':
main( 'xxx@gmail.com', 'xxx@gmail.com', 'Test mail subject', 'Test mail body' )