#!/usr/local/bin/ruby
# $Id: tml,v 1.15 2004/01/22 05:47:58 tommy Exp $
#
# Copyright (C) 2003 TOMITA Masahiro
# tommy@tmtm.org
#

require "getopts"
require "net/smtp"

$script_dir = File::dirname $0
require $script_dir+"/tml.rb"
require $script_dir+"/mail.rb"

conf = $script_dir+"/tml.conf"
load conf if File::exist? conf

unless getopts("f:", "domain:") then
  $stderr.puts "invalid usage"
  exit 1
end

load $OPT_f if $OPT_f
$domain = $OPT_domain if $OPT_domain

mlname = ARGV.shift
if mlname == nil then
  $stderr.puts "invalid usage"
  exit 1
end

if not $domain then
  $stderr.puts "$domain parameter required"
  exit 1
end

ml = TML::new mlname

header = ""
body = nil
$stdin.each do |line|
  line.sub!(/\r\n/, "\n")
  if body then
    body << line
  elsif line == "\n" then
    body = ""
  else
    header << line
  end
end
if body == nil then
  body = ""
end

members = ml.all_members
from = get_from header

unless ml.get_attr :not_member then
  unless members.include? from then
    $stderr.puts "You are not member of #{mlname}, rejected."
    exit 100
  end
end

unless ml.check_post from  then
  $stderr.puts "You are not permitted to post to #{mlname}, rejected."
  exit 100
end

counter = ml.countup

subject = get_subject(header) || "(no subject)"
if ml.get_attr :subject_mlname then
  subject.gsub!(/^(Re:\s*)\[#{mlname}(:\d+)?\]\s*(Re:\s*)?/i){"#{$1}"}
  subject = mime_header_encode subject
  if ml.get_attr(:counter_width) > 0 then
    c = sprintf "%0#{ml.get_attr :counter_width}d", counter
    if subject.split(/\n/,2)[0].length > 48 then
      subject = "[#{mlname}:#{c}]\n #{subject}"
    else
      subject = "[#{mlname}:#{c}] #{subject}"
    end
  else
    if subject.split(/\n/,2)[0].length > 48 then
      subject = "[#{mlname}]\n #{subject}"
    else
      subject = "[#{mlname}] #{subject}"
    end
  end
  header.gsub!(/^Subject:(\n\s|.)*\n/i, "")
  header << "Subject: #{subject}\n"
end

header.gsub!(/^Return-Path:(\n\s|.)*\n/i, "")
header.gsub!(/^Received:(\n\s|.)*\n/i, "") if $strip_received

r = ml.get_attr(:replyto_type)
if r == "none" then
  # do nothing
else
  case r
  when "ml", nil
    rt = "Reply-To: #{mlname}@#{$domain}\n"
  when "from"
    rt = "Reply-To: #{from}\n"
  when "admin"
    rt = "Reply-To: #{mlname}-admin@#{$domain}\n"
  else
    rt = "Reply-To: #{r}\n"
  end
  header.gsub!(/^Reply-To:(\n\s|.)*\n/i, "")
  header << rt
end

header << "X-ML-Name: #{mlname}\n"
ov = ml.get_attr :overview
header << "X-ML-Overview: #{mime_header_encode ov}\n" if ov and not ov.empty?
header << "X-ML-Count: #{counter}\n"
header << "List-Id: #{mlname}.#{$domain}\n"
header << "List-Unsubscribe: <mailto:#{mlname}-ctl@#{$domain}?body=unsubscribe>\n"
header << "List-Subscribe: <mailto:#{mlname}-ctl@#{$domain}?body=subscribe>\n"
header << "List-Post: <mailto:#{mlname}@#{$domain}>\n"
header << "List-Owner: <mailto:#{mlname}-admin@#{$domain}>\n"
header << "List-Software: tml [tml #{TML_VERSION}]\n"

msg = header + "\n" + body
ml.spool counter, msg if ml.get_attr :spool
ml.add_summary counter, mime_header_decode(subject)

if not members.empty? then
  Net::SMTP::start($smtp_server, $smtp_port) do |smtp|
    smtp.send_mail(msg, ml.get_attr(:sender), members)
  end
end
