差し込みメール生成マクロv1.03 添付ファNo.00580
spmx さん 21/05/20 15:18
 
差し込みメール生成マクロv1.03を使っております
添付ファイルを差し込んでメールを作成する際エラーが出ます

「ファイルのコピーに失敗しました
ファイル名=c:\........xxx@yyy<<カラム4>>
エラーコード=123」

メールは正常に作成できているようですが 毎行止まります

AddAttachにファイル名を引き渡したあとのエラーのようです
csvに記載するファイル名もいくつか試したのですが現象が変わりません
c:\tmp\temp.xlsx
c:\\tmp\\temp.xlsx
"c:\tmp\temp.xlsx"
"c:\\tmp\\temp.xlsx"

どうすればエラーを止められますか?



[ ]
RE:00580 差し込みメール生成マクロv1.03No.00581
秀まるお さん 21/05/20 17:18
 
 そのマクロを使って各宛先毎に別々の添付ファイルを添付したいということだとし
たら、それは現状出来ないような気がします。

 csvファイルに、例えば

   "hoge1@hogehoge.com",c:\temp\temp1.xlsx
   "hoge2@hogehoge.com",c:\temp\temp2.xlsx

 みたいに指定したとしても、

    <<カラム2>>

 をどこに指定しても、それを添付ファイルとして入れてやることは出来ないような
気がしますが、現状どのように指定されてるのやら?。

 しいて、そういう使い方も可能なようにマクロを直すってことなら対応は可能だと
思いますけども・・・

 とりあえず現状どのように

    <<カラム1>>

 とかを指定されてるのか教えてほしいです。

[ ]
RE:00581 差し込みメール生成マクロv1.03No.00582
秀まるお さん 21/05/20 17:29
 
 今やってみたんですが、ヘッダの中に無理矢理

X-Attach: <<カラム2>>

 のようにしてマクロ実行したら、一応うまくメールが生成されるようでした。

X-Attach: e:\temp\temp.xlsx

 みたいなヘッダが生成されてくれるようではあります。が、連絡いただいた通り、
1通毎にエラーが出てしまいます。

 ちょっと無理矢理な感じではありますが、こういう記述をしてもうまく動くように
直してみます。

[ ]
RE:00582 差し込みメール生成マクロv1.03No.00583
spmx さん 21/05/20 17:53
 
> 今やってみたんですが、ヘッダの中に無理矢理
> ......
> ちょっと無理矢理な感じではありますが、こういう記述をしてもうまく動くよう
>に直してみます。


秀まるおさん
> ちょっと無理矢理な感じではありますが、こういう記述をしてもうまく動くよう
>に直してみます。
ありがとうございます

Version 1.03での修正点: HTMLメールでもうまく動くようにした。添付ファイルに
も対応した。
の添付ファイルの対応とは このような使い方(X-Attach: <<カラム2>>)だと思って
おりました。
これが使えると非常に助かります。
よろしくお願いいたします

[ ]
RE:00583 差し込みメール生成マクロv1.03No.00584
秀まるお さん 21/05/20 18:43
 
 以下のような内容になりました。いろいろテストしたので大丈夫だと思いますが、
テストよろしくお願いします。コピペして実行してみてほしいです。

----------------------------------------------------------------------------
// 差し込みメール生成.mac
//
// version 1.01
//
// version 1.00 = 2013.12.20 by 秀まるお, 有限会社サイト−企画
// version 1.01 = 2016.06.16 「あとで送信」でエラーになった場合対応。
//                hidesoft.8:00038| 差し込みメール生成マクロ誤動作?
// version 1.02 = 2018.01.18 カラム10以上がうまく変換されないバグ修正。
//                turukame.5:00548| 差し込みメール生成マクロでカラムが10以上
ある場合に「>」が残
// version 1.03 = 2020.08.03
//                HTMLメール対応。HTML形式の場合は"&lt;&lt;カラム1&gt;&gt;"
のような形でも文字列検索する。
//                画像入りHTMLメールにも対応。
//                添付ファイルにも対応。
// version 1.04 = 2021.05.20
//                turukame.5:00580| 差し込みメール生成マクロv1.03 添付ファイル
//                X-Attach: <<カラム2>> のように記述して1通毎に別々の添付フ
ァイルを添付できるようにする。
//
// このマクロは、CSV形式ファイルからメールアドレスその他の情報を取得して、そ
れを元にメールを作成する
// マクロです。
// 差し込み印刷のメール版になります。
//
// このマクロの改造は自由です。
// このマクロを参考にして何か別のマクロを作成されてもまったく問題ないです。
許可を取っていただく必要も
// 無いし、copyright表示などもしなくていいです。
//
//
//
//
    setcompatiblemode 0x20000;      //検索文字列を自動で元に戻す。
    loaddll "tkinfo.dll";
    if( dllfunc("IsHidemaruMailMain") || dllfunc("IsHidemaruMailGrep") ) {
        message "このマクロは「新規メール」で作成したエディタ・ウィンドウ上
で実行してください。(続けてヘルプを表示します)";
        call Sub_Help;
        endmacro;
    }
    if( ! dllfunc("IsFunctionExist", "tkinfo.dll", "CSV_LoadFile") ) {
        message "秀丸メールのバージョンが古いのでこのマクロは使えません。\n\
n秀丸メールのバージョンは、6.19β15以上でないとダメです。";
        endmacro;
    }

    //HTMLメールかどうか調べる。
    #htmlMode = 0;
    $contenttype = dllfuncstr("CurrentHeader","Content-Type");
    if( strstr( dllfuncstr("ToLower", $contenttype), "text/html" ) >= 0 ) {
        #htmlMode = 1;
    }
    //HTML編集アドインが動作中かどうか調べる。
    #htmlEdit = 0;
    if( #htmlMode && dllfunc("IsHtmlMailViewerVisible") ) {
        #htmlEdit = 1;
        #n = dllfunc("HtmlEdit", "offonly");
    }

    //2021.05.20 X-Attach: <<カラムn>>指定対応。
    #attachcount = dllfunc("CountCurrentHeader", "X-Attach");
    #csvattachcount = 0;        //カラム指定したX-Attach:ヘッダの数
    #preattachcount = 0;        //元々の添付ファイルの数
    if( #attachcount != 0 ) {
        ##i = 0;
        while( ##i < #attachcount ) {
            $$attach = dllfuncstr("CurrentHeader2", "X-Attach", ##i);
            if( leftstr( $$attach, 2 ) == "<<" ) {
                //X-Attach: <<カラムn>>指定の場合
                $csvattach[#csvattachcount] = $$attach;
                #csvattachcount = #csvattachcount + 1;
            } else {
                $preattach[#preattachcount] = dllfuncstr("HomeDir") + dllfun
cstr("CurrentAccount") + "\\" + $$attach;
                #preattachcount = #preattachcount + 1;
            }
            ##i = ##i + 1;
        }
    }
Label_Restart: ;
    menu "差し込みメールの生成の実行!(CSVファイルの選択...)",
        "\x01",
        "ヘルプ",
        "サンプルメールの作成";
    if( result == 0 ) {
        endmacro;
    } else if( result == 3 ) {
        //ヘルプ
        call Sub_Help;
        goto Label_Restart;
    } else if( result == 4 ) {
        //サンプルメール作成
        #n = dllfunc("NewMail");
        #n = dllfunc("SetHeader", "To", "<<カラム1>>");
        #n = dllfunc("SetHeader", "Subject", "案内メールサンプル");
        gofiletop;
        beginsel;
        gofileend;
        delete;
        insertfix "差し込みメールのサンプルです。\n\n <<カラム2>> 様へ\n\n
 ご案内…\n\n添付ファイルをCSVファイルから指定したい場合は、ヘッダと本文の
区切りの空行にに無理矢理「X-Attach: <<カラムn>>」のように記述してください。\n";
        searchdown "<<カラム[0-9]+>>", regular, nocasesense, hilight;
        gofiletop;
        endmacro;
    }
    setcompatiblemode 0x0200;
    #columnusemax = 0;
    #ytop = screentopy;
    disabledraw;
    #x = x; #y = y;
    moveto 0, -9999;
    while(1) {
        if( #htmlMode ) {
            searchdown "(<<|&lt;&lt;)カラム([0-9]+)(>>|&gt;&gt;)(?\\2)", reg
ular;
        } else {
            searchdown "<<カラム([0-9]+)>>(?\\1)", regular;
        }
        if( !result ) {
            break;
        }
        #columnuse = val( gettext( seltopx, seltopy, selendx, selendy ) );
        if( #columnuse == 0 ) {
            moveto #x, #y;
            enabledraw #ytop;
            message "カラム番号0が指定されていますが、カラム番号は1以上を指
定する必要があります。(一番左のカラムが1となります)";
            endmacro;
        }
        if( #columnuse > #columnusemax ) {
            #columnusemax = #columnuse;
        }
    }
    moveto 0, -9999;
    searchdown "^To:.*<<カラム([0-9]+)>>", regular, nocasesense;
    if( !result) {
        moveto #x, #y;
        enabledraw #ytop;
        message "To:ヘッダの中には、<<カラムn>>が必ず入ってないといけないで
す。(nはカラム番号、1〜)";
        endmacro;
    }
    moveto #x, #y;
    enabledraw #ytop;
    if( #columnusemax <= 0 ) {
        message "現在のメールにはCSV形式ファイルから差し込みする用の「<<カラ
ムn>>」のような部分が存在しないです。(nは番号, 1〜)\n\nヘルプを表示します。";
        call Sub_Help;
        endmacro;
    }
    moveto 0, -9999;
    #xsel = x; #ysel = y;
    beginsel;
    gofileend;
    $template = gettext( #xsel, #ysel, x, y );
    $filename = dllfuncstr("Bypass_GetOpenFileName", "差し込み用CSVファイル
の指定", "*.csv");
    if( $filename == "" ) {
        endmacro;
    }
    #n = dllfunc("CSV_LoadFile", $filename );
    if( #n == 0 ) {
        #error = dllfunc("Bypass_GetLastError");
        message "CSVファイルの読み込みに失敗したか、または中身が空っぽです。
\n\n" +
                "ファイル名 = " + $filename + "\n" +
                "エラーコード = " + str(#error) + "\n" +
                "ファイルサイズ = " + dllfunc("Bypass_GetFileSize", $filenam
e );
        endmacro;
    }
    #line = dllfunc("CSV_GetLineCount");
    if( #line >= 1000 ) {
        question "指定されたCSVファイルには " + str(#line) + " 行のデータが
含まれています。大量のメールを送信すると、特定電子メール法に違反する恐れがあ
ったり、プロバイダーさんの方でメール発信が規制されたり、メールアカウントが停
止させられたりする恐れがあります。\n\n" +
        "その点十分注意が必要です。\n\n" +
        "かまわずに続行しますか?";
        if( result != yes ) {
            endmacro;
        }
    }
    #columnmax = dllfunc("CSV_GetMaxColumnCount");
    if( #columnusemax > #columnmax ) {
        question "メールの中で使われてるカラム番号が、実際のCSVファイルの中
に存在するカラム数を超えています。かまわずに続行しますか?\n\n" +
            "メールの中で使われてるカラム番号の最大 = " + str(#columnusemax)
 + "\n" +
            "CSVファイル中のカラム番号の最大 = " + str(#columnmax);
        if( result != yes ) {
            endmacro;
        }
    }
    #templatehandle = hidemaruhandle(0);
    #mailcount = 0;
    while(1) {
        #n = dllfunc("NewMail");
        if( $contenttype != "" ) {
            #n = dllfunc("SetHeader", "Content-Type", $contenttype);
        }
        //disabledraw;
        moveto 0, -9999;
        beginsel;
        gofileend;
        delete;
        insertfix $template;
        //2021.05.20 X-Attach: <<カラムn>>指定対応。
        if( #preattachcount != 0 || #csvattachcount != 0 ) {
            //既存のX-Atach:ヘッダを削除する
            moveto 0, -9999;
            while(1) {
                searchdown2 "^X-Attach:", regular, nocasesense;
                if( !result ) {
                    break;
                }
                if( y >= 0 ) {
                    break;
                }
                golinetop2;
                moveto 0, y;
                beginsel;
                golineend2;
                right;
                delete;
            }
            moveto 0, -9999;
        }


        #n = dllfunc("SetHeader", "X-Mailer", "SashikomiMacro V1.03 (on Hide
maruMail)");
        #n = dllfunc("SetHeader", "Precedence", "bulk");

        //2021.05.20 X-Attach: <<カラムn>>指定対応。
        if( #preattachcount != 0 ) {
            ##i = 0;
            while( ##i < #preattachcount ) {
                #n = dllfunc("AddAttach", $preattach[##i] );
                ##i = ##i + 1;
            }
        }
        if( #csvattachcount != 0 ) {
            ##i = 0;
            while( ##i < #csvattachcount ) {
                $$column = midstr( $csvattach[##i], 8 );
                ##tail = strstr( $$column, ">>" );
                if( ##tail > 0 ) {
                    $$column = leftstr( $$column, ##tail );
                }
                #columnnum = val($$column);
                if( #columnnum >= 1 ) {
                    #columnnum = #columnnum - 1;
                    $text = dllfuncstr("CSV_GetColumnText", #columnnum);
                    #n = dllfunc("AddAttach", $text );
                }
                ##i = ##i + 1;
            }
        }

        while(1) {
            if( #htmlMode ) {
                searchdown2 "(<<|&lt;&lt;)カラム([0-9]+)(>>|&gt;&gt;)(?\\2)",
 regular;
            } else {
                searchdown2 "<<カラム([0-9]+)>>(?\\1)", regular;
            }
            if( !result ) {
                break;
            }
            #columnnum = val( gettext( seltopx, seltopy, selendx, selendy ) );
            #columnnum = #columnnum - 1;
            if( selecting ) {
                escape;
            }
            //2021.05.20 X-Attach:ヘッダの中は無視する
            if( dllfuncstr("ToLower", gettext( 0, y, 9, y ) ) == "x-attach:"
 ) {
                golineend2;
                continue;
            }
            if( #htmlMode ) {
                searchup "(<<|&lt;&lt;)カラム([0-9]+)(>>|&gt;&gt;)", regular;
            } else {
                searchup "<<カラム([0-9]+)>>", regular;
            }
            if( !result ) {
                message "おかしい???";
                break;      //おかしい
            }
            delete;
            $text = dllfuncstr("CSV_GetColumnText", #columnnum);
            if( #htmlMode != 0 && lineno > 0 ) {
                $text = dllfuncstr("PlainTextToHtml", $text);       //HTML
メール対応。
            }
            insert $text;
        }
        #n = dllfunc("SendLater");
        if( #n != 0 ) {
            #mailcount = #mailcount + 1;
        } else {
            question "「あとで送信」に失敗しました。マクロを中断しますか?";
            if( result == yes ) {
                break;
            }
        }
        #handle = hidemaruhandle(0);
        setactivehidemaru #templatehandle;
        closehidemaruforced #handle;
        #n = dllfunc("CSV_SkipOneLine");
        if( #n == 0 ) {
            break;
        }
    }
    message str(#mailcount) + " 通のメールを未送信フォルダに生成しました。";
    if( #htmlEdit ) {
        #n = dllfunc("HtmlEdit");
    }
    endmacro;







    endmacro;

Sub_Help:
    message "「差し込みメール生成」マクロのヘルプ:\n\n" +
            "このマクロは、一般的な文書作成ソフトにある差し込み印刷のような
感じでメールを生成する用のマクロです。差し込ませる用のメールとCSVファイルか
ら,CSVファイルの行数分のメールを簡単に生成させることが出来ます。\n\n" +
            "マクロを実行するためには、まずは差し込ませる用のCSVファイルを作
成し、テンプレート用となるメールを「新規メール」コマンドで作成し、そのメール
上でマクロを実行する形になります。\n\n" +
            "メールの作成方法:\n" +
            " メールの中に、\"<<カラム1>>\"のような形で差し込み用CSVファイ
ルの列の番号を指定すると、その位置に、CSVファイルの指定されたカラムの内容が
挿入されます。例えばTo:ヘッダに1列目の内容を入れたい場合は、To:ヘッダの所に
\"<<カラム1>>\"を入れておけばいいです。\n\n" +
            "カラムの番号は、一番左の列が<<カラム1>>で、次が<<カラム2>>、の
ようになります。\n\n" +
            "そのような形式でメールを作成して、あとはマクロを実行してCSVファ
イルのファイル名を指定すれば、差し込まれたメールが未送信フォルダに生成されま
す。\n\n" +
            "テンプレート用のメールの例:\n" +
            "From: xxxx\n" +
            "To:   <<カラム1>>\n" +
            "Subject: ご案内\n" +
            "\n" +
            " <<カラム2>>さんこんにちは\n" +
            "\n\n" +
            "(上記例だと、CSVファイルの1カラム目にメールアドレス、2カラム
目に相手の名前が入ってる)\n\n" +
            " テンプレート用として作成したメールの内容を取っておきたい時は、
草稿フォルダに保存しておくか、または「ファイル・テンプレートとして保存」でテ
ンプレートとして保存しておくのがお勧めです。";
    message "注意:\n\n" +
            "このマクロを使うと大量のメールを簡単に作成できてしまうのですが、
大量のメールを送信すると、「特定電子メール法」に違反する恐れが出てきます。法
に触れるような行為が無かったとしても、いわゆる迷惑メールを大量に発信してると
勘違いされて、以後、ご自身のパソコンからのメールの発信が規制されたり、メール
アカウントが停止させられたりする恐れがあります。\n\n" +
            "特に無料のメールアカウントから大量のメールを発信すると、メール
アカウントが無効化されてしまって使えなくなる恐れがあります。\n\n" +
            "その点ご注意ください。";
    return;

[ ]
RE:00584 差し込みメール生成マクロv1.03No.00585
spmx さん 21/05/21 10:49
 
秀まるおさん

テストしました
問題なく動作することを確認いたしました
速い対応ありがとうございます。
感激いたしました


> 以下のような内容になりました。いろいろテストしたので大丈夫だと思いますが、
>テストよろしくお願いします。コピペして実行してみてほしいです。
> ......
>    return;

[ ]
RE:00585 差し込みメール生成マクロv1.03No.00586
秀まるお さん 21/05/21 11:50
 
 確認ありがとうございます。ライブラリの方もぼちぼち更新させていただきます。

[ ]