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

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

ただいまの
回答率

87.61%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 759

score 2

前提・実現したいこと

ラズベリーパイにて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/ツールのバージョンなど)

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/12/01 18:14

    仰っる通りでした。

    /usr/bin/python3
    と明記すれば直りました。

    本当にありがとうございました。
    かれこれ1週間ほど悩んで、ハードウェアの信号なども確認に途方に暮れておりました。

    もっとLinux系について勉強します。

    キャンセル

  • 2020/12/01 18:20

    よかったです。

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

    キャンセル

  • 2020/12/01 18:28

    >>「Python2と3の互換性があることもある」「さらに、マイナーバージョンでも違いがある」
    ありがとうございます。
    マイナーバージョンでの差異もあるのですね。

    ラズベリーパイとPythonの組み合わせはWEB上にごろごろ、サンプルが落ちておりましたので
    中身までよく理解せずに使っておりました。
    流用時には、バージョンの違いも意識します。
    本当にありがとうございました。

    キャンセル

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

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る