使用 gmail api 发送电子邮件

Posted

技术标签:

【中文标题】使用 gmail api 发送电子邮件【英文标题】:Sending an email using the gmail api 【发布时间】:2018-01-26 05:05:10 【问题描述】:

我正在编写一个简单的脚本来使用 google api 发送电子邮件: 我的代码如下:

import httplib2
import os
import oauth2client
from oauth2client import client, tools
import base64
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from apiclient import errors, discovery
import mimetypes
from email.mime.image import MIMEImage
from email.mime.audio import MIMEAudio
from email.mime.base import MIMEBase

SCOPES = 'https://www.googleapis.com/auth/gmail.send'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Gmail API Python Send Email'

def get_credentials():
    home_dir = os.path.expanduser('~')
    credential_dir = os.path.join(home_dir, '.credentials')
    if not os.path.exists(credential_dir):
        os.makedirs(credential_dir)
    credential_path = os.path.join(credential_dir,
                                   'gmail-python-email-send.json')
    store = oauth2client.file.Storage(credential_path)
    credentials = store.get()
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
        flow.user_agent = APPLICATION_NAME
        credentials = tools.run_flow(flow, store)
        print ('Storing credentials to ' + credential_path)
    return credentials

def SendMessage(sender, to, subject, msghtml, msgPlain, attachmentFile=None):
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('gmail', 'v1', http=http)
    if attachmentFile:
        message1 = createMessageWithAttachment(sender, to, subject, msgHtml, msgPlain, attachmentFile)
    else: 
        message1 = CreateMessageHtml(sender, to, subject, msgHtml, msgPlain)
    result = SendMessageInternal(service, "me", message1)
    return result

def SendMessageInternal(service, user_id, 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)
        return "Error"
    return "OK"

def CreateMessageHtml(sender, to, subject, msgHtml, msgPlain):
    msg = MIMEMultipart('alternative')
    msg['Subject'] = subject
    msg['From'] = sender
    msg['To'] = to
    msg.attach(MIMEText(msgPlain, 'plain'))
    msg.attach(MIMEText(msgHtml, 'html'))
    return 'raw': base64.urlsafe_b64encode(msg.as_string())



def main():
    to = "user@gmail.com"
    sender = "user@gmail.com"
    subject = "testing"
    msgHtml = "Hi<br/>Html Email"
    msgPlain = "Hi\nPlain Email"
    SendMessage(sender, to, subject, msgHtml, msgPlain)

if __name__ == '__main__':
    main()

但是,当我运行此脚本时,我收到以下错误:

我去确保文件存在,并导航到路径。该目录包含以下文件:

很明显,clientsecrets.py 文件确实存在。我不确定如何解决此错误,因为文件显然在那里并且终端确实正确映射了文件。任何建议,将不胜感激。谢谢!

【问题讨论】:

在您上图的错误信息中,可以看到No such file or directory: 'client_secret.json'。你有吗?如果没有,可以查看如何找回client_secret.json 第一步:开启https://developers.google.com/gmail/api/quickstart/python的Gmail API。 谢谢!我会调查的! 【参考方案1】:

在您的错误消息中,我们可以看到没有这样的文件或目录:'client_secret.json'。你有它然后将它存储在你的当前目录中如果你没有它,你可以看到如何使用Python Quickstart 检索client_secret.json

别忘了打开你的 gmail API

【讨论】:

以上是关于使用 gmail api 发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

使用 gmail-api 和 google-api-php-client 发送电子邮件

使用 gmail api 发送电子邮件

作为发件人,使用 API 或标头,是不是可以检测电子邮件是不是使用 Gmail 的“计划发送”发送?

Gmail API 发送电子邮件

尝试在 Java 中使用 Gmail API 发送电子邮件时出错

退回 <nobody@gmail.com> Gmail API 发送失败