Outlookメール本文にあるイメージの保存

お世話になっております。
Outlookに添付されている各種ファイルを保存するアクティビティとして、SaveMailAttachmentsを使っています。
添付ファイルとメール本文内に複数イメージ挿入したメールでテストしたところ、添付ファイルについては問題なく保存できましたが、本文内にあるイメージもファイルとして保存されることが判りました。しかも、一律「image.png」になり、複数イメージの中、1枚だけがファイルになりました。

以下の部分について教えていただけますようお願いいたします。
✓ 添付ファイルのみ保存し、メール本文内にあるイメージは保存しないように設定することは可能でしょうか。
✓ 添付ファイルも、本文内に挿入されたイメージもファイルとして保存する場合、本文内に挿入されたイメージのファイル名を重複しないように設定する方法はありますでしょうか。

1 Like

You could use the “Exclude Inline Attachments” property to configure the activity to ignore or save images in the email body:

In my testing, UiPath saves images in an email body with the file name image001.png. If I also have an attachment with the file name of image001.png, UiPath will save both the image in the email body, one with file name image001.png, the other with image001_1.png.

image

@yikwen.goo

すみません。恐らくバージョンの違いかもしれませんが、私の方で使っているSaveMailAttachmentsは以下のイメージです。
image
何かバージョンアップしないといけないでしょうか。
もしくは代わりに対応可能な方法があれば教えていただけますようお願いいたします。

Hello, for this activity you’ll have to look in the Properties panel for the Exclude Inline Attachments option. My UiPath.Mail.Activities version is 1.18.1

image

The activity I showed in my earlier post is “Save Email Attachments” under “Gmail and Outlook” category. It works a bit differently.

image

こんにちは

元の埋め込まれているファイル名が同一になっているのかもしれません。
原因の切り分けの一つとして、添付保存の手前で、代入アクティビティで下記を追加したときに、どのようになるか、確認可能でしょうか?

mailMessageVar.AlternateViews(0).LinkedResources(0).ContentType = New System.Net.Mime.ContentType("application/octet-stream; name=imageX.png")
2 Likes

@Yoichi

いただいた文を代入アクティビティを使い、メッセージログで確認したところ「application/octet-stream; name=imageX.png」と出ました。
これは何を確認するためのことか教えていただけますでしょうか。

こんにちは

これを代入して添付保存すると、保存ファイルの名前が変わっていませんでしょうか?

あ!!そのままSaveMailAttachmentまで進んだら、全ての本文内にあるイメージもファイルとして保存できました。
ありがとうございます。
ちなみに、いただいたシステム文についてご説明いただけますでしょうか。

こんにちは

上記の式で解消するということは、メールの内部的に2つのインライン画像が同一名称で登録されていることが原因であると推定されます。(これはメール作成側も少々問題かもしれませんが)
そのため、そのインライン画像のファイル名の片方を上記の式で変更することにより、両方のファイルを保存できるようにしたものです。

今回は、決め打ちで上記の式でファイル名を変更しましたが、実際にはインライン画像がいくつあるかわかりませんので、LinkedResourceCollectionを取得後、ForEachでイテレートして、ファイル名をユニークにするロジックが必要になるかもしれません。(ただし拡張子は維持する必要があるなど少々面倒な処理が必要かもしれません)

1 Like

@Yoichi

想定される原因及び解決策について教えていただきありがとうございます。
メール作成側の制御はなかなか難しいところでありますので、ForEachでファイル名をユニークにするしかないと思います。拡張子をまず分離してファイル名の後ろに番号を付けた後、拡張子を再度つけるとかの方法でしょうかね。
ただ、気になるのは、本文内にあるイメージだけではなく、ファイルとして添付されているファイルが混在している場合、どれが添付ファイルでどれが本文内にあるイメージなのかをどうやって識別できるのかというところですが、それについては何か方法がありますでしょうか。

添付ファイルは
mailMessageVar.Attachmentsとして取得できますので、取得するための手段が異なります。

こちらも

mailMessageVar.Attachments(0).Name = "newname.pdf"

のようにすると名前の変更は可能かと思いますので、
この両者で使い分けると良いかと思います。

1 Like

@Yoichi

理解ができず、度々すみません。
今、処理していたのは以下のイメージのように、添付ファイル「AA.pdf / BB.pdf / CC.pdf」と挿入イメージ「画像1 / 画像2 / 画像3」をTestFolderに保存することです。
教えていただいたシステム文を代入アクティビティに入れたうえ、SaveMailAttachmentで保存すると、TestFolderにはイメージのようにファイルが保存されます。

添付ファイルは「mailMessageVar.Attachmentsとして取得できるということですが、つまり、添付ファイルについてForEachでの処理を行い、挿入イメージについても別途ForEachで処理を行うということでしょうか。
どのように区分けして保存するものなのか、お手数おかけしますが、具体的にご説明いただけますようお願いいたします。

こんにちは

とりあえずファイル名をユニークにすることが目的かと思いますので、

例えば

インライン画像には
Inline_連番_元のファイル名

添付には
Attachemnet_連番_元のファイル名

の様にすれば、重複なくまた元のファイル名をある程度保持したまま保存できるのではと
思いますが、回答になっていますでしょうか?

1 Like

@Yoichi

ご回答ありがとうございます。

添付ファイルについてはFor Eachで「mailMessageVar.Attachments」で対応し、インライン画像についてはFor Eachで「mailMessageVar.Inline」で対応すれば良いという理解でよろしいでしょうか。

今の仕組み上では、一つの「SaveMailAttachment」アクティビティだけでは、添付ファイルもインライン画像も全てファイルとして出力されるので、一つのアクティビティで2種類(添付ファイル/インライン画像)を分けて対応できるということなのか、それぞれを分けて対応するということなのかがまだ理解ができておらず、、ご教示いただけますようお願いいたします。

1 Like

その意図です。あらかじめファイル名に上記のようなプレフィクスを付けておけば、後ほどファイル名から添付かインラインかは判別できると思いますので。

@Yoichi

予めファイル名につけておくということですね。そうすると確か識別は可能だと思いますが、メール作成側の制御が難しいため、いろんな形でつけられるファイルを受け取ってからUiPathでの分別作業になります。。

SaveMailAttachmentアクティビティ上では添付かInlineかが識別できないということですので、ある程度のルール付けは必要ということで運用ルールを検討してみます。

1 Like

メールの作成側を変えるということではありません。
メールを受信した後に、各ファイルの名前を受信側で変更しておいてから、SaveAttachmentを使うということです。

受信したメールに対し、SaveMailAttachmentで保存する前に、違うアクティビティでファイル名をそれぞれ変換するということですね?
それはどのような方法かご教示いただけますようお願いいたします。

こんにちは

以下の式を代入アクティビティでセットしてから添付保存したと思いますが、同じことを、ループを使いすべてのファイル名に対して行います。(その際インデックス番号等を使い動的に設定します)

mailMessageVar.AlternateViews(0).LinkedResources(0).ContentType = New System.Net.Mime.ContentType("application/octet-stream; name=imageX.png")

そういうことですね!
ありがとうございます。
For Eachと組み合わせて対応してみます。