我花了一个多星期的时间来建立一个基于Redmine(Bitnami 3.0.0)的汽车票提交系统,但是有一个问题让我很困惑,直到现在我都在苦苦挣扎。
这是我的背景:
需要建立自动提单系统,并通过一个电子邮件帐户自动创建所有故障单。
首先,我创建了一个用于创建故障单电子邮件地址的Gmail帐户,让我们说“abc@gmail.com”,我的公司电子邮件地址是“sender@abc.com”。所有门票都可以自动创建,无需发送邮件至sender@abc.com至abc@gmail.com
sender@abc.com - > abc@gmail.com - >票证自动创建成功(通过abc@gmail.com创建票证)
但是,为了避免安全问题,需要使用名为ticket@abc.com的公司电子邮件帐户代替gmail帐户。 ticket@abc.com是一个共享邮箱。这是我的测试结果。
sender@abc.com - > ticket@abc.com - >票证自动创建失败(通过ticket@abc.com创建票证)
ticket@abc.com - > sender@abc.com - >票证自动创建失败(通过sender@abc.com创建票证)
abc@gmail.com - > sender@abc.com - >票证自动创建成功(通过sender@abc.com创建票证)
我可以从OWA网页上看到,如果失败,所有新电子邮件都已经通过并“标记为已读”,然后留在邮件服务器中。
这是我的命令:
rake redmine:email:receive_imap unknown_user=accept no_permission_check=1 RAILS_ENV="production" host=imap.abc.com port=143 username=ticket password=xxx project=projectname allow_override=project,subject,status,tracker,priority,category,author,desc,issue --trace
但是,跟踪
没有任何错误C:\Bitnami\redmine-3.0.0-0\apps\redmine\htdocs>rake redmine:email:receive_imap unknown_user=accept no_permission_check=1 RAILS_ENV="production" host=imap.abc.com port=143 username=ticket password=xxx project=projectname allow_override=project,subject,status,tracker,priority,categ
ory,author,desc,issue --trace
DL is deprecated, please use Fiddle
** Invoke redmine:email:receive_imap (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute redmine:email:receive_imap
C:\Bitnami\redmine-3.0.0-0\apps\redmine\htdocs>\
调试级别也已打开。但这里只有我能从production.log中找到,只有我能看到的是“消息xx无法处理”,仅此而已...
Receiving message xx
[1m[36mSetting Load (0.0ms)[0m [1mSELECT `settings`.* FROM `settings` WHERE `settings`.`name` = 'mail_from' ORDER BY `settings`.`id` DESC LIMIT 1[0m
[1m[35mUser Load (1.0ms)[0m SELECT DISTINCT `users`.* FROM `users` INNER JOIN `email_addresses` ON `email_addresses`.`user_id` = `users`.`id` WHERE `users`.`type` IN ('User', 'AnonymousUser') AND (LOWER(address) IN ('sender@abc.com')) ORDER BY `users`.`id` ASC LIMIT 1
Message xx can not be processed
然后,我检查了C:\ Bitnami \ redmine-3.0.0-0 \ apps \ redmine \ htdocs \ lib \ redmine \ imap.rb
if MailHandler.safe_receive(msg, options)
logger.debug "Message #{uid} successfully received" if logger && logger.debug?
if imap_options[:move_on_success]
imap.uid_copy(uid, imap_options[:move_on_success])
end
imap.uid_store(uid, "+FLAGS", [:Seen, :Deleted])
else
logger.debug "Message #{uid} can not be processed" if logger && logger.debug?
imap.uid_store(uid, "+FLAGS", [:Seen])
if imap_options[:move_on_failure]
imap.uid_copy(uid, imap_options[:move_on_failure])
imap.uid_store(uid, "+FLAGS", [:Deleted])
end
end
每次,如果在公司电子邮件地址之间发送邮件,则MailHandler.safe_receive(msg,options)为false。但如果邮件从gmail发送到公司电子邮件地址,则确实如此。
我真的不知道是什么原因造成的,这是我公司邮箱配置的问题吗?我的公司正在使用Exchange Server。
有什么方法可以解决这个问题或任何解决方法吗?非常感谢你!
=============
其他: 我找出导致此问题的原因是因为我的电子邮件内容类型为“text / html”,如果是“text / plain”,则没有任何问题。
以下是我的新发现:
但看起来Redmine支持HTML Only电子邮件,我不知道为什么我的电子邮件无法处理。
以下是“mail_handler.rb”
的代码段parts = if (text_parts = email.all_parts.select {|p| p.mime_type == 'text/plain'}).present? text_parts elsif (html_parts = email.all_parts.select {|p| p.mime_type == 'text/html'}).present? html_parts else [email] end parts.reject! do |part| part.attachment? end @plain_text_body = parts.map do |p| body_charset = Mail::RubyVer.respond_to?(:pick_encoding) ? Mail::RubyVer.pick_encoding(p.charset).to_s : p.charset Redmine::CodesetUtil.to_utf8(p.body.decoded, body_charset) end.join("\r\n") # strip html tags and remove doctype directive if parts.any? {|p| p.mime_type == 'text/html'} @plain_text_body = strip_tags(@plain_text_body.strip) @plain_text_body.sub! %r{^<!DOCTYPE .*$}, '' end
即使我的电子邮件是“Content-Type:text / html; charset = us-ascii”,它仍然无法处理。由Outlook 2010测试
是否有人有类似的问题或解决方案?谢谢!
答案 0 :(得分:1)
我遇到了同样的问题,并且在没有找到任何解决方案的情况下专注于Redmine很多天。
最后,我决定查看我的Exchange Online参数并修改了用于Redmine的IMAP电子邮件帐户。
以下是使用Powershell连接到Exchange Online的链接: http://community.office365.com/en-us/f/158/t/158857.aspx
当然,如果您不使用此Exchange版本,则应该可以直接访问它。
以下是在Powershell中执行的将电子邮件转换为纯文本而非默认HTML的行:
Set-CASMailbox xxxx@yyyyyy.zz -ImapMessagesRetrievalMimeFormat TextOnly -imapUseProtocolDefaults $false
然后您可以使用以下行检查结果:
get-casmailbox xxxx@yyyyyy.zz | format-list imap*
我希望它可以帮助您解决问题!