texmailer 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,75 @@
1
+ module Texmailer
2
+
3
+ def loadparams
4
+ p = Hash.new
5
+ params = [['from',0],['mailfrom', 0],['host', 0],['port', 0],['ssl', 1],['igcert', 1],['auth', 1],['user', 0],['pass', 0]]
6
+ fnm = $userdir + '/smtp.cfg'
7
+
8
+ if File.readable? fnm
9
+ lns = IO.readlines(fnm)
10
+ (1..((lns.length < params.length) ? lns.length : params.length)).each {|i|
11
+ p[params[i-1][0]] = lns[i-1].sub(/\n/m,'')
12
+ }
13
+ end
14
+ p.inspect
15
+ params.each { |x| p[x[0]] ||= '' }
16
+ params.each { |x| p[x[0]] == 'false' if x[1] == 1 && p[x[0]] != 'true' }
17
+ return p
18
+ end
19
+
20
+ def saveparams req
21
+ fnm = $userdir + '/smtp.cfg'
22
+ params = [['from',0],['mailfrom', 0],['host', 0],['port', 0],['ssl', 1],['igcert', 1],['auth', 1],['user', 0],['pass', 0]]
23
+
24
+ File.open(fnm,'w',0600) { |f|
25
+ params.each { |x|
26
+ d = req[x[0]] if x[1] == 0 && req[x[0]]
27
+ d = 'true' if x[1] == 1 && req[x[0]]
28
+ d ||= '' if x[1] == 0
29
+ d ||= 'false'
30
+ f.write d+"\n"
31
+ }
32
+ }
33
+ end
34
+
35
+ def makerc
36
+ p = loadparams
37
+ fnm = $userdir + '/msmtprc'
38
+ File.open(fnm,'w',0600) { |f|
39
+ f.write "account default\ntimeout 15\nauto_from off\n"
40
+ f.write "from \"#{p["mailfrom"]}\"\n"
41
+ f.write "host #{p["host"]}\n"
42
+ f.write "port #{p["port"]}\n"
43
+ f.write "auth on\nuser #{p["user"]}\npassword #{p["pass"]}\n" if p["auth"] == "true"
44
+ if p["ssl"] == "true" then
45
+ f.write "tls on\n"
46
+ if p["igcert"] == "true" then
47
+ f.write "tls_certcheck off\n"
48
+ else
49
+ f.write "tls_certcheck on\n"
50
+ f.write "tls_trust_file #{$basedir}/ca-bundle.crt\n"
51
+ end
52
+ end
53
+ }
54
+ return fnm
55
+ end
56
+
57
+ def msmtp(req,message)
58
+ fnm = makerc
59
+ pr = loadparams
60
+ IO.popen("msmtp -C #{fnm} -t 2> #{$userdir}/msmtplog","w") { |p|
61
+ [ ["To:","mailto"],["CC:","mailcc"],["BCC:","mailbcc"],["Subject:","subject"] ].each { |x|
62
+ if req[x[1]] && req[x[1]].length > 0 then
63
+ p.write x[0] + " " + req[x[1]].gsub(/\n/m,'') + "\n"
64
+ end
65
+ }
66
+ if pr["from"].length > 0 then
67
+ p.write "From: #{pr["from"]} <#{pr["mailfrom"]}>\n"
68
+ end
69
+ p.write message
70
+ }
71
+ return true,"E-mail Sent" if $? == 0
72
+ return false, "<pre>\n"+File.read($userdir+'/msmtplog')+"\n</pre>" if File.readable? $userdir+'/msmtplog'
73
+ return false, 'Error running msmtp.'
74
+ end
75
+ end
@@ -0,0 +1,172 @@
1
+ require 'cgi'
2
+
3
+ module Texmailer
4
+
5
+ def savedraft(mailid,req)
6
+ svdir = $userdir + '/drafts/'+mailid
7
+ if ! File.directory? svdir
8
+ Dir.mkdir(svdir)
9
+ end
10
+ ["mailto","mailcc","mailbcc","subject","body"].each { |s|
11
+ File.open(svdir+'/'+s,"w") { |f| f.write req[s] }
12
+ }
13
+ end
14
+
15
+ def getpvloc(mailid)
16
+ pvlnk = '/preview/' + mailid + '/t.html'
17
+ return pvlnk if File.readable? $userdir+pvlnk
18
+ return '/blankprev.html'
19
+ end
20
+
21
+ def preview(mailid,req)
22
+ pvdir = $userdir + '/preview/' + mailid
23
+ if ! File.directory? pvdir
24
+ Dir.mkdir(pvdir)
25
+ end
26
+
27
+ s = <<EOF
28
+ \\documentclass{article}
29
+ \\usepackage{amsmath,amssymb}
30
+ \\setlength{\\parindent}{0in}
31
+ \\begin{document}
32
+ #{req["body"]}
33
+ \\end{document}
34
+ EOF
35
+ File.open(pvdir + '/t.tex','w') { |f| f.write s}
36
+ Dir.chdir(pvdir);
37
+
38
+ if system('latex -interaction=nonstopmode t > ltxrun.txt 2>/dev/null')
39
+ system('htlatex t > /dev/null 2>/dev/null')
40
+ return true
41
+ else
42
+ emsg = File.read(pvdir+'/ltxrun.txt');
43
+ s = "<html><body><h1>Latex Error</h1><br><pre>\n" + emsg + "\n</pre></body></html>";
44
+ File.open(pvdir + '/t.html','w') {|f| f.write s}
45
+ return false
46
+ end
47
+ end
48
+
49
+ def loaddraft(mailid)
50
+ svdir = $userdir + '/drafts/'+mailid
51
+ a = Array.new
52
+ ["mailto","mailcc","mailbcc","subject","body"].each { |s|
53
+ fname = svdir+'/'+s
54
+ a.push File.readable?(fname) ? File.read(fname) : ""
55
+ }
56
+ return a[0],a[1],a[2],a[3],a[4]
57
+ end
58
+
59
+ def discarddraft(mailid)
60
+ svdir = $userdir + '/drafts/'+mailid
61
+ if File.directory? svdir
62
+ lst = Dir[svdir+'/*'];
63
+ lst.each {|f| File.delete(f)}
64
+ Dir.rmdir(svdir)
65
+ end
66
+ svdir = $userdir + '/preview/'+mailid
67
+ if File.directory? svdir
68
+ lst = Dir[svdir+'/*'];
69
+ lst.each {|f| File.delete(f)}
70
+ Dir.rmdir(svdir)
71
+ end
72
+
73
+ end
74
+
75
+ def getdrafts
76
+ ids = Dir.glob($userdir + '/drafts/*',File::FNM_PATHNAME)
77
+ s = ids.collect { |i|
78
+ if ! File.directory? i
79
+ nil
80
+ else
81
+ mid = File.basename i
82
+
83
+ mailto = File.read(i + '/mailto') if File.readable? i + '/mailto'
84
+ drtime = File.mtime(i + '/mailto') if File.readable? i + '/mailto'
85
+ mailto ||= ''
86
+ mailto = '(No Recipient)' if mailto.length == 0
87
+ drtime ||= File.mtime(i)
88
+
89
+ subject = File.read(i + '/subject') if File.readable? i + '/subject'
90
+ subject ||= ''
91
+ subject = '(No Subject)' if subject.length == 0
92
+
93
+ [mid,CGI.escapeHTML(mailto),CGI.escapeHTML(subject),drtime]
94
+ end
95
+ }
96
+ s.compact!
97
+ s.sort! {|a,b| b[3] <=> a[3]}
98
+ return s
99
+ end
100
+ end
101
+
102
+ ## Borrowed from sup
103
+ class Time
104
+ def to_indexable_s
105
+ sprintf "%012d", self
106
+ end
107
+
108
+ def nearest_hour
109
+ if min < 30
110
+ self
111
+ else
112
+ self + (60 - min) * 60
113
+ end
114
+ end
115
+
116
+ def midnight # within a second
117
+ self - (hour * 60 * 60) - (min * 60) - sec
118
+ end
119
+
120
+ def is_the_same_day? other
121
+ (midnight - other.midnight).abs < 1
122
+ end
123
+
124
+ def is_the_day_before? other
125
+ other.midnight - midnight <= 24 * 60 * 60 + 1
126
+ end
127
+
128
+ def to_nice_distance_s from=Time.now
129
+ later_than = (self < from)
130
+ diff = (self.to_i - from.to_i).abs.to_f
131
+ text =
132
+ [ ["second", 60],
133
+ ["minute", 60],
134
+ ["hour", 24],
135
+ ["day", 7],
136
+ ["week", 4.345], # heh heh
137
+ ["month", 12],
138
+ ["year", nil],
139
+ ].argfind do |unit, size|
140
+ if diff.round <= 1
141
+ "one #{unit}"
142
+ elsif size.nil? || diff.round < size
143
+ "#{diff.round} #{unit}s"
144
+ else
145
+ diff /= size.to_f
146
+ false
147
+ end
148
+ end
149
+ if later_than
150
+ text + " ago"
151
+ else
152
+ "in " + text
153
+ end
154
+ end
155
+
156
+ TO_NICE_S_MAX_LEN = 9 # e.g. "Yest.10am"
157
+ def to_nice_s from=Time.now
158
+ if year != from.year
159
+ strftime "%b %Y"
160
+ elsif month != from.month
161
+ strftime "%b %e"
162
+ else
163
+ if is_the_same_day? from
164
+ strftime("%l:%M%p").downcase # emulate %P (missing on ruby 1.8 darwin)
165
+ elsif is_the_day_before? from
166
+ "Yest." + nearest_hour.strftime("%l%p").downcase # emulate %P
167
+ else
168
+ strftime "%b %e"
169
+ end
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,4 @@
1
+ <html>
2
+ <body>
3
+ </body>
4
+ </html>
@@ -0,0 +1,82 @@
1
+ <%
2
+ if req["discard"] then
3
+ req["discard"].each { |x| discarddraft(x) }
4
+ end
5
+ %>
6
+ <html>
7
+
8
+ <head>
9
+ <title>TeXMailer</title>
10
+ <style type="text/css">
11
+ input {
12
+ border: 1px solid;
13
+ }
14
+ a.drft {
15
+ font-size: 15px;
16
+ color: black;
17
+ text-decoration: none;
18
+ }
19
+ a.drft:hover {
20
+ color: #a00000;
21
+ }
22
+ </style>
23
+ <script type="text/javascript">
24
+ function selectall(me)
25
+ {
26
+ l = document.getElementsByName("discard[]");
27
+ for(i = 0; i < l.length;i++)
28
+ l[i].checked = me.checked;
29
+ }
30
+ </script>
31
+ </head>
32
+
33
+ <body style="background-color:#dedede">
34
+ <%= File.read($basedir+"/rhtml/header.html")%>
35
+ <center>
36
+ <form method="POST" name="draftform" action="drafts.html">
37
+ <table style="width:98%; font-size:15px; border-width:2px; background-color:#badaba; border-color:#1aaa1a; border-style:solid">
38
+ <tr>
39
+ <td style="width:100%">
40
+ <input type="checkbox" onChange="selectall(this)">&nbsp;&nbsp;<input type="submit" value="Delete Drafts">
41
+ </td>
42
+ </tr>
43
+ </table>
44
+ <table style="width:98%; font-size:15px; border-width:0px; border-spacing:0px 2px; padding:2px; font-size:15px">
45
+ <%
46
+ s = getdrafts
47
+ if s.length == 0 then
48
+ %>
49
+ <tr style="background-color:#fefefe">
50
+ <td style="width:100%; text-align:center">
51
+ <br>
52
+ You have no saved drafts.
53
+ <br>
54
+ </br>
55
+ </td>
56
+ </tr>
57
+ <%
58
+ else
59
+ s.each do |x|
60
+ mlink = "index.html?mailid="+x[0]
61
+ %>
62
+ <tr style="background-color:#fefefe">
63
+ <td style="width:30%">
64
+ <input type="checkbox" name="discard[]" value="<%= x[0] %>">
65
+ <a class="drft" href="<%= mlink %>"><%= x[1] %></a>
66
+ </td>
67
+ <td style="width:55%">
68
+ <a class="drft" href="<%= mlink %>"><%= x[2] %></a>
69
+ </td>
70
+ <td style="width:15%; text-align:right">
71
+ <a class="drft" href="<%= mlink %>"><%= x[3].to_nice_s %></a>
72
+ </td>
73
+ </tr>
74
+ <%
75
+ end
76
+ end
77
+ %>
78
+ </table>
79
+ </form>
80
+ </center>
81
+ </body>
82
+ </html>
@@ -0,0 +1,24 @@
1
+ <style type="text/css">
2
+ a.toplink {
3
+ border: 1px outset;
4
+ padding: 2px;
5
+ text-decoration: none;
6
+ font-size:15px;
7
+ background-color: #f5f5e5;
8
+ color: #000000
9
+ }
10
+ a.toplink:hover {
11
+ background-color: #aaffaa
12
+ }
13
+ </style>
14
+ <table style="width:100%;">
15
+ <tr><td width=75%>
16
+ <a href="index.html" class="toplink">New Mail</a>
17
+ <a href="drafts.html" class="toplink">Drafts</a>
18
+ <a href="settings.html" class="toplink">Settings</a>&nbsp;&nbsp;&nbsp;
19
+ <a href="die" class="toplink">Exit</a>
20
+ </td>
21
+ <td width=25% style="text-align:right; vertical-align:bottom">
22
+ <span style="font-size:25px">TeXMailer&nbsp;&nbsp;</span>
23
+ </td>
24
+ </tr></table>
@@ -0,0 +1,125 @@
1
+ <%
2
+ mailto,mailcc,mailbcc,subject,body = "","","","",""
3
+
4
+ # Does the draft exist
5
+ if req["mailid"] then
6
+ mailid = req["mailid"]
7
+ if req["stype"] then
8
+ savedraft(mailid,req) if req["stype"] == "save" || req["stype"] == "preview"
9
+ preview(mailid,req) if req["stype"] == "preview"
10
+ discarddraft(mailid) if req["stype"] == "discard"
11
+ end
12
+ else # Create new draft
13
+ mailid = (0...10).map{ ('a'..'z').to_a[rand(26)] }.join;
14
+ end
15
+
16
+ mailto,mailcc,mailbcc,subject,body = loaddraft(mailid)
17
+ posturl = 'index.html?mailid='+mailid
18
+ sendurl = 'send.html?mailid='+mailid
19
+ %>
20
+
21
+ <html>
22
+
23
+ <head>
24
+ <title>TeXMailer</title>
25
+
26
+ <style type="text/css">
27
+ input {
28
+ border: 1px solid;
29
+ }
30
+ textarea {
31
+ border: 1px solid;
32
+ }
33
+
34
+ </style>
35
+ <script type="text/javascript">
36
+ function send()
37
+ {
38
+ document.getElementById("mailform").stype.value = "send";
39
+ document.getElementById("mailform").action = "<%= sendurl %>";
40
+ document.getElementById("mailform").submit();
41
+ }
42
+ function save()
43
+ {
44
+ document.getElementById("mailform").stype.value = "save";
45
+ document.getElementById("mailform").action = "<%= posturl %>";
46
+ document.getElementById("mailform").submit();
47
+ }
48
+ function preview()
49
+ {
50
+ document.getElementById("mailform").stype.value = "preview";
51
+ document.getElementById("mailform").action = "<%= posturl %>";
52
+ document.getElementById("mailform").submit();
53
+ }
54
+ function discard()
55
+ {
56
+ document.getElementById("mailform").stype.value = "discard";
57
+ document.getElementById("mailform").action = "<%= posturl %>";
58
+ document.getElementById("mailform").submit();
59
+ }
60
+ </script>
61
+ </head>
62
+
63
+ <body style="background-color:#dedede">
64
+ <%= File.read($basedir+"/rhtml/header.html")%>
65
+ <center>
66
+ <table style="width:100%; border-width:0px">
67
+ <tr style="width:100%; vertical-align: top">
68
+
69
+ <td style="width:45%">
70
+ <table style="width:100%; border-width:2px; background-color:#badaba; border-color:#1aaa1a; border-style:solid">
71
+ <tr><td style="text-align:left">
72
+ &nbsp;<input type="submit" value="Send" onClick="send();">&nbsp;
73
+ &nbsp;<input type="submit" value="Preview" onClick="preview();">&nbsp;&nbsp;
74
+ <input type="submit" value="Save" onClick="save();">&nbsp;
75
+ <input type="submit" value="Discard" onClick="discard();">&nbsp;
76
+ </td></tr>
77
+ <tr><td style="text-align:center">
78
+ <form method="POST" id="mailform" action="<%= posturl %>">
79
+ <input name="stype" id="stype" type="hidden" value="save">
80
+ <table style="width:99%;">
81
+ <tr>
82
+ <td style="text-align:right; width:10%; text-align:right; vertical-align:top">To:</td>
83
+ <td style="text-align:left; width:90%">
84
+ <input name="mailto" style="width:100%" value="<%= mailto %>">
85
+ </td>
86
+ </tr>
87
+ <tr>
88
+ <td style="text-align:right; width:10%; text-align:right; vertical-align:top">CC:</td>
89
+ <td style="text-align:left; width:90%">
90
+ <input name="mailcc" style="width:100%" value="<%= mailcc %>">
91
+ </td>
92
+ </tr>
93
+ <tr>
94
+ <td style="text-align:right; width:10%; text-align:right; vertical-align:top">BCC:</td>
95
+ <td style="text-align:left; width:90%">
96
+ <input name="mailbcc" style="width:100%" value="<%= mailbcc %>">
97
+ </td>
98
+ </tr>
99
+ <tr>
100
+ <td style="text-align:right; width:10%; text-align:right; vertical-align:top">Subject:</td>
101
+ <td style="text-align:left; width:90%">
102
+ <input name="subject" style="width:100%" value="<%= subject %>">
103
+ </td>
104
+ </tr>
105
+ </table>
106
+ <br>
107
+ <textarea name="body" style="width:99%;" rows=60><%= body %></textarea>
108
+ </form>
109
+ </td></tr>
110
+ <tr><td style="text-align:left">
111
+ &nbsp;<input type="submit" value="Send" onClick="send();">&nbsp;
112
+ &nbsp;<input type="submit" value="Preview" onClick="preview();">&nbsp;&nbsp;
113
+ <input type="submit" value="Save" onClick="save();">&nbsp;
114
+ <input type="submit" value="Discard" onClick="discard();">&nbsp;
115
+ </td></tr>
116
+ </table>
117
+ </td>
118
+ <td style="width:55%; height:99%; background-color:#faf4f4">
119
+ <iframe src="<%= getpvloc(mailid) %>" style="height:100%; width:100%; border:1px solid" scrolling="auto"></iframe>
120
+ </td>
121
+ </tr>
122
+ </table>
123
+ </center>
124
+ </body>
125
+ </html>