web/scalajs

scalatags 를 이용해 Email 로 전송할 Html 생성하기

wefree 2021. 11. 14. 20:50

문제

Email 로 전송할 Html String 을 생성하려고 한다.

scalatags 를 이용해 typesafe 한 아래 모양의 Html 을 만들어 보자

 

코드

build.sbt 에 아래 라이브러리를 추가한다.

 libraryDependencies ++= Seq(
   "com.lihaoyi" %% "scalatags" % "0.9.4"
 )

 

Html 을 생성하는 코드를 아래와 같이 작성한다.

import scalatags.Text
import scalatags.Text.all._

object EmailHtml {
  case class Item(no: Int, engine: String, url: String)

  def main(args: Array[String]): Unit = {
    val items: Seq[Item] = List(
      Item(1, "naver", "http://www.naver.com"),
      Item(2, "google", "http://www.google.com")
    )

    val TH: Text.TypedTag[String] = th(border := "1px solid black", padding := "10px")
    val TD: Text.TypedTag[String] = td(border := "1px solid black", padding := "10px")

    val headerRow: Text.TypedTag[String] = tr(
      TH("순서"),
      TH("검색엔진"),
      TH("LINK")
    )

    val contentRows: Seq[Text.TypedTag[String]] = items.map { item =>
      tr(
        TD(item.no),
        TD(item.engine),
        TD(a(href := item.url, target := "_blank")(p(item.url)))
      )
    }

    val rows: Seq[Text.TypedTag[String]] = headerRow +: contentRows

    val message: Text.TypedTag[String] = html(
      body(
        table(
          width := "100%",
          border := "1px solid black",
          borderCollapse := "collapse"
        )(rows),
        footer(
          p("문의: https://github.com/windbird123")
        )
      )
    )

    println(message.render)
  }
}

 

생성된 Html

<html>
   <body>
      <table style="width: 100%; border: 1px solid black; border-collapse: collapse;">
         <tr>
            <th style="border: 1px solid black; padding: 10px;">순서</th>
            <th style="border: 1px solid black; padding: 10px;">검색엔진</th>
            <th style="border: 1px solid black; padding: 10px;">LINK</th>
         </tr>
         <tr>
            <td style="border: 1px solid black; padding: 10px;">1</td>
            <td style="border: 1px solid black; padding: 10px;">naver</td>
            <td style="border: 1px solid black; padding: 10px;">
               <a href="http://www.naver.com" target="_blank">
                  <p>http://www.naver.com</p>
               </a>
            </td>
         </tr>
         <tr>
            <td style="border: 1px solid black; padding: 10px;">2</td>
            <td style="border: 1px solid black; padding: 10px;">google</td>
            <td style="border: 1px solid black; padding: 10px;">
               <a href="http://www.google.com" target="_blank">
                  <p>http://www.google.com</p>
               </a>
            </td>
         </tr>
      </table>
      <footer>
         <p>문의: https://github.com/windbird123</p>
      </footer>
   </body>
</html>