Comment detail

日本語メールのエンコード (Nested Flatten)
うーむ。表示目的と送信目的では結構ちがいますね。

というわけで、お題どおりに出力するものと、お題の意図どおりにメール送信できるものを作ってみました。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.util.Date
import java.util.Locale
import sun.misc.BASE64Encoder
import java.text.SimpleDateFormat
import scala.io._
import scala.collection.mutable.HashMap
import scala.collection.mutable.Map
import org.apache.commons.mail._

class ExtendedString(self:String) {
  import java.util.regex._
  import java.io._
  def gsub(reg:String)(f:(Matcher)=>String) = {
    val result = new StringBuffer
    val m = Pattern.compile(reg).matcher(self)
    while(m.find) m.appendReplacement(result, f(m))
    m.appendTail(result)
    result.toString
  }
}
implicit def string2ext(self:String) = new ExtendedString(self)

def readFile(f:String) = Source.fromFile(f).getLines.mkString("")

def parseData(f:String):Map[String,String] = {
  val text = readFile(f)
  text.split("\n").foldLeft(new HashMap[String,String]){(result, line) => {
    line.trim.gsub("([a-z]+)[\\s]+=>[\\s]+'(.*)',"){m => 
      result += m.group(1) -> m.group(2);""
    }
    result
  }}
}

def print_email(template:String, data:Map[String, String]):unit = {
  val textlines = template.trim.gsub("(\\[\\[([^\\]]+)\\]\\])"){m => data(m.group(2)) }.split("\n")
  def findLine(s:String) = textlines.find(x=>x.startsWith(s)).get
  def getHeader(s:String) = findLine(s+": ").split(":")(1).trim
  println("From: "+getHeader("From"))
  println("To: "+getHeader("To"))
  println("Subject: =?ISO-2022-JP?B?"+
    new BASE64Encoder().encode(getHeader("Subject").getBytes("iso-2022-jp"))+"?=")
  println("Date: " + 
    new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH).format(new Date))
  printf("""Message-ID: <{0}.{1}@example.org>
MIME-Version: 1.0
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit
""", textlines.hashCode.toString, (new Date).hashCode.abs.toString)
  println(textlines.dropWhile(x=>x!="").mkString("\n"))
}

def send_mail(template:String, data:Map[String,String]):unit = {
  val textlines = template.trim.gsub("(\\[\\[([^\\]]+)\\]\\])"){m => data(m.group(2)) }.split("\n")
  def findLine(s:String) = textlines.find(x=>x.startsWith(s)).get
  def getHeader(s:String) = findLine(s+": ").split(":")(1).trim
  val email = new SimpleEmail
  email.setHostName("smtp.example.org")
  email.setCharset("iso-2022-jp")
  email.addHeader("MIME-Version", "1.0")
  email.addHeader("Content-Transfer-Encoding", "7bit")
  email.addTo(getHeader("To"))
  email.setFrom(getHeader("From"))
  email.setSubject(getHeader("Subject"))
  email.setSentDate(new Date)
  email.setContent(textlines.dropWhile(x=>x!="").mkString("\n"), "text/plain; charset=iso-2022-jp")
  email.send
}

print_email(readFile("mail_template.txt"), parseData("data.txt"))
send_mail(readFile("mail_template.txt"), parseData("data.txt"))

Index

Feed

Other

Link

Pathtraq

loading...