scala/mail-parser/mail-parser.sc
author Tomas Zeman <tzeman@volny.cz>
Thu, 03 May 2018 11:54:46 +0200
changeset 53 09b1d3c0aa20
permissions -rwxr-xr-x
scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
53
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     1
#!/usr/bin/env amm
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     2
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     3
import java.io.{ByteArrayInputStream, File, InputStream}
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     4
import java.nio.file.{Files, StandardCopyOption}
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     5
import java.text.SimpleDateFormat
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     6
import java.util.Date
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     7
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     8
import ammonite.main.Router.{doc, main}
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     9
import ammonite.ops._
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    10
import upickle.default
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    11
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    12
//import $ivy.`javax.mail:javax.mail-api:1.6.1`
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    13
//import $ivy.`com.sun.mail:mailapi:1.6.1`
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    14
import $ivy.`javax.mail:javax.mail-api:1.6.1`
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    15
import $ivy.`com.sun.mail:mailapi:1.6.1`
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    16
import scala.language.postfixOps
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    17
import javax.mail.internet._
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    18
import javax.mail._
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    19
import javax.mail.{Address => mAddress}
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    20
import javax.mail.internet.{ContentType => mContentType}
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    21
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    22
import scala.collection.JavaConverters._
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    23
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    24
case class Address(email: String, name: Option[String], `type`: String)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    25
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    26
object Address {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    27
  def apply(a: mAddress): Option[Address] = a match {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    28
    case ia:InternetAddress =>
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    29
      Some(Address(ia.getAddress, Option(ia.getPersonal), a.getType))
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    30
    case _ =>
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    31
      None
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    32
  }
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    33
}
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    34
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    35
sealed abstract class SystemFlag(code: String)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    36
object SystemFlag {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    37
  case object ANSWERED extends SystemFlag("Answered")
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    38
  case object DELETED extends SystemFlag("Deleted")
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    39
  case object DRAFT extends SystemFlag("Draft")
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    40
  case object FLAGGED extends SystemFlag("Flagged")
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    41
  case object RECENT extends SystemFlag("Recent")
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    42
  case object SEEN extends SystemFlag("Seen")
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    43
  case object USER extends SystemFlag("User")
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    44
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    45
  def apply(fl: Flags.Flag): Option[SystemFlag] = fl match {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    46
    case Flags.Flag.ANSWERED => Some(ANSWERED)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    47
    case Flags.Flag.DELETED => Some(DELETED)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    48
    case Flags.Flag.DRAFT => Some(DRAFT)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    49
    case Flags.Flag.FLAGGED => Some(FLAGGED)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    50
    case Flags.Flag.RECENT => Some(RECENT)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    51
    case Flags.Flag.SEEN => Some(SEEN)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    52
    case Flags.Flag.USER => Some(USER)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    53
    case _ => None
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    54
  }
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    55
}
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    56
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    57
case class Header(name: String, value: String)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    58
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    59
case class Envelope(
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    60
  from: List[Address],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    61
  replyTo: List[Address],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    62
  to: List[Address],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    63
  cc: List[Address],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    64
  subject: Option[String],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    65
  received: Option[Date],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    66
  sent: Option[Date],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    67
  systemFlags: List[SystemFlag],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    68
  userFlags: List[String],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    69
  headers: List[Header],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    70
  encoding: Option[String],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    71
  messageId: Option[String]
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    72
)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    73
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    74
object Envelope {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    75
  private def safe(v: Array[mAddress]): List[mAddress] =
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    76
    if (v==null) Nil else v toList
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    77
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    78
  def apply(m: Message): Envelope = {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    79
    val mm = m match {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    80
      case mm: MimeMessage => Some(mm)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    81
      case _ => None
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    82
    }
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    83
    Envelope(safe(m.getFrom) flatMap(Address(_)),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    84
      safe(m.getReplyTo) flatMap(Address(_)),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    85
      safe(m.getRecipients(Message.RecipientType.TO)) flatMap(Address(_)),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    86
      safe(m.getRecipients(Message.RecipientType.CC)) flatMap(Address(_)),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    87
      Option(MimeUtility.decodeText(m.getSubject)),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    88
      Option(m.getReceivedDate),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    89
      Option(m.getSentDate),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    90
      Option(m.getFlags).toList flatMap(_.getSystemFlags) flatMap(SystemFlag(_)),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    91
      Option(m.getFlags).toList flatMap(_.getUserFlags),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    92
      m.getAllHeaders.asScala map(h => Header(h.getName, h.getValue)) toList,
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    93
      mm flatMap(v => Option(v.getEncoding)),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    94
      mm flatMap(v => Option(v.getMessageID))
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    95
    )
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    96
  }
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    97
}
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    98
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    99
case class ContentType(
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   100
  primaryType: String,
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   101
  subType: String,
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   102
  charset: Option[String],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   103
  parameters: List[ContentType.Parameter]
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   104
)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   105
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   106
object ContentType {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   107
  case class Parameter(name: String, value: String)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   108
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   109
  def apply(s: String): ContentType = {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   110
    val ct = new mContentType(s)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   111
    val pl = ct.getParameterList
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   112
    ContentType(ct.getPrimaryType, ct.getSubType,
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   113
      Option(pl.get("charset")),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   114
      pl.getNames.asScala map(n => Parameter(n, pl.get(n))) toList)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   115
  }
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   116
}
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   117
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   118
case class Descriptor(
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   119
  contentType: ContentType,
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   120
  size: Option[Int],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   121
  lineCount: Option[Int],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   122
  disposition: Option[String],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   123
  description: Option[String],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   124
  fileName: Option[String],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   125
  headers: List[Header],
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   126
  encoding: Option[String]
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   127
)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   128
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   129
object Descriptor {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   130
  def apply(p: Part): Descriptor = Descriptor(
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   131
    ContentType(p.getContentType),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   132
    Option(p.getSize) filterNot(_ == -1),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   133
    Option(p.getLineCount) filterNot(_ == -1),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   134
    Option(p.getDisposition),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   135
    Option(p.getDescription),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   136
    Option(p.getFileName),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   137
    Option(p.getAllHeaders).toList flatMap(_.asScala)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   138
      map(h => Header(h.getName, h.getValue)),
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   139
    p match {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   140
      case mp: MimePart => Option(mp.getEncoding)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   141
      case _ => None
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   142
    }
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   143
  )
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   144
}
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   145
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   146
sealed abstract class Content { def descriptor: Descriptor }
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   147
object Content {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   148
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   149
  case class Plain(text: String, descriptor: Descriptor) extends Content
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   150
  case class Html(text: String, descriptor: Descriptor) extends Content
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   151
  case class Text(text: String, descriptor: Descriptor) extends Content
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   152
  case class Multi(parts: List[Content], descriptor: Descriptor) extends Content
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   153
  case class Nested(message: Content, descriptor: Descriptor) extends Content
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   154
  case class Stream(bytes: Array[Byte], descriptor: Descriptor) extends Content
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   155
  case class Attachment(file: String, descriptor: Descriptor) extends Content
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   156
  case class Unknown(clz: String, descriptor: Descriptor) extends Content
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   157
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   158
  def apply(m: Part)(implicit attDir: File): Content = {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   159
    val d = Descriptor(m)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   160
    m.getContent match {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   161
      case t: String if m.isMimeType("text/plain") => Plain(t, d)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   162
      case t: String if m.isMimeType("text/html") => Html(t, d)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   163
      case t: String => Text(t, d)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   164
      case mp: Multipart if m.isMimeType("multipart/*") =>
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   165
        Multi(0 until mp.getCount map(i => Content(mp.getBodyPart(i))) toList,
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   166
          d)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   167
      case p: Part if m.isMimeType("message/rfc822") =>
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   168
        Nested(Content(p), d)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   169
      case p: MimeBodyPart =>
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   170
        val f = File.createTempFile("mail-", ".att", attDir)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   171
        p.saveFile(f)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   172
        Attachment(f.getAbsolutePath, d)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   173
      case is: InputStream =>
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   174
        val f = File.createTempFile("mail-", ".att", attDir)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   175
        Files.copy(is, f.toPath, StandardCopyOption.REPLACE_EXISTING)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   176
        Attachment(f.getAbsolutePath, d)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   177
      case x => Unknown(x.getClass.getName, d)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   178
    }
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   179
  }
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   180
}
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   181
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   182
case class EmailMessage(
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   183
  envelope: Envelope,
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   184
  content: Content
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   185
)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   186
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   187
object EmailMessage {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   188
  def apply(m: Message)(implicit attDir: File): EmailMessage = {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   189
    EmailMessage(Envelope(m), Content(m))
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   190
  }
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   191
}
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   192
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   193
@main
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   194
def main(
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   195
  @doc("Email message file") mail: Path,
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   196
  @doc("Output directory") outDir: Path): Unit = {
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   197
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   198
  val session = Session.getInstance(System.getProperties)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   199
  val msg = new MimeMessage(session, new ByteArrayInputStream(read.bytes(mail)))
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   200
  import upickle.default._
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   201
  import upickle.Js
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   202
  val df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   203
  implicit val w: default.Writer[Date] = Writer[Date](d => Js.Str(df.format(d)))
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   204
  outDir.toIO.mkdirs()
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   205
  val m = EmailMessage(msg)(outDir.toIO)
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   206
  ammonite.ops.write.over(outDir / 'mail, write(m))
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   207
  println(s"Written to $outDir")
09b1d3c0aa20 scala/mail-parser/mail-parser.sc: email parser (based on java mail api); ammonite.io script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   208
}