alexmchale-gmail-client 0.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.
Files changed (4) hide show
  1. data/README.markdown +0 -0
  2. data/VERSION.yml +4 -0
  3. data/lib/gmail.rb +156 -0
  4. metadata +56 -0
data/README.markdown ADDED
File without changes
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :minor: 0
3
+ :major: 0
4
+ :patch: 1
data/lib/gmail.rb ADDED
@@ -0,0 +1,156 @@
1
+ require 'openssl'
2
+ require 'net/smtp'
3
+ require 'base64'
4
+
5
+ class GMail
6
+ def initialize(username, password)
7
+ @username = username
8
+ @password = password
9
+ end
10
+
11
+ def start(to, subject, body, body_type = 'text/plain')
12
+ @to = to.to_s
13
+ @subject = subject.to_s
14
+ @body = body.to_s
15
+ @body_type = body_type
16
+ @attachments = []
17
+
18
+ self
19
+ end
20
+
21
+ def add_data(name, data, type)
22
+ @attachments << { :name => name, :data => data, :type => type }
23
+
24
+ self
25
+ end
26
+
27
+ def add_file(filename, content_type)
28
+ add_data File.basename(File.expand_path(filename)), File.read(filename), content_type
29
+ end
30
+
31
+ def add_jpeg(filename, data = nil)
32
+ name = File.basename filename
33
+ data ||= File.read(filename)
34
+ type = 'image/jpeg'
35
+
36
+ add_data name, data, type
37
+ end
38
+
39
+ def compose
40
+ boundary = rand(2**128).to_s(16)
41
+
42
+ if @attachments.length > 0
43
+ attachments = @attachments.map do |attachment|
44
+ "--#{boundary}\r\n" +
45
+ "Content-Type: #{attachment[:type]}; name=\"#{attachment[:name]}\"\r\n" +
46
+ "Content-Disposition: attachment; filename=\"#{attachment[:name]}\"\r\n" +
47
+ "Content-Transfer-Encoding: base64\r\n" +
48
+ "\r\n" +
49
+ Base64.encode64(attachment[:data])
50
+ end.compact.join
51
+
52
+ "Date: #{Time.now.to_s}\r\n" +
53
+ "From: #{@username}\r\n" +
54
+ "To: #{@to}\r\n" +
55
+ "Subject: #{@subject}\r\n" +
56
+ "MIME-Version: 1.0\r\n" +
57
+ "Content-Type: multipart/mixed; boundary=\"#{boundary}\"\r\n" +
58
+ "\r\n" +
59
+ "--#{boundary}\r\n" +
60
+ "Content-Type: text/plain\r\n" +
61
+ "\r\n" +
62
+ "#{@body}\r\n" +
63
+ "\r\n" +
64
+ attachments +
65
+ "--#{boundary}--\r\n" +
66
+ "\r\n.\r\n"
67
+ else
68
+ "Date: #{Time.now.to_s}\r\n" +
69
+ "From: #{@username}\r\n" +
70
+ "To: #{@to}\r\n" +
71
+ "Subject: #{@subject}\r\n" +
72
+ "Content-Type: text/plain\r\n" +
73
+ "\r\n" +
74
+ "#{@body}\r\n" +
75
+ "\r\n.\r\n"
76
+ end
77
+ end
78
+
79
+ def dispatch
80
+ Net::SMTP.start('smtp.gmail.com', 587, 'gmail.com', @username, @password, :plain) do |smtp|
81
+ smtp.send_message compose, @username, @to
82
+ end
83
+ end
84
+
85
+ def send(to, subject, body, content_type = 'text/plan')
86
+ Net::SMTP.start('smtp.gmail.com', 587, 'gmail.com', @username, @password, :plain) do |smtp|
87
+ msg = "From: #{@username}\r\nTo: #{to}\r\nSubject: #{subject}\r\nContent-Type: #{content_type}\r\n\r\n#{body}"
88
+ smtp.send_message msg, @username, to
89
+ end
90
+ end
91
+ end
92
+
93
+ # Net::SMTP monkeypatching was taken from:
94
+ # http://www.stephenchu.com/2006/06/how-to-use-gmail-smtp-server-to-send.html
95
+ Net::SMTP.class_eval do
96
+ private
97
+ def do_start(helodomain, user, secret, authtype)
98
+ raise IOError, 'SMTP session already started' if @started
99
+ check_auth_args(user, secret) if (user or secret)
100
+
101
+ sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) }
102
+ @socket = Net::InternetMessageIO.new(sock)
103
+ @socket.read_timeout = 60 #@read_timeout
104
+ @socket.debug_output = STDERR #@debug_output
105
+
106
+ check_response(critical { recv_response() })
107
+ do_helo(helodomain)
108
+
109
+ raise 'openssl library not installed' unless defined?(OpenSSL)
110
+ starttls
111
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
112
+ ssl.sync_close = true
113
+ ssl.connect
114
+ @socket = Net::InternetMessageIO.new(ssl)
115
+ @socket.read_timeout = 60 #@read_timeout
116
+ @socket.debug_output = STDERR #@debug_output
117
+ do_helo(helodomain)
118
+
119
+ authenticate user, secret, authtype if user
120
+ @started = true
121
+ ensure
122
+ unless @started
123
+ # authentication failed, cancel connection.
124
+ @socket.close if not @started and @socket and not @socket.closed?
125
+ @socket = nil
126
+ end
127
+ end
128
+
129
+ def do_helo(helodomain)
130
+ begin
131
+ if @esmtp
132
+ ehlo helodomain
133
+ else
134
+ helo helodomain
135
+ end
136
+ rescue Net::ProtocolError
137
+ if @esmtp
138
+ @esmtp = false
139
+ @error_occured = false
140
+ retry
141
+ end
142
+ raise
143
+ end
144
+ end
145
+
146
+ def starttls
147
+ getok('STARTTLS')
148
+ end
149
+
150
+ def quit
151
+ begin
152
+ getok('QUIT')
153
+ rescue EOFError
154
+ end
155
+ end
156
+ end
metadata ADDED
@@ -0,0 +1,56 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: alexmchale-gmail-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Alex McHale
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-03-10 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: alexmchale@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.markdown
24
+ files:
25
+ - VERSION.yml
26
+ - README.markdown
27
+ - lib/gmail.rb
28
+ has_rdoc: true
29
+ homepage: http://github.com/alexmchale/gmail-client
30
+ post_install_message:
31
+ rdoc_options:
32
+ - --inline-source
33
+ - --charset=UTF-8
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: "0"
41
+ version:
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
48
+ requirements: []
49
+
50
+ rubyforge_project:
51
+ rubygems_version: 1.2.0
52
+ signing_key:
53
+ specification_version: 2
54
+ summary: A client to use GMail for sending email.
55
+ test_files: []
56
+