ラベル プログラミング の投稿を表示しています。 すべての投稿を表示
ラベル プログラミング の投稿を表示しています。 すべての投稿を表示

2020年9月18日金曜日

SESで添付付きのHTMLメールを送る

この情報は2020年9月時点の情報です。
先日、お仕事でAWS SESを利用して、動画を添付したHTMLメールを送るというのをやったのですが。
結局ボツになりまして。
もったいないので、ここに概要を貼り付けておこうかと。

ちゃんと動くかどうかは保証しません。なんかあっても私を責めないでください。
HTMLメールはファイルとして用意して、readTemplate()でstringとして読み込むようになっています。
動画はS3からmp4をダウンロードして、base64エンコードします。

タイトルが日本語だとbase64エンコードしないとダメだったりと、いろいろ面倒な感じになっていますが。
    try {
      // HTMLメール本文
      const templateStr = await this.readTemplate()
      const encodedTemplate = Buffer.from(templateStr).toString('base64')
     
      // 動画部分
      const encodedStr = <ここはS3からmp4をダウンロードし、base64エンコードする>


      const fromEmail = 'noreply@hogehoge.jp'

      // Subject
      const subject = '動画のお届けものです'
      const encodedSubject = Buffer.from(subject).toString('base64')

      const boundary = `----=_Part${ Math.random().toString().substr( 2 ) }`


      const rawMessage = [
        `From: "${ fromEmail }" <${ fromEmail }>`,
        `To: ${ address }`,
        `Subject: =?utf-8?B?${ encodedSubject }?=`,
        'MIME-Version: 1.0',
        `Content-Type: multipart/mixed; boundary="${ boundary }"`,
        '\n',
        `--${ boundary }`,
        'Content-Type: text/html; charset=UTF-8',
        'Content-Transfer-Encoding: base64',
        '\n',
        encodedTemplate,
        `--${ boundary }`,
        'Content-Type: video/mp4; name="movie.mp4"',
        'Content-Transfer-Encoding: base64',
        'Content-Disposition: attachement; filename="movie.mp4"',
        '\n',
        encodedStr,
        '\n',
        `--${ boundary }--`
      ]

      const rawParams: SendRawEmailRequest = {
        Source: 'noreply@hogehoge.jp',
        Destinations: [address],
        RawMessage: {
          Data: rawMessage.join('\n')
        },
      }

      AWS.config.update({region: <ここはregionを指定>})
      const ses = new AWS.SES()
      const sendPromise = ses.sendRawEmail(rawParams).promise()
      return new Promise((resolve, reject) => {
        sendPromise
          .then((data) => {
            console.log('send success: ', data.MessageId)
            resolve(true)
          })
          .catch((err) => {
            console.log('send error: ', err)
            reject(err)
          })
      })
    } catch(error) {
      console.log(`sendEmail error(to: ${address}): `, error)
      throw error
    }

2015年4月8日水曜日

rbenv-gemsetsを使う。

$ rbenv exec gem uninstall bundler
$ rbenv exec gem list

$ rbenv versions
$ rbenv gemset create 2.2.1 basic
$ mkdir -p ~/Study/Rails1
$ cd ~/Study/Rails1

$ echo basic >.rbenv-gemsets
$ rbenv gemset active
basic
$ rbenv exec gem install bundler
$ rbenv exec gem which bundler
$ gem list
$ cd ..
$ gem list

rbenv-gemsetsはAnsibleでインストール。
Bundlerをアンインストールして、全部gemsetで管理するように切り替えた。
gemsetはRubyのバージョンごとに作るので、まずrbenv versionsでバージョン確認。とりあえずbasicとしておいた。

作業用ディレクトリに移動してそこで有効にするgemsetを記述した.rbenv-gemsetsファイルを作る。rbenv gemset activeで確認すると、なぜかbasic以外にもglobalと表示される。gem envを確認してもglobalというgemsetがあるかのようにGEM PATHSに表示されるけど、実際には該当ディレクトリがない。謎。
深く考えずにbundlerをインストールすると、ちゃんとGEM PATHSのbasicの下にインストールされるし、他のディレクトリに移動してgem listを見るとbundlerは表示されない。

あとは、gemをインストールするときにちゃんと該当ディレクトリで.rbenv-gemsetsファイルを記述するようにすればきっときれいな状態になる...はず。

Bundlerもgemsetsで管理するならrbenv-default-gemsの設定は確認する必要あり。
つづけてRailsアプリを作るなら
$ cd ~/Study/Rails1
$ rbenv exec gem install rails
$ rbenv exec rails new myapp
$ cd myapp
$ rails server
みたいな感じかと。

2013年10月23日水曜日

janssonのインストール

jsonのパースをやりたい。自力で頑張りたくないということで、jansson。
今回はjansson 2.5を使用。

ダウンロードして解答して、移動したら
# ./configure
# make
# make test
# make install
するだけ(インストール先によってはroot権限が必要)。

今回はひたすらデフォルト設定なので /usr/local/includeのしたにヘッダファイル、/usr/local/libのしたにライブラリができた。
 Arm v5でもconfigureのパラメータ設定でちゃんと使えた。

2013年6月22日土曜日

CからMySQLに接続する(環境設定)

1. mysqlインストール状態の確認
$ dpkg -l | grep -i mysql
2. mysql-serverインストール
$ sudo aptitude install mysql-server-5.0
3. libmysqlclient-develインストール
$ sudo aptitude install libmysqlclient-dev
 
クロスコンパイル環境では、ライブラリもそれ用のを入れるので
1. xaptをインストールする
$ sudo apt-get install dpkg-cross
$ wget http://ftp.debian.org/debian/pool/main/e/emdebian-crush/xapt_2.2.20_all.deb
$ sudo dpkg -i xapt_2.2.20_all.deb
2.ちょっと/etc/xpat.d/debian.confを書き換える
suite= squeeze
checknewer=true
この2行以外は元のまま。
3. libmysqlclient-devインストール
$ sudo xapt -a armel -m libmysqlclient-dev
CFLAGS, LDFLAGSともにクロスコンパイル環境の場合は/usr/arm-linux-gnueabiの下になるので注意する。

2011年10月28日金曜日

階乗のプログラム

Lipsで書くと、こんな感じ。
(defun fact (n)
    (if (zerop n)
        1
       (* n (fact (- n 1)))))
カッコの数があっているのか心配になる。

Prologで書くとこんな感じ。
fact(0, 1).
fact(N, X) :- N1 is N - 1,  fact(N1, X1), X is X1 * N.
分かりやすい。ステキ☆

Haskellで書いてみる。
fact :: Integer -> Integer
fact 0 = 1
fact n = n * fact(n - 1)
やっぱりこのあたりはHaskellが一番きれいかも。分かりやすいし。

Javaで書いてみる。
class Fuctorial {
  static int fact(int x) {
      if ( x == 0 )
          return 1;

     return x * fact(x-1);
  }
}
この程度のことでも色々書かなくちゃ行けない辺りが面倒。

2011年1月24日月曜日

xmlTextReaderReadでコケた

日本語を含んだXMLの場合は特に、なのかもしれないが。
xmlTextReaderRead()を読んでいると、エラーが発生して途中で終わってしまうことがある。

戻り値が1なら成功、0なら終わり、それ以外はエラー発生でちゃんと処理することが大切。
うっかり忘れていて、ハマった...

日本語の文字列(文字数制限付き)をXMLに書き出す時に、文字の途中でぶっちぎれてしまったのが原因のようす。書き出す時は良いけど、そのデータを読み出す時に「エンコーディングエラー」と言われた。エンコーディングエラーというよりは、日本語文字列が途中で化けているのが原因だった。

C言語で日本語を含む文字列の操作は難しい....文字列処理関数が、基本的に「バイト」単位だからなぁ。英数字と日本語が混在している場合で「120文字以下に切り詰める」ってどうやれば良いんだろう?

2010年12月6日月曜日

RSSのパース

libxml2でRSSのパース。

xmlデータがchar*に入っている場合は、xmlReaderForDocを使う。
xmlReaderForMemoryを使っていて、ずっとハマった(何故か冒頭の"xml version..."のところでコケる)

2010年4月17日土曜日

C++で気になったので(仮想関数)

そういえば、階層の途中で仮想関数にしたら、どうなるんだろう?
ということで、ふと試してみた。

class A {
void func() { cout << "call A" << endl;}
};

class B : public A {
virtual void func() { cout << "call B" << endl; }
};

class C : public B {
void func() { cout << "call C" << endl; }
};

int main() {
Parent* p = new C();
p->func();
Child* c-> new C();
c->func();
}

call A
call C

そこから仮想関数って感じなのか。C#ではどうなんだろう。今度試さねば。

そういえば、とあるC#のテキストではoverrideでのオーバーライドは載っているのに、newでの基底クラスの関数の上書き?打ち消し?は載っていなかった。あんまり使わないんだろうか、new?

Remember the Milkを使い始める。Evernoteにtodoが入っていると分かりにくいので、Remember the Milkに移動。GmailのToDoは結局使わなかったな。便利そうに見えたんだけど。