yuin #1123(2007/07/19 15:22 GMT) [ Scala ] Rating0/0=0.00
うーむ。表示目的と送信目的では結構ちがいますね。 というわけで、お題どおりに出力するものと、お題の意図どおりにメール送信できるものを作ってみました。
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"))
Rating0/0=0.00-0+
[ reply ]
yuin
#1123()
[
Scala
]
Rating0/0=0.00
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"))Rating0/0=0.00-0+
[ reply ]