markdown_mail_sender 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3e47bd09ee5de38cd21b2c79250238d6f2ad4b44
4
+ data.tar.gz: 7ed7221510a648c636f46271a15dbaa69f6664e6
5
+ SHA512:
6
+ metadata.gz: 507b9231374792f493ea0e91a43db7ae24ecb2c99f235f47093e1ddfdcc7f410dff0b887000b4a6da3f96c7e8d6935a0b84d90bad293a7b76e3a3bbf74b3c63e
7
+ data.tar.gz: c9443c75400f473855e466aabe2c6cd2b164f8b28988886d3e8a3607e8e4e1f7b695aa13a5b9a032a7faa4af8684544186a4fae76e0aadbeea72173b7ddced18
Binary file
Binary file
@@ -0,0 +1,136 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # file: markdown_mail_sender.rb
4
+
5
+ require 'net/smtp'
6
+ require 'rdiscount'
7
+ require 'fileutils'
8
+
9
+
10
+ class MarkdownMailSender
11
+
12
+ def initialize(user, password, compose_dir: '~/email/compose',
13
+ sent_dir: '~/email/sent', smtp_host: nil, from_domain: smtp_host)
14
+
15
+ @user, @password = user, password
16
+ @smtp_host, @mail_from_domain = smtp_host, from_domain
17
+
18
+ compose_dirpath = File.expand_path(compose_dir)
19
+ @sent_dir = File.expand_path(sent_dir)
20
+ FileUtils.mkdir_p @sent_dir
21
+
22
+ # scan the compose directory for email files to deliver
23
+
24
+ @messages = Dir.glob(File.join(compose_dirpath, '*.md')).map \
25
+ do |msg_filepath|
26
+
27
+ s = File.read msg_filepath
28
+
29
+ regex = %r{
30
+
31
+ (?<email>(?:.*<)?\w+(?:\.\w+)?@\S+>?){0}
32
+ (?<filepath>\s*[\w\/\.]+\s+){0}
33
+
34
+ from:\s(?<from>\g<email>)\s+
35
+ to:\s(?<to>\g<email>)\s+
36
+ (?:attachments?:\s+(?<attachments>\g<filepath>*))?
37
+ subject:\s+(?<subject> [^\n]+)\n
38
+ (?<body> .*)
39
+
40
+ }xm =~ s
41
+
42
+ files = attachments.nil? ? [] : attachments.split.map(&:strip)
43
+
44
+ {
45
+ filepath: msg_filepath, from: from, to: to, attachments: files,
46
+ subject: subject, body_txt: body,
47
+ body_html: RDiscount.new(body).to_html
48
+ }
49
+
50
+ end
51
+
52
+ end
53
+
54
+ def deliver_all()
55
+
56
+ @messages.each.with_index do |x, i|
57
+
58
+ puts 'xx: ' + x.inspect
59
+
60
+ raw_marker = "AUNIQUEMARKER"
61
+ marker = "\n--#{raw_marker}"
62
+
63
+ from, to, subject = %i(from to subject).map {|name| x[name]}
64
+
65
+ header =<<EOF
66
+ From: #{from}
67
+ To: #{to}
68
+ Subject: #{subject}
69
+ MIME-Version: 1.0
70
+ Content-Type: multipart/mixed; boundary=#{raw_marker}
71
+ EOF
72
+
73
+ # Define the message action
74
+ txt_part =<<EOF
75
+ Content-Type: text/plain
76
+ Content-Transfer-Encoding:8bit
77
+
78
+ #{x[:body_txt]}
79
+ EOF
80
+
81
+ html_part =<<EOF
82
+ Content-Type: text/html
83
+
84
+ #{x[:body_html]}
85
+ EOF
86
+
87
+ a = [header, txt_part, html_part]
88
+
89
+ if x[:attachments].any? then
90
+
91
+ attachments = x[:attachments].map {|x| file_part x}
92
+ a.concat attachments
93
+
94
+ end
95
+
96
+ mailtext = a.join(marker + "\n") + marker + "--"
97
+
98
+ Net::SMTP.start(@smtp_host, 25, @mail_from_domain, @user,
99
+ @password, :login) do |smtp|
100
+
101
+ smtp.send_message mailtext, from, to
102
+
103
+ end
104
+
105
+
106
+ target = Time.now.strftime("m%d%m%yT%H%Ma")
107
+ target.succ! while File.exists? target
108
+
109
+ FileUtils.mv x[:filepath], File.join(@sent_dir, target + '.md')
110
+
111
+ end
112
+
113
+ end
114
+
115
+ alias deliver deliver_all
116
+
117
+ def file_part(filepath)
118
+
119
+ # Read a file and encode it into base64 format
120
+
121
+ filecontent = File.read filepath
122
+ encodedcontent = [filecontent].pack("m") # base64
123
+
124
+ filename = File.basename filepath
125
+
126
+ <<EOF
127
+ Content-Type: multipart/mixed; name="#{filename}"
128
+ Content-Transfer-Encoding:base64
129
+ Content-Disposition: attachment; filename="#{filename}"
130
+
131
+ #{encodedcontent}
132
+ EOF
133
+
134
+ end
135
+
136
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: markdown_mail_sender
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - James Robertson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDljCCAn6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBIMRIwEAYDVQQDDAlnZW1t
14
+ YXN0ZXIxHjAcBgoJkiaJk/IsZAEZFg5qYW1lc3JvYmVydHNvbjESMBAGCgmSJomT
15
+ 8ixkARkWAmV1MB4XDTE2MDYyMzExMDU0NVoXDTE3MDYyMzExMDU0NVowSDESMBAG
16
+ A1UEAwwJZ2VtbWFzdGVyMR4wHAYKCZImiZPyLGQBGRYOamFtZXNyb2JlcnRzb24x
17
+ EjAQBgoJkiaJk/IsZAEZFgJldTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
18
+ ggEBAK1G/P91SkRwCwsloDOn3vc5+Tlif3KBdqhxlvT/t/Ai2YB0y64p6UPI1+QW
19
+ ppoUimTC9ko4ChII8nVUrhtBc2OmhXd+rKLqfx7MpC0VedMGz2rYeAVZ7OnVqxkC
20
+ BV8WmKFPYkNW/xB/Li9/6s8VjLP/OvlIvjLaFlLWIDjRXmrQZ9/urN46yrdE2JPs
21
+ kw1yQIdDHfHKq8z3xf7x0nSgfyQMR/48hSqnAeaItVEHgZ0GzpC9EhGHQqOzXXXQ
22
+ sfHjje+NsF55w0EmJ4jK5cCW1cV8sIl6N4BX/Q50QpRyv+HAoqTOBMywo2l0BOGA
23
+ nCb/n/pxjaLuz2HNCCC1KnNATssCAwEAAaOBijCBhzAJBgNVHRMEAjAAMAsGA1Ud
24
+ DwQEAwIEsDAdBgNVHQ4EFgQUQGQHQoXDrCGKvgi98x4Ehynsx18wJgYDVR0RBB8w
25
+ HYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1h
26
+ c3RlckBqYW1lc3JvYmVydHNvbi5ldTANBgkqhkiG9w0BAQUFAAOCAQEARe7NKznl
27
+ pA17KM+8FuKzf/GEj84lPCKlZxBDNAc8wdnrr37xznO6kBrms68P3uU03pdeCZNQ
28
+ z9mxoyVP4owdTHOcfLeoLcpeGkHQsDBvPQOUBkrHptUmFTbLB/j9DuT1zddMbBEQ
29
+ vLrgomspG7090tSqfUcbxtZfyjPbYMTiTXQwoRM0UPk6Sr1A5miAjuIh/BCdyPxw
30
+ fJvP6El63Ei0f93/BNbRapodjDeZFhDtHht2vnwzpySN11MbZzXQtJY/W6ojR+3n
31
+ /lI2nqMMq5f39gxDkuM9dlpQCTSlNYaMUH/Ygfnaqi9j9ntJiW9/yjiYUGV7wzeS
32
+ h4yZiygx7MCysQ==
33
+ -----END CERTIFICATE-----
34
+ date: 2016-06-23 00:00:00.000000000 Z
35
+ dependencies:
36
+ - !ruby/object:Gem::Dependency
37
+ name: rdiscount
38
+ requirement: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '2.2'
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: 2.2.0.1
46
+ type: :runtime
47
+ prerelease: false
48
+ version_requirements: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: '2.2'
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: 2.2.0.1
56
+ description:
57
+ email: james@r0bertson.co.uk
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - lib/markdown_mail_sender.rb
63
+ homepage: https://github.com/jrobertson/markdown_mail_sender
64
+ licenses:
65
+ - MIT
66
+ metadata: {}
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ requirements: []
82
+ rubyforge_project:
83
+ rubygems_version: 2.5.1
84
+ signing_key:
85
+ specification_version: 4
86
+ summary: Sends an email from a file directory containing a Markdown file representing
87
+ the email message.
88
+ test_files: []
@@ -0,0 +1,3 @@
1
+ L�9�6��aS��"�qȀ��s��J$1K�������T+# v������MZ�X`�����L�+Z��
2
+ �ҡ=�?���f�
3
+ ��Q{@n