前提・実現したいこと
python3で添付ファイルをつけてメールの送信を行いたい。
発生している問題・エラーメッセージ
30件の送り先に個別にメール送信でエクセルの添付ファイル(xxx.xlsx)を送信しています。
自身にCCをつけて送信していて自分自身へのメールでは添付ファイルが確認できますが、
2件の送付先から添付ファイルが無いとの指摘を受けています。また、一度限りではなく何度再送を行っても同様の現象が発生しています。
不具合の起きている送り先はyahooメールとocn.ne.jpです。
受信先でのメール設定などに起因する可能性もあるのではないかとも考えていますがよろしくお願いいたします。
尚、全く同じ内容のメールを同じSMTPサーバー経由でサンダーバードから送信をした場合には添付ファイルは問題なく届いたと報告がありました。
1.サンダーバードからのメール送信では正常に添付ファイルが届く(smtpサーバは同じ)
2.gmailからのメール送信では正常に添付ファイルが届く
pythonから送信のメールを転送してもらったところ以下の通り。
xxx.xlsxの場合は調査中です。(下記ではaaa.pdfの場合です。)
aaa.pdfをpythonで送信した場合も質問同様に添付ファイルが届かないという報告でした。報告のメールをそのまま転送してもらったところPart 1.2というファイルが添付されていました。ファイルサイズはもとの644,486 バイトと同じで、拡張子を.pdfに変更すると問題なく開くことができました。
該当のソースコード
python3
import smtplib from email.mime.text import MIMEText from email.header import Header from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email.utils import formatdate from email import encoders #smtpサーバ情報 smtp_ad = smtp_po = smtp_id = smtp_ps = i = 0 for index in dic.keys(): time.sleep(1) i += 1 #メール情報 ml_jp = 'utf-8' ml_from = ml_bcc = ml_title = ml_to = ml_text = メール本文 #メッセージ編集 message = MIMEMultipart() #添付があるのでMultipart message['Date'] = formatdate() message['Subject'] = str(Header(ml_title,ml_jp)) message['From'] = ml_from message['To'] = ml_to if ml_cc !=None: message['Cc'] = ml_cc message.attach(MIMEText(ml_text)) #本文(テキスト)をattach for k in range(len(dic[index])): ##dic[index]は "xxxx.xlsx"です。 #エクセルファイルを添付 attachment = MIMEBase('application','vnd.openxmlformats-',name = dic[index][k]) file = open(dic[index][k],'rb') attachment.set_payload(file.read()) file.close() encoders.encode_base64(attachment) #base64でエンコード attachment.add_header('Content-Dispotion','attachment',filename = dic[index][k]) message.attach(attachment) try: #メール送信 print(str(i)+'件目: '+index[1]+'様' +'に送信中...{}...{}様:Cc:{}'.format(index[2],index[3],index[4])) smtp_obj = smtplib.SMTP_SSL(smtp_ad,smtp_po)#SSLを利用の場合はSMTP_SSL smtp_obj.ehlo() smtp_obj.login(smtp_id,smtp_ps) smtp_obj.sendmail(ml_from,[ml_to]+[ml_bcc],message.as_string(),) smtp_obj.close() except Exception as E: print("***** エラー内容 *****") print("type: "+ str(type(E))) print("args: " + str(E.args)) print("message: " + E.message) print("E自体: " + str(E)) print('送信完了') ### 試したこと 自分自身でyahooメールを取得して送信したところ添付ファイルが確認できた。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
とりあえず、相手のメーラーとメール表示形式(設定)の確認かなあ。
お返事ありがとうございます。
受信者はメーラーが何かもわかっていないので厳密には確認が取れていません。
恐らくoutlookのデフォルト設定だと思われます。調べたところoutlookのデフォルト設定ではhtmlメールとなっているようなのですが、このあたりが影響するということはありますでしょうか。
ウィルス対策ソフトの有無も確認してください。
Excelファイルはマクロ実行で悪さすることができるので自動削除対象になっているかもしれません。
outlook ではある現象らしいですが、お話の状況では対策(メーラー環境の設定変更など)はむずかしそうですねえ。
まだ回答がついていません
会員登録して回答してみよう