質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

836閲覧

TypeError: gmail_send() missing 3 required positional argumentsを解消したい

yusuke_0923

総合スコア3

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/04/17 06:16

編集2021/04/17 06:44

pythonでGmailの定期送信をしたいのですが、初めの一回しかやってくれません。
どうしたら、繰り返しやってくれますか。

###ソースコード

python

1#必要なモジュールをインポート 2import datetime 3import smtplib 4import ssl 5from email.mime.text import MIMEText 6from email.mime.multipart import MIMEMultipart 7from email.mime.base import MIMEBase 8from email import encoders 9import pandas as pd 10 11 12 13 14 15 16#メーリングリスト読み込み 17df = pd.read_excel('mailing_list.xlsx') 18df 19 20#エンコード指定 21import sys, io 22sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 23 24#送信元の設定 25gmail_account = "XXX@gmail.com" 26gmail_password = "XXX" 27 28#日時要素の指定 29today_date = datetime.date.today() 30delivery_date = today_date + datetime.timedelta(days=1) 31print(today_date,delivery_date) 32 33#メール内容を関数化 34def gmail_send(send_name, mail_to, filename): 35 36 #メールタイトルと本文(本文はHTML形式) 37 subject = "{0},{1}分の打刻はしたのか?".format(send_name,today_date) 38 body = '''打刻しなかったら大変なことになるぞ。<br> 39 添付ファイルのようにな。<br> 40 タイムリミットは{0}だ。'''.format(delivery_date) 41 42 #内容確認 43 print(subject) 44 print(body) 45 46 msg = MIMEMultipart() 47 48 msg["Subject"] = subject 49 msg["To"] = mail_to 50 msg["From"] = gmail_account 51 msg_body = MIMEText(body,"html") 52 print(msg) 53 54 msg.attach(msg_body) 55 56 filename = filename 57 file = open(filename,"rb") 58 59 #ファイルを添付 60 attachment_file = MIMEBase('application','pdf') 61 attachment_file.set_payload((file).read()) 62 file.close() 63 64 encoders.encode_base64(attachment_file) 65 attachment_file.add_header('Content-Disposition',"attachment", filename=filename) 66 msg.attach(attachment_file) 67 68 69 70 71 server = smtplib.SMTP_SSL("smtp.gmail.com",465,context=ssl.create_default_context()) 72 server.login(gmail_account, gmail_password) 73 server.send_message(msg) 74 server.close() 75 print('送信完了') 76 77#メーリングリストのすべての宛先にmeil_sendの処理を繰り返し行う 78for send_name, mail_to, filename in zip(df['宛名'],df['メールアドレス'],df['添付ファイル']): 79 gmail_send(send_name, mail_to,filename) 80 81 82#定期実行 83import schedule 84import time 85 86schedule.every(10).minutes.do(gmail_send) 87# schedule.every().day.at("23:00")do(gmail_send) 88 89while True: 90 schedule.run_pending() 91 time.sleep(1)

###エラー

Traceback (most recent call last): File "C:\test\autemail.py", line 90, in <module> schedule.run_pending() File "C:\Users\Owner\AppData\Local\Programs\Python\Python39\lib\site-packages\schedule\__init__.py", line 780, in run_pending default_scheduler.run_pending() File "C:\Users\Owner\AppData\Local\Programs\Python\Python39\lib\site-packages\schedule\__init__.py", line 100, in run_pending self._run_job(job) File "C:\Users\Owner\AppData\Local\Programs\Python\Python39\lib\site-packages\schedule\__init__.py", line 172, in _run_job ret = job.run() File "C:\Users\Owner\AppData\Local\Programs\Python\Python39\lib\site-packages\schedule\__init__.py", line 661, in run ret = self.job_func() TypeError: gmail_send() missing 3 required positional arguments: 'send_name', 'mail_to', and 'filename'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

TypeError: gmail_send() missing 3 required positional arguments: 'send_name', 'mail_to', and 'filename' は「gmail_send()には引数が3つ必要だけど引数がない」のようなエラーです。
このエラーがどこで出ているかというとFile "C:\test\autemail.py", line 90, in <module> schedule.run_pending()、つまり定期実行をしようとして躓いているわけですが、そもそも何を定期実行するかはschedule.every(10).minutes.do(gmail_send)で設定しています。ここでgmail_send()の引数を設定していないことが原因だと思われます。

python

1# schedule.every(10).minutes.do(gmail_send) 2# do()で引数を与える場合は、do(メソッド名, 引数名=値, ...) 3schedule.every(10).minutes.do(gmail_send, send_name="xxx", mail_to="xxx", filename="xxx")

以下コメントを受けて追記

excelの値とはfor send_name, mail_to, filename in zip(df['宛名'],df['メールアドレス'],df['添付ファイル']):で用いている値のことでしょうか。
一度に複数回実行したい場合は、複数回実行するメソッドを作成しそのメソッドをdo()に渡すのがいいと思います。

python

1def send_multiple_gmails(): 2 for send_name, mail_to, filename in zip(df['宛名'], df['メールアドレス'], df['添付ファイル']): 3 gmail_send(send_name, mail_to, filename) 4 5# 中略 6 7schedule.every(10).minutes.do(send_multiple_gmails)

投稿2021/04/17 09:19

編集2021/04/17 21:54
ss_sasasa

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yusuke_0923

2021/04/17 17:44

"xxx"に該当するのは今回の場合だとどうしたらいいですか? 送信先のアドレスは今回はExcelに格納してあるんですけども。 そこを教えてくださるとありがたいです。
yusuke_0923

2021/04/18 04:38

出来ました! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問