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

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

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

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

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

Q&A

解決済

1回答

1474閲覧

Heroku上でメールの添付ファイルを取得し、Slackに投稿したい

chougen

総合スコア10

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

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

0グッド

0クリップ

投稿2019/04/23 13:41

PythonでGmailの添付ファイルのペイロードを取得し、io.BytesIOに保存してSlackにSlackerモジュールのfiles.uploadを利用して投稿しようとしていますが、正しいファイルとして表示されません。
例えばpdfの場合、ファイルをテキストとして開くと%%EOFしか保存されておらず、jpegもテキストとして開くと文字化けが見られます。
Heroku上での運用なので一時的にファイルを作って投稿後にまた消すというようなこともできないようなのでBytesIOを使っているのですが、適切に投稿される方法が他にあるのでしょうか。それともBytesIOの編集が足らないのでしょうか。
エラーメッセージは表示されていません。

python

1#ファイルをgetします 2 def GetSentence(self, service, TheID):#本文と添付ファイルとを詳らかに取得する 3 #raw (1) rawフォーマットでメールを取得 4 data = service.users().messages().get(userId='me', id=TheID, format='raw').execute() 5 raw_data = base64.urlsafe_b64decode(data['raw']) 6 # (2) Emailを解析する 7 eml = email.message_from_bytes(raw_data) 8 # (3) 本文を取得 9 body = "" 10 files = {} 11 for part in eml.walk(): # (4)テキスト部分の処理 12 if part.get_content_type() == 'text/plain': # (5) 13 s = part.get_payload(decode=True) 14 if isinstance(s, bytes): 15 charset = part.get_content_charset() or 'iso-2022-jp' # (6) 16 s = s.decode(str(charset), errors="replace") 17 for daylist in daylists: 18 tmpday = daylist 19 body += s 20 21 else:#ここから問題の添付ファイルの処理 22 attach_fname = part.get_filename() 23 if not attach_fname: 24 continue 25 tmpfile = io.BytesIO(part.get_payload(decode=True)) 26 decodefname = email.header.decode_header(attach_fname) 27 files[decodefname[0][0]] = tmpfile 28 # (7) 本文と添付ファイルをリターン 29 return body,files

python

1#ファイルをslackに投稿します 2 def mail_reminder2(message): 3 t_now = datetime.datetime.now(JST) 4 mails = mail_get(t_now - datetime.timedelta(hours=2), t_now - datetime.timedelta(hours=1)) 5 if mails: 6 slack.chat.post_message('channel',f'{len(mails)}件のメールがあります',as_user=True) 7 for mail in mails: 8 for key in mail['Files']: 9 tmptmp = slack.files.upload(channels='channel',content=mail['Files'][key],filename=key,thread_ts=ts_illius.body['ts']) 10 print(tmptmp) 11 mail['Files'][key].close() 12 13 else: 14 message.send('ないです')

return

1#上のプログラムのprint(tmptmp)です 2{"ok": true, "file": {"id": "FJ62CN5TQ", "created": 1556022549, "timestamp": 1556022549, "name": "ファイル名.pdf", "title": "ファイル名", "mimetype": "text/plain", "filetype": "text", "pretty_type": "\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8", "user": "UHBKJHM1T", "editable": true, "size": 6, "mode": "snippet", "is_external": false, "external_type": "", "is_public": false, "public_url_shared": false, "display_as_bot": false, "username": "", "url_private": "https://files.slack.com/files-pri/TG3417JHR-PJ62C3NR2/______________pdf.pdf", ...... 3

pdf

1%%EOF

jpeg

1GbNWUBBAD+19BAD+1A@(gBAD+8EBAD+1FʤBAD+8C0BAD+93BAD+91VLqBAD+B7BAD+0BAD+81@^E3BAD+59]BAD+9 BAD+83TBAD+82BAD+99sBAD+8ABAD+82ExBAD+9*ƀ-BAD+B4`IBAD+AABAD+5 NNsBAD+AABAD+1M#BAD+BEBAD+17BAD+8FBAD+A5LBAD+8IBAD+9BAD+4PBAD+91ydBAD+1S0BAD+8DBAD+BEQUBAD+BCTBAD+1D@$BAD+9CBAD+10wBAD+8CBAD+B5{BAD+12%BAD+92BAD+ABBAD+96lBAD+93BAD+ABoBAD+5BAD+8BAD+0BAD+156BAD+BAto-BAD+BBwBAD+EhBAD+246p 2WBAD+92BAD+19O"BAD+91n9$BAD+8ABAD+9CθBAD+80e?'ښȌ~~BAD+BFBAD+9|BAD+6ɌBAD+91BAD+9FJBAD+8D#BAD+94BAD+8FBAD+99BAD+89?\BAD+10BAD+EBAD+0BAD+1UdBAD+9CBAD+B5F~BAD+94BAD+B7BAD+86$iHBAD+B7`(BAD+FҀ%BAD+88BAD+0=BAD+9%BAD+EP敤 cTBAD+90BAD+CPEӹBAD+AB;3M |8BAD+15#]BAD+BBBAD+13BAD+4UBAD+ALBAD+BqBAD+9ABAD+2/BAD+8C!?BAD+1]j(BAD+97o(BAD+8ABAD+80?BAD+19 3........................

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

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

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

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

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

CHERRY

2019/04/23 23:30 編集

ローカル環境などで動かしてデバッグすると正しい動作はするのでしょうか? まずは、ローカル環境等で、正しく動作するようにデバッグしてください。 たとえば、一時的にファイルに出力して、その時点で壊れていないか確認するなどのデバッグを行って、どこで壊れるのかを確認してください。 > Heroku上での運用なので一時的にファイルを作って投稿後にまた消すというようなこともできない heroku でも 一時ファイルなら作成できますよ。 heroku はファイルが作成できないのではなく、ほぼ1日に1回再起動が入り、git から再デプロイされることになるので、サーバーで作成された git 管理されていないファイルが再起動の後に消えるという仕様なので、サーバーで作成したファイルを永続的な保管ができないだけです。
chougen

2019/04/24 03:32

ローカルでBytesIOから再びバイナリを取り出して実体のあるファイルにしたところ正しく出力されました。 /tmpフォルダには一時ファイルが作成できるのですね。ありがとうございます。
guest

回答1

0

自己解決

下記の函数で引数を間違えていました。
slack.files.upload(channels='channel',content=mail['Files'][key],filename=key,thread_ts=ts_illius.body['ts'])

正しくはcontentではなくfile_です。
slack.files.upload(channels='channel',file_=mail['Files'][key],filename=key,thread_ts=ts_illius.body['ts'])

投稿2019/04/24 03:47

chougen

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問