2017-09-08 3 views
0

以下のコードは機能します。私はGmail APIを通してメールを送ることができますが、ウォールタイム(20-30秒)に基づいて10個のメールを送信するのにしばらく時間がかかります。電子メールをより高速に送信するためのコードを最適化する方法はありますか?クォータの制限があります。Gmail API Python:コードを最適化して電子メールをより速く送信する

送信できるメールの最大数は1日100ですか?送信できる電子メールの数と電子メールごとの受信数の間には違いがあるようです。これは私が調達しているドキュメントです:https://developers.google.com/apps-script/guides/services/quotas

私は消費者版を使用しています。

機能の消費者(gmail.com)
カレンダーイベントは、5000の
コンタクトが1000の

ドキュメントを作成した作成日あたり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

サービスの結果をキャッシュするその結果、serviceSendMessageに渡されます。この方法では、送信する個々のメールごとに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) 

また、あなたは大規模なバッチ当たり1 Pythonのinvokationを起動することを確認してください毎回しばらく。

+0

今すぐもっと速く走ります。ありがとうございます。私はcmd行からこれを実行しています。大きなバッチでPythonを1回呼び出すと、pd.read_csv( 'testdata.csv')に必要なすべてのデータをmain()で1回呼び出す必要があるのですか?私はモジュールがインポートされた後でキャッシュされていると思った? – Jahmul14

+0

私は、コマンドラインからPythonインタプリタを昼食するたびに、すべてのモジュールをリロードすることを意味します。電子メールのバッチを高速に実行するには、CSVファイルに大きなバッチを含める方が良いため、小さいCSVファイルでプロセスを再起動する必要がありません。 – tennessee

関連する問題