Class: Mailer
- Inherits:
-
Object
- Object
- Mailer
- Defined in:
- lib/mailer.rb
Instance Method Summary collapse
-
#add_content(mail, article) ⇒ Object
添加邮件的主体内容,包括body/处理附件等.
-
#add_pictures(mail, article, body) ⇒ Object
添加附件, 并返回替换后的body.
-
#alarm(relative_path, subject, to) ⇒ Object
警示用户,由用户确定是否发送.
-
#covert_date_macro(subject) ⇒ Object
将标题中的日期宏,转换为对应的日期.
-
#get_ad ⇒ Object
添加广告.
-
#get_article(md_file) ⇒ Object
获取将要发送的markdown文件.
- #get_from ⇒ Object
-
#get_password ⇒ Object
获取用户的密码,如果用户使用了密码进行加密,则提示用户输入密钥.
-
#get_subject(subject, article) ⇒ Object
优先读取用户指定的,然后读取文章中指定的subject,再读取配置文件中的.
-
#get_to(to, article) ⇒ Object
获取邮件接收人.
-
#initialize ⇒ Mailer
constructor
A new instance of Mailer.
-
#send(to, md_file, subject, silent = false) ⇒ Object
发送邮件.
-
#set_mail_defaults ⇒ Object
设置邮件的默认配置.
Constructor Details
#initialize ⇒ Mailer
Returns a new instance of Mailer.
12 13 14 15 16 17 18 19 20 21 22 23 24 |
# File 'lib/mailer.rb', line 12 def initialize @util = Util.instance @mail_config = Setup.instance.get_merged_config['mail'] #检查邮件的配置信息 Setup.instance.check_mail_setup #扫描所有文件 scan = Scan.new scan.execute @store = Store.new scan.files @compiler = Compiler.new end |
Instance Method Details
#add_content(mail, article) ⇒ Object
添加邮件的主体内容,包括body/处理附件等
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/mailer.rb', line 54 def add_content(mail, article) #获取body的内容 data = { "article" => article } body = @compiler.execute 'mail', data, false body = body + self.get_ad #分析出图片列表 body = self.add_pictures mail, article, body #添加邮件的HTML内容 mail.html_part = Mail::Part.new do content_type 'text/html; charset=UTF-8' body body end end |
#add_pictures(mail, article, body) ⇒ Object
添加附件, 并返回替换后的body
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/mailer.rb', line 27 def add_pictures(mail, article, body) images = body.scan(/<img.+src=["'](.+?)['"]/i) return body if images.length == 0 root = Pathname.new File::dirname(article['file']) #去重,并去掉非相对路径的 list = Hash.new images.each { | line | image = line[0] next if not /^[\.\/]/ =~ image #将全路径作为key,达到去重的效果 file = (root + Pathname.new(image)).to_s list[file] = image } #遍历所有图片,添加到附件 list.each do |file, src| mail.add_file file cid = mail..last.cid body = body.gsub(src, 'CID:' + cid) end body end |
#alarm(relative_path, subject, to) ⇒ Object
警示用户,由用户确定是否发送
191 192 193 194 195 196 197 198 199 200 201 202 |
# File 'lib/mailer.rb', line 191 def alarm(relative_path, subject, to) puts "您确定要发送这封邮件吗?" puts "邮件标题:#{subject}" puts "Markdown:#{relative_path}" puts "收件人:#{to}" puts "" #提示用户是否需要发送 result = ask("确认发送请按y或者回车,取消请按其它键", lambda { |yn| yn.downcase[0] == ?y or yn == ''}) @util.error '您中止了邮件的发送' if not result end |
#covert_date_macro(subject) ⇒ Object
将标题中的日期宏,转换为对应的日期
183 184 185 186 187 188 |
# File 'lib/mailer.rb', line 183 def covert_date_macro(subject) format = @mail_config['format'] || '%Y-%m-%d' subject = subject.gsub('$now', Date.today.strftime(format)) subject = subject.gsub('$last_week', (Date.today - 7).strftime(format)) subject end |
#get_ad ⇒ Object
添加广告
110 111 112 113 114 115 116 117 118 |
# File 'lib/mailer.rb', line 110 def get_ad() <<EOF <div class="product" style="background-color: rgba(204, 204, 204, 0.26);padding: 4px 10px; text-align: right; font-size: 12px;"> 本邮件由 <a href="https://github.com/wvv8oo/m2m" target="_blank">m2m</a> 根据Markdown自动转换并发送 </div> EOF end |
#get_article(md_file) ⇒ Object
获取将要发送的markdown文件
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'lib/mailer.rb', line 136 def get_article(md_file) items = @store.get_children() return @util.error '没有找到任何的Markdown文件' if items.length == 0 #如果用户没有指定, 则取最新的 return @store.articles[items[0]] if not md_file special_article = nil index = 0 begin key = items[index] article = @store.articles[key] file = article['file'] relative_path = @util.get_relative_path file, @util.workbench special_article = article if relative_path == md_file index += 1 end while special_article == nil and index < items.length @util.error "当前目录下未找到Markdown文件 => #{md_file}" if not special_article return special_article end |
#get_from ⇒ Object
176 177 178 179 180 |
# File 'lib/mailer.rb', line 176 def get_from from = @mail_config['from'] from = @mail_config['account'] if not from from end |
#get_password ⇒ Object
获取用户的密码,如果用户使用了密码进行加密,则提示用户输入密钥
73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/mailer.rb', line 73 def get_password safer = @mail_config['safer'] password = @mail_config['password'] encrypt_key = nil if safer = "请输入加密您密码的钥匙" encript_key = ask(, String){|q| q.echo = '*' } end @util.decrypt password, encript_key end |
#get_subject(subject, article) ⇒ Object
优先读取用户指定的,然后读取文章中指定的subject,再读取配置文件中的
162 163 164 165 166 167 168 169 170 171 172 173 174 |
# File 'lib/mailer.rb', line 162 def get_subject(subject, article) = article['meta'] #读取文章中mate的,如果在命令行没有指定主题 subject = ['subject'] if not subject and ['subject'] #文章中没有,则使用配置文件中的 subject = @mail_config['subject'] if not subject #配置文件也没有,则使用title,article无论如何都会有title的 subject = ['title'] if not subject self.covert_date_macro subject end |
#get_to(to, article) ⇒ Object
获取邮件接收人
121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/mailer.rb', line 121 def get_to(to, article) = article['meta'] #优先取meta中的to to = ['to'] if not to and ['to'] #如果meta没有to,且用户也没有指定to,则使用 to = @mail_config['to'] if not to #依然没有找到收件人 return @util.error '邮件接收人无效,可使用-a参数指定收件人' if not to to = [to] if to.class == String to end |
#send(to, md_file, subject, silent = false) ⇒ Object
发送邮件
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 |
# File 'lib/mailer.rb', line 205 def send(to, md_file, subject, silent = false) article = self.get_article md_file from = self.get_from to = self.get_to to, article subject = self.get_subject subject, article relative_path = @util.get_relative_path article['file'], @util.workbench #配置邮件信息 self.set_mail_defaults #警示用户是否需要发送 self.alarm relative_path, subject, to if not silent #创建一个mail的实例,以后再添加附件和html内容 mail = Mail.new do from from to to subject subject end self.add_content mail, article # @util.write_file './send.log', mail.parts.last.decoded mail.deliver puts "恭喜,您的邮件发送成功" puts "邮件标题:#{subject}" puts "Markdown:#{relative_path}" puts "收件人:#{to}" end |
#set_mail_defaults ⇒ Object
设置邮件的默认配置
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/mailer.rb', line 89 def set_mail_defaults smtp_server = @mail_config['smtp_server'] port = @mail_config['port'] username = @mail_config['username'] ssl = @mail_config['ssl'] == 'y' password = self.get_password #配置邮件参数 Mail.defaults do delivery_method :smtp, { :address => smtp_server, :port => port, :user_name => username, :password => password, :ssl => ssl, :enable_starttls_auto => true } end end |