繁体   English   中英

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

[英]Gmail API Python: Optimize code to send email faster

下面的代码有效。 我可以通过Gmail API发送电子邮件,但根据挂墙时间(20-30秒),需要花一些时间才能发送10个个性化电子邮件。 有没有一种方法可以优化下面的代码以更快地发送电子邮件? 有配额限制。

一个人每天最多可以发送100封电子邮件吗? 可以发送的电子邮件数量与每封电子邮件的收据数量之间似乎有所不同。 这是我正在采购的文档: https : //developers.google.com/apps-script/guides/services/quotas

我正在使用消费者版本。

功能使用者(gmail.com)
日历活动创建了5,000
建立的联络人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()

尝试缓存服务调用的结果,以便将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调用,因为启动解释器并加载许多包可能需要一段时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM