bouncestudio 0.0.2

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,2 @@
1
+ 2/27/07: Slight change to prevent calling bsBounceStudio_init() multiple times. Caused massive memory usage.
2
+ 2/6/07: Initial upload to RubyForge
@@ -0,0 +1,13 @@
1
+ Rakefile
2
+ README.txt
3
+ CHANGELOG.txt
4
+ Manifest.txt
5
+ setup.rb
6
+ lib/bouncestudio/version.rb
7
+ lib/bouncestudio.rb
8
+ test/test_helper.rb
9
+ test/bouncestudio_test.rb
10
+ test/raw_message.txt
11
+ ext/bounce_studio.c
12
+ ext/extconf.rb
13
+ ext/Makefile
@@ -0,0 +1,100 @@
1
+ README for bouncestudio
2
+ =======================
3
+
4
+ == DESCRIPTION
5
+
6
+ The bouncestudio ruby extension wraps the Bounce Studio C API
7
+ from Boogie Tools, Inc. This allows a simple method of determining
8
+ if a given raw email message is a hard bounce, an "over quota"
9
+ bounce, etc.
10
+
11
+ == SYNOPSIS
12
+
13
+ # Rubygems magic
14
+ require 'rubygems'
15
+ require 'bouncestudio'
16
+
17
+ # First, set your license. If you don't have a BounceStudio license
18
+ # from BoogieTools, you can still test out the software. It'll just be
19
+ # too slow for production use. Go to http://www.boogietools.com/ to learn
20
+ # more. Using an environment variable is recommended to keep your license
21
+ # code out of your source.
22
+ BS_LICENSE = ENV["BS_LICENSE"] || ""
23
+
24
+ # Create the BounceStudio worker
25
+ bs = BoogieTools::BounceStudio.new(BS_LICENSE)
26
+
27
+ # Get your message, from a file, with Net::POP, etc
28
+ raw_message = "Subject: I love you"
29
+
30
+ # Issue the check.
31
+ result = bs.check(raw_message)
32
+
33
+ # If you're not licensed, this is where you'll get a delay and
34
+ # the following message:
35
+ #
36
+ # Thank you for trying the BounceStudio API.
37
+ # To register, please visit http://www.boogietools.com.
38
+
39
+
40
+ # Do whatever you want based on the following result codes.
41
+
42
+ # Type Description
43
+ # 0 NON BOUNCE
44
+ # 10 HARD BOUNCE
45
+ # 20 SOFT BOUNCE - General
46
+ # 21 SOFT BOUNCE - Dns Failure
47
+ # 22 SOFT BOUNCE - Mailbox Full
48
+ # 23 SOFT BOUNCE - Message Size Too Large
49
+ # 30 BOUNCE WITH NO EMAIL ADDRESS
50
+ # 40 GENERAL BOUNCE
51
+ # 50 MAIL BLOCK - General
52
+ # 51 MAIL BLOCK - Known Spammer
53
+ # 52 MAIL BLOCK - Spam Detected
54
+ # 53 MAIL BLOCK - Attachment Detected
55
+ # 54 MAIL BLOCK - Relay Denied
56
+ # 60 AUTO REPLY
57
+ # 70 TRANSIENT BOUNCE
58
+ # 80 SUBSCRIBE REQUEST
59
+ # 90 UNSUBSCRIBE REQUEST
60
+ # 100 CHALLENGE RESPONSE
61
+
62
+
63
+ == REQUIREMENTS
64
+
65
+ Besides Ruby and Rubygems, you'll of course need the BounceStudio
66
+ library. It is available for Linux or Windows. This wrapper has only
67
+ been tested with the Linux version.
68
+
69
+ == INSTALL
70
+
71
+ Using Rubygems:
72
+
73
+ * sudo gem install bouncestudio
74
+
75
+ == LICENSE
76
+
77
+ (The MIT License)
78
+
79
+ Copyright (c) 2007 BoogieTools, Inc.
80
+
81
+ Permission is hereby granted, free of charge, to any person obtaining
82
+ a copy of this software and associated documentation files (the
83
+ "Software"), to deal in the Software without restriction, including
84
+ without limitation the rights to use, copy, modify, merge, publish,
85
+ distribute, sublicense, and/or sell copies of the Software, and to
86
+ permit persons to whom the Software is furnished to do so, subject to
87
+ the following conditions:
88
+
89
+ The above copyright notice and this permission notice shall be
90
+ included in all copies or substantial portions of the Software.
91
+
92
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
93
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
94
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
95
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
96
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
97
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
98
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
99
+
100
+
@@ -0,0 +1,54 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/clean'
4
+ require 'rake/testtask'
5
+ require 'rake/packagetask'
6
+ require 'rake/gempackagetask'
7
+ require 'rake/rdoctask'
8
+ require 'rake/contrib/rubyforgepublisher'
9
+ require 'fileutils'
10
+ require 'hoe'
11
+ include FileUtils
12
+ require File.join(File.dirname(__FILE__), 'lib', 'bouncestudio', 'version')
13
+
14
+ AUTHOR = "Joshua Warchol" # can also be an array of Authors
15
+ EMAIL = "joshua@zaadz.com"
16
+ DESCRIPTION = "A Ruby API wrapping the BounceStudio library from Boogie Tools"
17
+ GEM_NAME = "bouncestudio" # what ppl will type to install your gem
18
+ RUBYFORGE_PROJECT = "bouncestudio" # The unix name for your project
19
+ HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
20
+
21
+
22
+ NAME = "bouncestudio"
23
+ REV = nil # UNCOMMENT IF REQUIRED: File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
24
+ VERS = ENV['VERSION'] || (Bouncestudio::VERSION::STRING + (REV ? ".#{REV}" : ""))
25
+ CLEAN.include ['**/.*.sw?', '*.gem', '.config']
26
+ RDOC_OPTS = ['--quiet', '--title', "bouncestudio documentation",
27
+ "--opname", "index.html",
28
+ "--line-numbers",
29
+ "--main", "README",
30
+ "--inline-source"]
31
+
32
+ class Hoe
33
+ def extra_deps
34
+ @extra_deps.reject { |x| Array(x).first == 'hoe' }
35
+ end
36
+ end
37
+
38
+ # Generate all the Rake tasks
39
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
40
+ hoe = Hoe.new(GEM_NAME, VERS) do |p|
41
+ p.author = AUTHOR
42
+ p.description = DESCRIPTION
43
+ p.email = EMAIL
44
+ p.summary = DESCRIPTION
45
+ p.url = HOMEPATH
46
+ p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
47
+ p.test_globs = ["test/**/*_test.rb"]
48
+ p.clean_globs = CLEAN #An array of file patterns to delete on clean.
49
+
50
+ # == Optional
51
+ #p.changes - A description of the release's latest changes.
52
+ #p.extra_deps - An array of rubygem dependencies.
53
+ p.spec_extras = {:extensions => ["ext/extconf.rb"]}
54
+ end
@@ -0,0 +1,139 @@
1
+
2
+ SHELL = /bin/sh
3
+
4
+ #### Start of system configuration section. ####
5
+
6
+ srcdir = .
7
+ topdir = /usr/lib/ruby/1.8/i486-linux
8
+ hdrdir = $(topdir)
9
+ VPATH = $(srcdir):$(topdir):$(hdrdir)
10
+ prefix = $(DESTDIR)/usr
11
+ exec_prefix = $(prefix)
12
+ sitedir = $(DESTDIR)/usr/local/lib/site_ruby
13
+ rubylibdir = $(libdir)/ruby/$(ruby_version)
14
+ archdir = $(rubylibdir)/$(arch)
15
+ sbindir = $(exec_prefix)/sbin
16
+ datadir = $(prefix)/share
17
+ includedir = $(prefix)/include
18
+ infodir = $(prefix)/info
19
+ sysconfdir = $(DESTDIR)/etc
20
+ mandir = $(datadir)/man
21
+ libdir = $(exec_prefix)/lib
22
+ sharedstatedir = $(prefix)/com
23
+ oldincludedir = $(DESTDIR)/usr/include
24
+ sitearchdir = $(sitelibdir)/$(sitearch)
25
+ bindir = $(exec_prefix)/bin
26
+ localstatedir = $(DESTDIR)/var
27
+ sitelibdir = $(sitedir)/$(ruby_version)
28
+ libexecdir = $(exec_prefix)/libexec
29
+
30
+ CC = gcc
31
+ LIBRUBY = $(LIBRUBY_SO)
32
+ LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
33
+ LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
34
+ LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static
35
+
36
+ CFLAGS = -fPIC -Wall -g -O2 -fPIC
37
+ CPPFLAGS = -I. -I$(topdir) -I$(hdrdir) -I$(srcdir)
38
+ CXXFLAGS = $(CFLAGS)
39
+ DLDFLAGS =
40
+ LDSHARED = $(CC) -shared
41
+ AR = ar
42
+ EXEEXT =
43
+
44
+ RUBY_INSTALL_NAME = ruby1.8
45
+ RUBY_SO_NAME = ruby1.8
46
+ arch = i486-linux
47
+ sitearch = i486-linux
48
+ ruby_version = 1.8
49
+ ruby = /usr/bin/ruby1.8
50
+ RUBY = $(ruby)
51
+ RM = rm -f
52
+ MAKEDIRS = mkdir -p
53
+ INSTALL = /usr/bin/install -c
54
+ INSTALL_PROG = $(INSTALL) -m 0755
55
+ INSTALL_DATA = $(INSTALL) -m 644
56
+ COPY = cp
57
+
58
+ #### End of system configuration section. ####
59
+
60
+ preload =
61
+
62
+ libpath = $(libdir)
63
+ LIBPATH = -L"$(libdir)"
64
+ DEFFILE =
65
+
66
+ CLEANFILES =
67
+ DISTCLEANFILES =
68
+
69
+ extout =
70
+ extout_prefix =
71
+ target_prefix =
72
+ LOCAL_LIBS =
73
+ LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl -lcrypt -lm -lc -lBounceStudio
74
+ SRCS = bounce_studio.c
75
+ OBJS = bounce_studio.o
76
+ TARGET = bounce_studio
77
+ DLLIB = $(TARGET).so
78
+ STATIC_LIB =
79
+
80
+ RUBYCOMMONDIR = $(sitedir)$(target_prefix)
81
+ RUBYLIBDIR = $(sitelibdir)$(target_prefix)
82
+ RUBYARCHDIR = $(sitearchdir)$(target_prefix)
83
+
84
+ TARGET_SO = $(DLLIB)
85
+ CLEANLIBS = $(TARGET).so $(TARGET).il? $(TARGET).tds $(TARGET).map
86
+ CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak
87
+
88
+ all: $(DLLIB)
89
+ static: $(STATIC_LIB)
90
+
91
+ clean:
92
+ @-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)
93
+
94
+ distclean: clean
95
+ @-$(RM) Makefile extconf.h conftest.* mkmf.log
96
+ @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
97
+
98
+ realclean: distclean
99
+ install: install-so install-rb
100
+
101
+ install-so: $(RUBYARCHDIR)
102
+ install-so: $(RUBYARCHDIR)/$(DLLIB)
103
+ $(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
104
+ $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
105
+ install-rb: pre-install-rb install-rb-default
106
+ install-rb-default: pre-install-rb-default
107
+ pre-install-rb: Makefile
108
+ pre-install-rb-default: Makefile
109
+ $(RUBYARCHDIR):
110
+ $(MAKEDIRS) $@
111
+
112
+ site-install: site-install-so site-install-rb
113
+ site-install-so: install-so
114
+ site-install-rb: install-rb
115
+
116
+ .SUFFIXES: .c .m .cc .cxx .cpp .C .o
117
+
118
+ .cc.o:
119
+ $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
120
+
121
+ .cxx.o:
122
+ $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
123
+
124
+ .cpp.o:
125
+ $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
126
+
127
+ .C.o:
128
+ $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
129
+
130
+ .c.o:
131
+ $(CC) $(CFLAGS) $(CPPFLAGS) -c $<
132
+
133
+ $(DLLIB): $(OBJS)
134
+ @-$(RM) $@
135
+ $(LDSHARED) $(DLDFLAGS) $(LIBPATH) -o $@ $(OBJS) $(LOCAL_LIBS) $(LIBS)
136
+
137
+
138
+
139
+ $(OBJS): ruby.h defines.h
@@ -0,0 +1,239 @@
1
+ #include "ruby.h"
2
+ #include "BounceStudio.h"
3
+
4
+ /*
5
+ Type Description
6
+ 0 NON BOUNCE
7
+ 10 HARD BOUNCE
8
+ 20 SOFT BOUNCE - General
9
+ 21 SOFT BOUNCE - Dns Failure
10
+ 22 SOFT BOUNCE - Mailbox Full
11
+ 23 SOFT BOUNCE - Message Size Too Large
12
+ 30 BOUNCE WITH NO EMAIL ADDRESS
13
+ 40 GENERAL BOUNCE
14
+ 50 MAIL BLOCK - General
15
+ 51 MAIL BLOCK - Known Spammer
16
+ 52 MAIL BLOCK - Spam Detected
17
+ 53 MAIL BLOCK - Attachment Detected
18
+ 54 MAIL BLOCK - Relay Denied
19
+ 60 AUTO REPLY
20
+ 70 TRANSIENT BOUNCE
21
+ 80 SUBSCRIBE REQUEST
22
+ 90 UNSUBSCRIBE REQUEST
23
+ 100 CHALLENGE RESPONSE
24
+ */
25
+
26
+ /*
27
+ * BounceStudio.new()
28
+ */
29
+ static char *license;
30
+ static int bs_initialized;
31
+
32
+ static VALUE rb_bs_init(VALUE self, VALUE lic_string) {
33
+ if( bs_initialized != 1 ) {
34
+ bsBounceStudio_init();
35
+ bs_initialized = 1;
36
+ }
37
+ license = StringValuePtr(lic_string);
38
+ return Qtrue;
39
+ }
40
+
41
+ /*
42
+ * BounceStudio#check(raw)
43
+ * wraps C bsBounceCheck()
44
+ */
45
+ static VALUE rb_bs_check(VALUE self, VALUE raw) {
46
+ int BounceCode;
47
+ char *RawMessage, *EmailAddress;
48
+
49
+ RawMessage = StringValuePtr(raw);
50
+
51
+ BounceCode = bsBounceCheck(RawMessage, &EmailAddress, "", license);
52
+
53
+ return INT2NUM(BounceCode);
54
+ }
55
+
56
+ /*
57
+ * BounceStudio#get_body(raw)
58
+ * wraps C bsGetBody()
59
+ */
60
+ static VALUE rb_bs_body(VALUE self, VALUE raw) {
61
+ char *RawMessage;
62
+ char *ReturnValue = NULL;
63
+
64
+ RawMessage = StringValuePtr(raw);
65
+ bsGetBody(RawMessage, &ReturnValue);
66
+
67
+ return rb_str_new2(ReturnValue);
68
+ }
69
+
70
+ /*
71
+ * BounceStudio#from_address(raw)
72
+ * wraps C bsGetFromAddress()
73
+ */
74
+ static VALUE rb_bs_from_address(VALUE self, VALUE raw) {
75
+ char *RawMessage;
76
+ char *ReturnValue = NULL;
77
+
78
+ RawMessage = StringValuePtr(raw);
79
+ bsGetFromAddress(RawMessage, &ReturnValue);
80
+
81
+ return rb_str_new2(ReturnValue);
82
+ }
83
+
84
+ /*
85
+ * BounceStudio#from_friendly_name(raw)
86
+ * wraps C bsGetFromFriendlyName()
87
+ */
88
+ static VALUE rb_bs_from_friendly_name(VALUE self, VALUE raw) {
89
+ char *RawMessage;
90
+ char *ReturnValue = NULL;
91
+
92
+ RawMessage = StringValuePtr(raw);
93
+ bsGetFromFriendlyName(RawMessage, &ReturnValue);
94
+
95
+ return rb_str_new2(ReturnValue);
96
+ }
97
+
98
+ /*
99
+ * BounceStudio#header(raw)
100
+ * wraps C bsGetHeader()
101
+ */
102
+ static VALUE rb_bs_header(VALUE self, VALUE raw) {
103
+ char *RawMessage;
104
+ char *ReturnValue = NULL;
105
+
106
+ RawMessage = StringValuePtr(raw);
107
+ bsGetHeader(RawMessage, &ReturnValue);
108
+
109
+ return rb_str_new2(ReturnValue);
110
+ }
111
+
112
+ /*
113
+ * BounceStudio#reply_to_address(raw)
114
+ * wraps C bsGetReplyToAddress()
115
+ */
116
+ static VALUE rb_bs_reply_to_address(VALUE self, VALUE raw) {
117
+ char *RawMessage;
118
+ char *ReturnValue = NULL;
119
+
120
+ RawMessage = StringValuePtr(raw);
121
+ bsGetReplyToAddress(RawMessage, &ReturnValue);
122
+
123
+ return rb_str_new2(ReturnValue);
124
+ }
125
+
126
+ /*
127
+ * BounceStudio#reply_to_friendly_name(raw)
128
+ * wraps C bsGetReplyToFriendlyName()
129
+ */
130
+ static VALUE rb_bs_reply_to_friendly_name(VALUE self, VALUE raw) {
131
+ char *RawMessage;
132
+ char *ReturnValue = NULL;
133
+
134
+ RawMessage = StringValuePtr(raw);
135
+ bsGetReplyToFriendlyName(RawMessage, &ReturnValue);
136
+
137
+ return rb_str_new2(ReturnValue);
138
+ }
139
+
140
+ /*
141
+ * BounceStudio#subject(raw)
142
+ * wraps C bsGetSubject()
143
+ */
144
+ static VALUE rb_bs_subject(VALUE self, VALUE raw) {
145
+ char *RawMessage;
146
+ char *ReturnValue = NULL;
147
+
148
+ RawMessage = StringValuePtr(raw);
149
+ bsGetSubject(RawMessage, &ReturnValue);
150
+
151
+ return rb_str_new2(ReturnValue);
152
+ }
153
+
154
+ /*
155
+ * BounceStudio#to_address(raw)
156
+ * wraps C bsGetToAddress()
157
+ */
158
+ static VALUE rb_bs_to_address(VALUE self, VALUE raw) {
159
+ char *RawMessage;
160
+ char *ReturnValue = NULL;
161
+
162
+ RawMessage = StringValuePtr(raw);
163
+ bsGetToAddress(RawMessage, &ReturnValue);
164
+
165
+ return rb_str_new2(ReturnValue);
166
+ }
167
+
168
+ /*
169
+ * BounceStudio#to_friendly_name(raw)
170
+ * wraps C bsGetToFriendlyName()
171
+ */
172
+ static VALUE rb_bs_to_friendly_name(VALUE self, VALUE raw) {
173
+ char *RawMessage;
174
+ char *ReturnValue = NULL;
175
+
176
+ RawMessage = StringValuePtr(raw);
177
+ bsGetToFriendlyName(RawMessage, &ReturnValue);
178
+
179
+ return rb_str_new2(ReturnValue);
180
+ }
181
+
182
+ /*
183
+ * BounceStudio#custom_header(raw)
184
+ * wraps C bsGetCustomHeader()
185
+ */
186
+ static VALUE rb_bs_custom_header(VALUE self, VALUE raw, VALUE header) {
187
+ char *RawMessage;
188
+ char *Header;
189
+ char *ReturnValue = NULL;
190
+
191
+ RawMessage = StringValuePtr(raw);
192
+ Header = StringValuePtr(header);
193
+ bsGetCustomHeader(RawMessage, &ReturnValue, Header);
194
+
195
+ return rb_str_new2(ReturnValue);
196
+ }
197
+
198
+ /*
199
+ * BounceStudio#orig_custom_header(raw)
200
+ * wraps C bsGetOrigCustomHeader()
201
+ */
202
+ static VALUE rb_bs_orig_custom_header(VALUE self, VALUE raw, VALUE header) {
203
+ char *RawMessage;
204
+ char *Header;
205
+ char *ReturnValue = NULL;
206
+
207
+ RawMessage = StringValuePtr(raw);
208
+ Header = StringValuePtr(header);
209
+ bsGetOrigCustomHeader(RawMessage, &ReturnValue, Header);
210
+
211
+ return rb_str_new2(ReturnValue);
212
+ }
213
+
214
+ /*
215
+ * Extention initializer
216
+ */
217
+ void Init_bounce_studio() {
218
+ VALUE boogie_tools_mod =
219
+ rb_define_module("BoogieTools");
220
+
221
+ VALUE bs_class =
222
+ rb_define_class_under(boogie_tools_mod,
223
+ "BounceStudio", rb_cObject);
224
+
225
+ rb_define_method(bs_class, "initialize", rb_bs_init, 1);
226
+ rb_define_method(bs_class, "check", rb_bs_check, 1);
227
+ rb_define_method(bs_class, "body", rb_bs_body, 1);
228
+ rb_define_method(bs_class, "from_address", rb_bs_from_address, 1);
229
+ rb_define_method(bs_class, "from_friendly_name", rb_bs_from_friendly_name, 1);
230
+ rb_define_method(bs_class, "header", rb_bs_header, 1);
231
+ rb_define_method(bs_class, "reply_to_address", rb_bs_reply_to_address, 1);
232
+ rb_define_method(bs_class, "reply_to_friendly_name", rb_bs_reply_to_friendly_name, 1);
233
+ rb_define_method(bs_class, "subject", rb_bs_subject, 1);
234
+ rb_define_method(bs_class, "to_address", rb_bs_to_address, 1);
235
+ rb_define_method(bs_class, "to_friendly_name", rb_bs_to_friendly_name, 1);
236
+ rb_define_method(bs_class, "custom_header", rb_bs_custom_header, 2);
237
+ rb_define_method(bs_class, "orig_custom_header", rb_bs_orig_custom_header, 2);
238
+ }
239
+