以下のコードは機能します。私は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()
を
今すぐもっと速く走ります。ありがとうございます。私はcmd行からこれを実行しています。大きなバッチでPythonを1回呼び出すと、pd.read_csv( 'testdata.csv')に必要なすべてのデータをmain()で1回呼び出す必要があるのですか?私はモジュールがインポートされた後でキャッシュされていると思った? – Jahmul14
私は、コマンドラインからPythonインタプリタを昼食するたびに、すべてのモジュールをリロードすることを意味します。電子メールのバッチを高速に実行するには、CSVファイルに大きなバッチを含める方が良いため、小さいCSVファイルでプロセスを再起動する必要がありません。 – tennessee