Gmail API Python:优化代码以更快地发送电子邮件

时间:2017-09-08 19:40:39

标签: python email gmail-api

以下代码有效。我可以通过Gmail API发送电子邮件,但根据待机时间(20-30秒)发送10封个性化电子邮件需要一段时间。有没有办法优化下面的代码来更快地发送电子邮件?有配额限制。

是否可以发送最多电子邮件数量,每天100封?您可以发送的电子邮件数量与每封电子邮件的收据数量之间似乎存在差异。这是我采购的文档:https://developers.google.com/apps-script/guides/services/quotas

我正在使用消费者版本。

功能消费者(gmail.com)
日历活动创建了5000个 联系人创建了1,000

创建的文件250

每天发送电子邮件收件人100 *

代码:

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

import pandas as pd
import textwrap

SCOPES = 'https://www.googleapis.com/auth/gmail.send'
CLIENT_SECRET_FILE = 'secret.json'
APPLICATION_NAME = 'AppName'

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-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,message_text):
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('gmail', 'v1', http=http)

    message1 = CreateMessageHtml(sender, to, subject, message_text)
    result = SendMessageInternal(service, "me", message1)
    return result

def CreateMessageHtml(sender, to, subject, message_text):
    msg = MIMEText(message_text)
    msg['Subject'] = subject
    msg['From'] = sender
    msg['To'] = to

    return {'raw': base64.urlsafe_b64encode(msg.as_string())}

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, error:
        print 'An error occurred: %s' % error
        return "Error"
    return "OK"

def main():
    df = pd.read_csv('testdata.csv')
    for index,row in df.iterrows():
        to = row['Email']
        sender = "sender"
        subject = "subject"
        dedent_text = '''Hello {}, \n
thank you for your question.'''.format(row['First'])
    message_text = textwrap.dedent(dedent_text).strip()
    SendMessage(sender, to, subject, message_text)


if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:1)

尝试缓存服务调用的结果,以便将service传递给SendMessage。这样,您就不会花费API调用时间来为您发送的每封电子邮件设置API。

所以最重要的是:

def main():
    # Do once
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('gmail', 'v1', http=http)

    df = pd.read_csv('testdata.csv')
    for index,row in df.iterrows():
        to = row['Email']
        sender = "sender"
        subject = "subject"
        dedent_text = '''Hello {}, \n
        thank you for your question.'''.format(row['First'])
        message_text = textwrap.dedent(dedent_text).strip()

        # service is is reused here for each message
        SendMessage(service, sender, to, subject, message_text)

此外,如果您需要发送许多消息,请确保每个大批量调用一次Python调用,因为启动解释器并加载许多软件包每次都需要一段时间。