“大量のメールを一斉送信する” といった業務に於いて、“アドレス不良で届かない” いわゆる “Returned Mail” の発生が考えられます。

一方的に送るだけでよいものから必ず伝えなければならない情報まで 内容の重要度により “Returned Mail” 発生時 例えば 別アドレスによる再送信や不良アドレスの削除等 色々な処理が必要になると思われます。 今回 このような処理に必須の 不良アドレスのリスト化プログラムをPython により 開発しました。

1. 抽出リターンメール用リスト準備

1-1. リターンメールリスト表 rmlist1.xlsx を準備します。

リスト表は 以下 3に示す プログラムと同一のディレクトリーに
置きます。 行数は  Returned mail 数により 決めます。        

NoReturned Mail Address

    1-2. アウトルックフォルダー内 受信トレイ 位置確認

以下のコマンドで アウトルック アカウント内 サブホルダー 一覧を

表示させます。 表示結果より 受信トレイは アカウント内 第2項目で

ある事が分かります。

import win32com.client
accounts=win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI").Folders
for acnt in accounts: 
    print ("accoun 名 " ,acnt)
    print (" ")
print("root (アカウント数=%d)" % accounts.Count)
print(" ")
for folder in acnt.Folders:
    print ("-- ",folder)
quit()    

サブホルダー名 表示結果 (一部省略)

accoun 名  xxxxxx@xx.xxx.ne.jp
root (アカウント数=1)
—  削除済みアイテム
—  受信トレイ
—  送信トレイ
—  送信済みアイテム
—  予定表
—  連絡先
—  履歴
—  メモ
—  タスク
—  下書き
—  RSS フィード
—  スレッド アクション設定
—  クイック操作設定
—  迷惑メール
—  連絡先候補
—  ニュース フィード

1-3 Returned Mail 添付ファイル確認

    添付ファイルには以下に示すように 送信時に指定された不良アドレスが
<  > に挟まれて 複数個 表示されます。

 本プログラムでは まず <  > で 囲まれた不良アドレスを抽出し
 その中の初めのものから <  > を 取り除いております。
 (不良アドレス : xxxxx@xx.xxx.ne.jp  )

添付ファイル内容 (一部省略)

   —– The following addresses had permanent fatal errors —– <xxxxx@xx.xxx.ne.jp>
    (reason: 550 5.1.1 < xxxxx@xx.xxx.ne.jp > recipient rejected)
   —– Transcript of session follows —– … while talking to mx.basmail.jp.:
>>> DATA
<<< 550 5.1.1 < xxxxx@xx.xxx.ne.jp > recipient rejected
550 5.1.1 < xxxxx@xx.xxx.ne.jp >… User unknown <<< 503 5.5.0 need RCPT before DATA

             ちょっとコーヒーでリラックス!

2. リターンメール抽出プログラム 使用ライブラリー

  2-1 win32com.client : outlook 操作用

  2-2 openpyxl     : Excel 操作用

     2-3 re        : 正規表現 処理用  

3. Python プログラムリスト   

リスト中 # が先頭についている print 命令は # を外すことにより各種内容を

表示できます。

# 使用ライブラリー import
import win32com.client
import openpyxl as px
import re 

# Returned Mail 不良アドレス リスト表 rmlist1.xlsx 指定
book = px.load_workbook(filename='rmlist1.xlsx') 
sheet = book.worksheets[0]

# アウトルック フォルダー内 アカウント オブジェクト取り出し
accounts = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI").Folders
for acnt in accounts:
     print(acnt)
     print(" ")
#print("root (アカウント数=%d)" % accounts.Count) # outlook Folder 内 subfolder 数
print("----- returned mail list -----")     

# 以下 外側の for ルーチンで アカウント内 第2項の 受信トレイのみ処理対象とし
# 内側の for ルーチンで Returned Mail を検出し そこから不良アドレスを抽出しています 

k1=1
for folder in acnt.Folders:
    #print ("-- ",folder)
    if k1 == 2:
        r1=2
        c1=2 
        mails = folder.Items
        for mail in mails:
            #print(mail)
            #print("件名: " ,mail.subject)
            #print("受信日時: ", mail.receivedtime)
            #print("未読: ", mail.Unread)
            #print("本文: ", mail.body)
            if mail.sendername ==  "Mail Delivery Subsystem":
                print("-----------------")
                s =  mail.body
                #print("件名: " ,mail.subject)
                #print("差出人: %s [%s]" % (mail.sendername, mail.senderEmailAddress))
                #print("受信日時: ", mail.receivedtime)
                #print("未読: ", mail.Unread)
                #print("本文: ", s)            
                
                # 不良アドレスが < >  に挟まれているので p  に この条件を指定 
                p =r'<[^"<"].*?[^">"]>'
                # 以下 r : Returned Mail 内不良アドレス、b : r 内 第1項の不良アドレス取り出し 
                r = re.findall(p,s)  
                b = r[:1]

                # 不良アドレス 表示から 両側の <  >  を 削除
                rma=((','.join(b)).strip(',<>'))
                print(rma)
                # エクセル 表に 転記
                sheet.cell(row=r1, column=c1).value = (rma)
                r1=r1+1
    k1=k1+1
book.save('rmlist1.xlsx')
quit()

4.リターンメールアドレス 抽出リスト  

抽出されたリターンメールアドレスが rmlist1.xlsx にリストとして作成されます 

NoReturned Mail Address
xxxxxx@xx.xxx.ne.jp
xxxxxx@xx.xxx.ne.jp
xxxxxx@xx.xxx.ne.jp
xxxxxx@xx.xxx.ne.jp
xxxxxx@xx.xxx.ne.jp
xxxxxx@xx.xxx.ne.jp
xxxxxx@xx.xxx.ne.jp

5.まとめ

本プログラム開発に際し WEB上の 多くの関連プログラムを参考にさせていただきました。 内容に関し 問題点、改良点等ご意見をいただきたくお願い申し上げます。

投稿者

TMZ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)