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

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

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

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

Q&A

解決済

1回答

3299閲覧

ラズベリーパイにて、systemdを使った自動起動プログラムの場合にのみエラーが発生します。

shinchoroX

総合スコア17

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

0グッド

1クリップ

投稿2020/12/01 07:57

前提・実現したいこと

ラズベリーパイにてPython3を使用中です。
毎日の終わりに一度、
「センサの値をテキストファイルに書き込み、添付ファイル付きのメールを送るプログラム」
を実装済みです。
手動で実行するとエラーは発生しませんが、systemdを用いて電源ON時に自動起動を行うとエラーが発生します。
以下に詳しく記載します。

発生している問題・エラーメッセージ

発生しているエラーは
「メール送信を実行するとプログラミングが止まる」
です。
前述の通り、手動(Thonnyからやターミナルからの実行)ではメール送信も出来ますが
systemd を用いた.timerファイルと.serviceファイルを使う方式に変えると、メール送信実行時に止まります。

ラズパイのログを見ると以下のエラーメッセージがありました。(/var/lo/syslog)

Traceback (most recent call last):
File "/home/pi/Leasemat2/CClite.py", line 198, in <module>
SDATT.send_emailATT(RECIPIENT,Title,Bodytext,Attfile)
File "/home/pi/Leasemat2/SendMailATT.py", line 45, in send_emailATT
server.send_message(msg)
AttributeError: SMTP instance has no attribute 'send_message'
leasemat02.service: Main process exited, code=exited, status=1/FAILURE
leasemat02.service: Failed with result 'exit-code'.

添付ファイルのメールを送信するモジュールでエラーが起こっているようですが
・単体での動作は正常(メール送信可能)
・プログラム全体(メインプログラムからのモジュールのコール)でも、手動での実行では正常
です。

該当のソースコード

添付ファイル付きメールの実行コードです。
Python3で書いております。

# coding: UTF-8 from email.mime.text import MIMEText from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart import smtplib from os.path import basename import time import datetime # SMTP認証情報 account = '*****@gmail.com' password = '*****' # 送受信先 from_email = "****@xxx.xxx" RECIPIENT = '*****@xxx.xxx' def send_emailATT(recipient,title,text,fliepath): #recipient:受取人 # MIMEの作成 subject = title message = text msg = MIMEMultipart() msg["Subject"] = subject msg["To"] = recipient msg["From"] = from_email msg.attach(MIMEText(message)) # ファイルを添付 path = fliepath # "./readme.txt" with open(path, "rb") as f: part = MIMEApplication( f.read(), Name=basename(path) ) part['Content-Disposition'] = 'attachment; filename="%s"' % basename(path) msg.attach(part) # メール送信処理 server = smtplib.SMTP("smtp.gmail.com", 587) server.starttls() server.login(account, password) server.send_message(msg) server.quit() if __name__ == '__main__': place ='xxxx' Title = 'Location is {}'.format(place[:]) num = 0 Bodytext = 'Test is {}'.format(num) stmp = datetime.date.today().strftime('%Y%m%d') Attfile = './'+stmp+ '.txt' send_emailATT(RECIPIENT,Title,Bodytext,Attfile)

試したこと

ここが原因と気づくのに色々と試した結果、systemdが悪さをしていると気づきました。
Linux系は勉強を始めたばかりなので、アドバイスを頂けると幸いです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

python 2.x のSMTPにはsend_message()は無いようですので、systemd経由で動作しているときには、python2 になってしまっているのではないでしょうか?

投稿2020/12/01 08:22

TakaiY

総合スコア12666

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

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

shinchoroX

2020/12/01 08:25

早速のご返答ありがとうございます。 そうなのですね!! 差し支えなければ、systemdでの実行時にPython3を指定する方法等をご存じでしたら教えていただけますでしょうか。 (もちろん並行して探しております)
shinchoroX

2020/12/01 08:30

#!/usr/bin/python3 をPythonのソースの頭に入れてみます。
TakaiY

2020/12/01 08:39

それで解決するかもしれませんが、 そもそも、起動するときのスクリプトなりにはどのように指定してあったのでしょうか?
shinchoroX

2020/12/01 08:48 編集

.serviceファイルには [Unit] Description= Leasemat Customer Counter System auto boot [Service] ExecStart=/usr/bin/python /home/pi/Leasemat2/CClite.py と記載しております。 .timerには [Unit] Description=daily do something [Timer] OnBootSec=1min [Install] WantedBy=timers.target のみの記載です。
TakaiY

2020/12/01 08:50

ExecStartで指定している 「/usr/bin/python」はpython3でしょうか? でなければ、CClite.pyの中で何を指定しても同じです。
shinchoroX

2020/12/01 08:54

>> CClite.pyの中で何を指定しても同じです。 はい。同じでした。 >>「/usr/bin/python」はpython3でしょうか? いえ。アドバイスを頂いてからオイラリーの入門書に「Python2と3の互換性がないものもある」 との記述を思い出しました。 python3 と明記してみます。
shinchoroX

2020/12/01 09:14

仰っる通りでした。 /usr/bin/python3 と明記すれば直りました。 本当にありがとうございました。 かれこれ1週間ほど悩んで、ハードウェアの信号なども確認に途方に暮れておりました。 もっとLinux系について勉強します。
TakaiY

2020/12/01 09:20

よかったです。 「Python2と3の互換性がないものもある」ではなくて、「Python2と3の互換性があることもある」くらいに思っていたほうがいいです。さらに、マイナーバージョンでも違いがあるので、特に、コード/設定を流用するときには、参照しているものがどのバージョンを想定しているのか確認すべきです。
shinchoroX

2020/12/01 09:28

>>「Python2と3の互換性があることもある」「さらに、マイナーバージョンでも違いがある」 ありがとうございます。 マイナーバージョンでの差異もあるのですね。 ラズベリーパイとPythonの組み合わせはWEB上にごろごろ、サンプルが落ちておりましたので 中身までよく理解せずに使っておりました。 流用時には、バージョンの違いも意識します。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問