インフラ」タグアーカイブ

pythonのimport imaplibで日本語フォルダ名を使う場合はエンコードが必要

環境

  • PRETTY_NAME=”Ubuntu 22.04.3 LTS”
  • Python 3.10.12
  • pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10)

手順

imap_toolsというのが楽らしいのでインストール

pip install imap_tools

インポートして実行

import imap_tools
mailbox_name = "INBOX.ジム.予約"
status, messages = mail.select(imap_tools.imap_utf7.encode(mailbox_name))

何もしない場合のエラー

mail.select(“INBOX.ジム.予約”)

として

yoshitake@mail:~/dovecot_delivery$ python3 test.py 
Traceback (most recent call last):
  File "/home/yoshitake/dovecot_delivery/test.py", line 15, in <module>
    mail.select("INBOX.ジム.予約")
  File "/usr/lib/python3.10/imaplib.py", line 756, in select
    typ, dat = self._simple_command(name, mailbox)
  File "/usr/lib/python3.10/imaplib.py", line 1230, in _simple_command
    return self._command_complete(name, self._command(name, *args))
  File "/usr/lib/python3.10/imaplib.py", line 987, in _command
    arg = bytes(arg, self._encoding)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 6-7: ordinal not in range(128)

ソース全体

import imaplib
import imap_tools
from email.header import decode_header

# IMAPサーバの設定
mail_server = 'mail.huga.co.jp'
username = 'hoge'
password = 'hugahuga'

# IMAPサーバに接続
mail = imaplib.IMAP4_SSL(mail_server)
mail.login(username, password)

# # メールボックスを選択
mailbox_name = "INBOX.ジム.予約"
status, messages = mail.select(imap_tools.imap_utf7.encode(mailbox_name))

# # メール検索(例: 未読メール)
status, messages = mail.search(None, "(UNSEEN)")
unread_count = len(messages[0].split())
print(f"未読メールの件数: {unread_count}")

# 接続を閉じる
mail.close()
mail.logout()

Barracuda Reputation

社内SE(という名のシステム全般担当)やっている会社からあるところにメールが送れないという連絡がきた。

添付された内容を見ると

Remote host said: 554 Service unavailable; 
Client host [XXXX.jp] blocked using Barracuda Reputation; 
http://bbl.barracudacentral.com/q.cgi?ip=nnn.nnn.nnn.nnn
Giving up on nnn.nnn.nnn.nnn.

迷惑メール判定システムのバラクーダにがっつりはじかれています。調べてみたところ利用ドメインでの登録な無し。バーチャルドメインなメールサーバに間借りしているので巻き添えっぽい。

サーバは他のソフトハウス管理で、対応依頼も面倒。

Barracuda Spam & Virus Firewall Plusってので受け取り側で解除できるらしいので、他のIP持つドメインから送ってしのいでいる間に送信先に解除してもらうしかないかなぁ。