スポンサーリンク

ホットメールのカレンダーをAndroid端末に同期するアプリ

ホットメールのカレンダーをAndroid端末に同期するアプリについていろいろ調べてみた。

2023/12/15くらい(?)にAqua Mailでのカレンダー同期が突如できなくったので。

 

カレンダー編集アプリはジョルテを使っている。いろいろ試したがこれより使いやすいのはない(と自分は思っている)。ジョルテは予定アイテムの本文はテキスト形式である。これに対応した同期アプリが必要。

 

結論的には以下のアプリにたどり着いた。今のところ不満はない。あったら追記する。

●ナイン - メール&予定表

https://play.google.com/store/apps/details?id=com.ninefolders.hd3

・カレンダーを同期する期間は2週間、1ヵ月、3ヵ月、6ヵ月、すべて と色々選択できる(重要)

・予定の本文はテキストとなる(必須)

 

カレンダー同期の定番はOutlookだが、なんと予定の本文をhtmlで同期してくるのでジョルテで見るとhtmlになってしまって使い物にならないのである。

 

ということでしばらくカレンダー同期にはこのナインを使っていく所存である。

なかなかたどり着くのに時間がかかったが「ActiveSync」という単語を入れて検索するのが必要だったようだ。

 

ちなみにジョルテは件名末尾に「 [C]」を付けるとグレー表示になるのがとっても便利。

 

 

 

 

 

 

PD充電器でノートPCのACアダプタを排除!

在宅ワークでノートPCが2台になりケーブルがごちゃごちゃしてきたのを何とかしたくて買ったアイテムの紹介。

 

①PD電源「120W 充電器 KOVOL 3USB-C+1USB-A PD充電器 100W 最大出力 GaNIII技術 100w usb-c 充電器 PPS45W/PD3.0/QC3.0 PSE認証済み iPhone/Android/iPad/MacBook/ノートパソコン各種対応 usb pd 充電器

KOVOLのPD充電器。

目的は2台のノートPCへの給電をするため。

結果ばっちり2台給電できる。さすが120W。

ノートPCのACアダプタはとてもごつくて邪魔。2個ともなるとなかなかの存在感を放つ。この充電器の登場でかなりすっきりした。

PC1台目給電中に2台目を接続すると、1台目の給電が数秒途切れるというのはある。それ以外は特に不満なし。

 

②USB Type-Cケーブル

ケーブルは以下のものにした。

3mで長め。ロスがあるかもしれないが長いと何かと便利。

USB3.1にも対応。

安いのはUSB2.0なので注意。この商品はUSB3.1対応だけど安い!

Type C ケーブル 3M USB C to Cケーブル USB3.1 Gen2(10Gbps) 100W PD急速充電 4K / 60Hz映像出力 ナイロン

編みMacBook、Pad、Surface、Switch、Xperia、Galaxy、Pixel等タイプc機種対応

 

③USBハブ「Anker PowerExpand 6-in-1 イーサネット ハブ PD 65W USB-Cポート 4K HDMIポート 1Gbpsイーサネットポート USB3.0ポート搭載 MacBook Pro, MacBook Air, iPad Pro用

USBハブはこれ。LAN、HDMI、PD給電できる。コンパクトでよい。

1年以上使ってるが問題ない。

PC給電中にスマホを付けると熱くなって動かなくなるのでそういうのは繋げないようにする。

有線LANをモバイルルータークレードルに接続すればリモートワークも快適に動く。

 

コマンドプロンプトで文字入力してvbsへ渡すサンプル

dosで文字入力させて、vbscriptに文字列を渡すサンプル

文字入力してvbsヘ.bat

@echo off
SET URL1=
SET /P URL1="文字を入力してください:"
ECHO 入力文字=%URL1%
cscript %~dp0message.vbs %URL1%
pause


message.vbs

MsgBox WScript.Arguments(0)


2000文字渡してみたら入力の段階で1021文字で切られた。
1000文字使えればいろいろ使えそう。vbsのinputboxの文字数制限が厳しかったのでこれを使うことにする。

Outlookのmsgファイルに日時を付けるvbs js

Outlookでメールをmsgファイルに保存することがよくあります。
その時、以下のようなことをよく実施します。
①msgファイルに保存
 <例> メール1.msg
②msgファイルを開き
③受信日時を選択してコピー
 
④ファイル名の先頭につける
 20230130 (月) 2103_メール1.msg
上記の②~④の動作を自動化するスクリプトを作ってみました。
日時は曜日は入らず「yyyymmdd_hhmmss_」が付きます。
JavaScriptにも慣れようとJScript版も作っています。
普通のメールの場合は受信日時を使用します。会議・予定の場合は開始日時を使用します。

■使い方
①以下のソースをファイルに保存。VBScriptJScriptどちらでも。
②あとはmsgファイルをスクリプトファイルにドラッグ&ドロップ(複数ファイル可)

VBScript版 「msgファイル名に日時付与.vbs」で保存

Set fso = CreateObject("Scripting.FileSystemObject")
Set oOutlook = CreateObject("Outlook.Application")

' パラメータ取得
Set args = WScript.Arguments
' [ パラメータにループ ]
For Each path In args
    ' 拡張子を取得
    ext = fso.GetExtensionName(path)
    ' 拡張子がmsgファイルなら以下処理を実施する
    If ext = "msg" Then
        ' msgファイルを開く
        Set msg = oOutlook.CreateItemFromTemplate(path)

        ' 受信日時取得にトライ
        On Error Resume Next
        datetime1 = msg.ReceivedTime
        On Error Goto 0
        ' 受信日時が取得できない場合、開始日時を取得
        If datetime1 = "" Then
          datetime1 = msg.Start
        End If
        ' 受信日時を「yyyymmdd_hhmmss_」にする。
        sReceivedTime = date2yyyymmdd_hhmmss(datetime1) & "_"
        ' msgファイル閉じる
        msg.Close(olDiscard)    ' 1    ドキュメントに対する変更内容を破棄。
        ' フォルダ
        spath = fso.GetParentFolderName(path)
        ' 新ファイル名生成
        sFileName = sReceivedTime & fso.GetFileName(path)
        ' ファイルリネーム実行
        fso.MoveFile path ,fso.BuildPath(spath , sfilename)
    End If
Next

' 日時をyyyymmdd_hhmmss形式で返す
Function date2yyyymmdd_hhmmss(pDate)
    y = Year(pDate)
    mon = Right("0" & Month(pDate), 2)
    d = Right("0" & Day(pDate), 2)
    h = Right("0" & Hour(pDate), 2)
    m = Right("0" & Minute(pDate), 2)
    s = Right("0" & Second(pDate), 2)
    date2yyyymmdd_hhmmss = y & mon & d & "_" & h & m & s
End Function


JScript版 「msgファイル名に日時付与.js」で保存

var fso = new ActiveXObject("Scripting.FileSystemObject")
var oOutlook = new ActiveXObject("Outlook.Application")
// パラメータ取得
var args = WScript.Arguments
var datetime1

// パラメータにループ
for (i = 0; i < args.length; i++) 
{
    // パラメータのパスを取得
    path = args(i);
    // 拡張子を取得
    ext = fso.GetExtensionName(path)
    // 拡張子がmsgファイルなら以下処理を実施する
    if (ext == "msg")
    { 
        // msgファイルを開く
        var msg = oOutlook.CreateItemFromTemplate(path);
        // 受信日時を取得
        datetime1 = msg.ReceivedTime;
        // 受信日時が取得できない場合は開始日時を取得する
        if (datetime1 == undefined)
        {
            datetime1=msg.Start
        }
        // 受信日時を「yyyymmdd_hhmmss_」にする。
        var sReceivedTime = date2yyyymmdd_hhmmss(datetime1) + '_';
        // msgファイル閉じる
        msg.Close(1);    // 1(olDiscard)   ドキュメントに対する変更内容を破棄。
        // フォルダ
        var spath = fso.GetParentFolderName(path);
        // 新ファイル名生成
        var sFileName = sReceivedTime + fso.GetFileName(path);
        // ファイルリネーム実行
        //WScript.echo(path + ' → ' + fso.BuildPath(spath, sFileName));
        fso.MoveFile(path, fso.BuildPath(spath, sFileName));
    }
}

// 日付を受取る。
// yyyymmdd_hhmmss で返す。
function date2yyyymmdd_hhmmss(pDate) {
    var d = new Date(pDate);
    var year = d.getFullYear();  // 年
    var month = ('0' + (d.getMonth() + 1)).slice(-2);  // 後ろの2文字
    var day = ('0' + d.getDate()).slice(-2);
    var hour = ('0' + d.getHours()).slice(-2);
    var minute = ('0' + d.getMinutes()).slice(-2);
    var second = ('0' + d.getSeconds()).slice(-2);
    return year + month + day + '_' + hour + minute + second;
}

【OutlookVBA】選択中のメールをmsgファイル保存

Outlookでよくメールをmsgファイルの保存します。ファイル名先頭には日時を付けてます。
日時はメールの以下の部分から取得しています。

5個くらいまでなら手動でもいいんですが、10個くらいになると「なんか自動化できないかなー」という思いに駆られます。
ということでVBAを作りました。

■動作

出力対象のメールを選択します。
※複数選択可


「選択中のメールをファイル保存」マクロを実行します。

マクロ内で設定しているパスにメールがmsgファイルで保存されます。
ファイル形式は「yyyymmdd_hhmmss_[件名].msg」


■ソース

※使用する場合、定数のOUTPUT_PATHは好みの場所に変更してください。

'**************************************************************
'* モジュール名:
'* 概要:選択中のメールをファイル保存する
'* 備考:
'***************************************************************
Option Explicit

' ファイル保存先
Private Const OUTPUT_PATH = "C:\Users\[user_id]\Desktop"

Private Const REMOVE_STR = "[\\/:*?""'<>|]"   ' パスから除去する文字列
Private fso As FileSystemObject

'**************************************************************
'* 関数名:選択中のメールをファイル保存
'* 概要:選択中のメールをファイル保存する
'* 使い方:
'* パラメータ :(I) なし
'* 戻り値     :なし
'***************************************************************
Public Sub 選択中のメールをファイル保存()
    
    Dim objOL As Outlook.Application
    Dim objOLSelect As Outlook.Selection
    Dim item As MailItem
    Dim i As Long, j As Long, k As Long
    Dim spathsave As String
    Dim filepath As String
      
    Set objOL = New Outlook.Application
    Set objOLSelect = objOL.ActiveExplorer.Selection
    Set fso = New FileSystemObject
    
    ' [ 選択中のメールに対してループ ]
    For k = 1 To objOLSelect.count
        ' メールを取得
        Set item = objOLSelect.item(k)
    
        Debug.Print item.Subject
    
        ' 同じ年月日時分秒で同じ件名のメールがあった場合の対応。末尾に「 (n)」の文字列を付ける
        For j = 0 To 1000
            ' 0:まずは同じ年月日時分秒で同じ件名のメールがない想定
            If j = 0 Then
                ' ファイルパス作成
                filepath = fso.BuildPath(OUTPUT_PATH, Format(item.ReceivedTime, "yyyymmdd_hhmmss") & "_" & RegExpReplace(item.Subject, REMOVE_STR, "") & ".msg")
            Else
                ' 括弧付のファイルパス作成
                filepath = fso.BuildPath(OUTPUT_PATH, Format(item.ReceivedTime, "yyyymmdd_hhmmss") & "_" & RegExpReplace(item.Subject, REMOVE_STR, "") & " (" & j & ").msg")
            End If

            ' ファイルがないなら保存する
            If fso.FileExists(filepath) = False Then
                item.SaveAs filepath
                Exit For    ' j ループ終了
            End If
        
            If j = 1000 Then
                MsgBox "同じ年月日時分秒で同じ件名が1000件!さすがにここには来ないはず"
            End If
        Next j
    Next k
End Sub

'**************************************************************
'* 関数名:RegExpReplace
'* 概要:正規表現置換
'* 使い方:
'* パラメータ :(I)文字列
'*            :(I)正規表現パターン
'*            :(I)置換後文字列
'* 戻り値     :変換後文字列
'***************************************************************
Private Function RegExpReplace(s1 As String, sPattern As String, sReplaceStr As String)
    Dim oRegExp As RegExp
    Set oRegExp = New RegExp
    oRegExp.Pattern = sPattern                      ' 正規表現パターン
    oRegExp.IgnoreCase = False                      ' 大文字小文字を区別
    oRegExp.Global = True                           ' 複数マッチオン
    RegExpReplace = oRegExp.Replace(s1, sReplaceStr)    ' 置換
End Function

Outlookのメールをmsgファイルに一括バックアップVBA

以前からOutlookのフォルダ構成のままにメールをmsgファイルとして一括でバックアップ取りたいと考えてました。やる気出してやってみたら意外とすぐできました。

私はメールの下書きにいろいろメモするのが習慣になっています。
なんせすぐ忘れるのでメモが必須です。メモを見れば思い出せます。

たまにAndroidOutlookで編集すると本文が真っ白になったり画像が消えてしまったりすることもあり、月一くらいで全バックアップを取りたいと考えていました。スマホで編集しなければ変なことにはならないんですがやはりスマホで編集するのは手軽で良いんです。

■動作内容

Outlookで以下のようなフォルダ構成だったとします。

ローカルに以下の様にフォルダを作成し、メールは「年月日_時分秒_件名.msg」で保存します(アンダーバーは半角です)

・「受信トレイ」、「送信済みアイテム」は私の場合はバックアップ不要なので対象外にするフォルダも複数指定できるようにします。

・日時と件名が同じメールがあることもあるのでその場合、2個目以降のファイルには「年月日_時分秒_件名 (2).msg」「年月日_時分秒_件名 (3).msg」...と数字を付けてファイル保存します。

VBAソース

'**************************************************************
'* モジュール名:
'* 概要:メールをmsgファイルに保存
'* 備考:
'***************************************************************
Option Explicit

Private Const OUTPUT_FOLDER = "c:\tmp\"     ' 出力先
Private Const NOT_OUTPUT_FOLDER = "受信トレイ,PersonMetadata,送信済み,送信済みアイテム,連絡先,同期の問題,削除済みアイテム"   '対象外フォルダをカンマ区切りで記載
Private fso As FileSystemObject
Private oNotOutputFolder As Dictionary      ' 対象外フォルダのDictionary
Private Const REMOVE_STR = "[\\/:*?""'<>|]"   ' パスから除去する文字列

'**************************************************************
'* 関数名:Main_MailOutput
'* 概要:メールをmsgファイルに保存
'* 使い方:
'* パラメータ :(I) なし
'* 戻り値     :なし
'***************************************************************
Public Sub Main_MailOutput()
    Dim objOutlook As Outlook.Application
    Dim oNsp As Outlook.NameSpace
    Dim i As Long
    Dim sPath As String
    Dim sNotOutputFolder() As String

    Debug.Print vbCrLf & Now & " " & "処理開始"
    
    Set fso = New FileSystemObject
    Set objOutlook = New Outlook.Application
    Set oNotOutputFolder = New Dictionary
    Dim sMsg1 As String
    Dim sTargetMail As String
    Dim s1 As String
    
    ' 対象外フォルダのDictionary作成
    sNotOutputFolder = Split(NOT_OUTPUT_FOLDER, ",")
    For i = LBound(sNotOutputFolder) To UBound(sNotOutputFolder)
        oNotOutputFolder.Add sNotOutputFolder(i), sNotOutputFolder(i)
    Next i
    
    ' Namespaceオブジェクトを取得
    Set oNsp = objOutlook.GetNamespace("MAPI")
        
    '[ メールボックスへのループ ]
    For i = 1 To oNsp.Folders.count
        Debug.Print oNsp.Folders.item(i).Name     'メールアドレスが取得できる。
        sMsg1 = sMsg1 & i & ":" & oNsp.Folders.item(i).Name & vbCrLf
    Next i
    
    ' 出力対象のメールを選択させる
    s1 = InputBox("出力対象メールの番号を入力してください" & vbCrLf & vbCrLf & sMsg1)
    If s1 = "" Then
        Exit Sub
    End If
    
    ' 出力するメールアドレス
    sTargetMail = oNsp.Folders.item(s1)
        
    '[ メールボックスへのループ ]
    For i = 1 To oNsp.Folders.count
        Debug.Print oNsp.Folders.item(i).Name     'メールアドレスが取得できる。
        
        ' バックアップ処理を実施するメールアドレスの場合
        If oNsp.Folders.item(i).Name = sTargetMail Then
            ' フォルダーパス作成
            sPath = OUTPUT_FOLDER & oNsp.Folders.item(i).Name
            ' フォルダが無いなら作る
            If fso.FolderExists(sPath) = False Then
                fso.CreateFolder sPath
            End If
            ' フォルダ毎にローカルフォルダ作成、メール出力
            Call MakeFolder(oNsp.Folders.item(i).Folders, sPath)
        End If
    Next i

    Debug.Print Now & " " & "処理終了"
    MsgBox "処理完了", vbInformation
End Sub

'**************************************************************
'* 関数名:MakeFolder
'* 概要:
'* 使い方:
'* パラメータ :(I)oFolder フォルダーオブジェクト
'*              (I)sFolder  ローカルフォルダ作成用パス文字列
'* 戻り値     :なし
'***************************************************************
Private Sub MakeFolder(oFolder As Folders, ByVal sFolder As String)

    Dim i As Long
    Dim spath1 As String
    
    Dim sFolder2 As String
    
    '[ 引数フォルダー内のフォルダーに対してループ ]
    For i = 1 To oFolder.count
        Debug.Print oFolder.item(i).FolderPath & "  " & oFolder.item(i).Items.count
        
        ' 対象外フォルダの場合、何もしない
        If oNotOutputFolder.Exists(oFolder.item(i).Name) = True Then
            Debug.Print "出力対象外フォルダ:" & oFolder.item(i).Name
        ElseIf oFolder.item(i).Items.count = 0 Then
            'メール数0件フォルダは出力しない
            Debug.Print "メール0件なので出力対象外:" & oFolder.item(i).Name
        Else
            ' フォルダパス作成
            sFolder2 = sFolder & "\" & RegExpReplace(oFolder.item(i).Name, REMOVE_STR, "")
            ' フォルダが無いなら作る
            If fso.FolderExists(sFolder2) = False Then
                fso.CreateFolder sFolder2
            End If
            
' ' 多すぎるのは省くTODO
'If oFolder.item(i).Items.count < 50 Then   ' todo
            Call MailOutput(oFolder.item(i), sFolder2)
'End If                                      ' todo
            
            'サブフォルダがある場合さらに再帰実行
            If oFolder.item(i).Folders.count > 0 Then
                Call MakeFolder(oFolder.item(i).Folders, sFolder2)
            End If
        End If
    Next i
End Sub

'**************************************************************
'* 関数名:MailOutput
'* 概要:
'* 使い方:
'* パラメータ :(I)oFolder   フォルダーオブジェクト
'*              (I)sPathSave  ファイル保存先
'* 戻り値     :なし
'***************************************************************
Private Sub MailOutput(oFolder As Folder, ByVal sPathSave As String)
    Dim i As Long, j As Long
    Dim item As MailItem
    Dim filepath As String
    
    '[ 出力対象フォルダー内のメールに対してループ ]
    For i = 1 To oFolder.Items.count
        ' メールの場合のみファイル保存
        If oFolder.Items(i).Class = olMail Then
            ' メールを取得
            Set item = oFolder.Items(i)
            
            ' 同じ年月日時分秒で同じ件名のメールがあった場合の対応
            For j = 0 To 1000
                ' 0:まずは同じ年月日時分秒で同じ件名のメールがない想定
                If j = 0 Then
                    ' ファイルパス作成
                    filepath = sPathSave & "\" & Format(item.ReceivedTime, "yyyymmdd_hhmmss") & "_" & RegExpReplace(item.Subject, REMOVE_STR, "") & ".msg"
                Else
                    ' 括弧付のファイルパス作成
                    filepath = sPathSave & "\" & Format(item.ReceivedTime, "yyyymmdd_hhmmss") & "_" & RegExpReplace(item.Subject, REMOVE_STR, "") & " (" & j & ").msg"
                End If

                ' ファイルがないなら保存する
                If fso.FileExists(filepath) = False Then
                    item.SaveAs filepath
                    Exit For    ' j ループ終了
                End If
            
                If j = 1000 Then
                    MsgBox "同じ年月日時分秒で同じ件名が1000件!ここには来ないはず"
                End If
            Next j
        End If
    Next i
End Sub

'**************************************************************
'* 関数名:RegExpReplace
'* 概要:正規表現置換
'* 使い方:
'* パラメータ :(I)文字列
'*            :(I)正規表現パターン
'*            :(I)置換後文字列
'* 戻り値     :変換後文字列
'***************************************************************
Private Function RegExpReplace(s1 As String, sPattern As String, sReplaceStr As String)
    Dim oRegExp As RegExp
    Set oRegExp = New RegExp
    oRegExp.Pattern = sPattern                      ' 正規表現パターン
    oRegExp.IgnoreCase = False                      ' 大文字小文字を区別
    oRegExp.Global = True                           ' 複数マッチオン
    RegExpReplace = oRegExp.Replace(s1, sReplaceStr)    ' 置換
End Function

■実行方法

①ソースをOutlookVBAのModule1とかに貼り付けて保存します。
VBAの参照設定で以下はチェックが必要です
 ・Microsoft Scripting Runtime
 ・Microsoft VBScript Regular Expression 5.5
 
③定数OUTPUT_FOLDERの出力先は自分の環境に合わせて変更します。
④定数NOT_OUTPUT_FOLDERで出力対象外のフォルダをカンマ区切りで指定します。
⑤マクロのMain_MailOutputを実行します。
⑥インプットボックスでバックアップ対象のメールの番号を入力します。

⑦完了まで待ちます。メール数によりますが大量にあると時間かかります。

「受信トレイ」、「送信済みアイテム」を入れるとバックアップサイズが1GBを超えたりします。
まずはちょっと試したいという人は117~120行目あたりのコメントアウトされている部分をアンコメントして実行してみてください。アイテムが多いフォルダの場合はフォルダのみ作られてバックアップ処理は実施されません。
再帰連想配列正規表現も出てきて結構テクニカルで楽しいプログラムになりました。
役に立ったらコメントでもいただけると喜びます。