我编写了一个脚本,希望每次单击 mailto: 链接时都会使用该脚本。这意味着我需要在我的默认应用程序中将其选为默认邮件处理程序。
但是我如何注册一个 mailto 处理程序以便可以在默认应用程序中选择它?
使用 Ubuntu 18.04,未虚拟化。
我没有使用特定的邮件应用程序,而是尝试编写一个脚本来为我处理 mailto 链接(例如,对不同的目标域使用不同的邮件客户端),但我需要让 Ubuntu 相信这个脚本是默认邮件应用程序的一个选项
答案1
感谢@danzel,我发现答案确实是使用.desktop 文件。
因此,我创建了一个简单的脚本,允许您指定一组不同的邮件程序 - 我使用我的工作电子邮件(Outlook for web)、我的个人电子邮件(通过 ssh)以及有时的 gmail。
代码如下:
#!/usr/bin/ruby
# 1) Put "mailto.desktop" in /usr/share/applications
# 2) sudo update-desktop-database
# 3) System Prefs -> Details -> Default Applications
require 'uri'
# %SUBJECT% decoded subject, i.e.: "Hey guys!"
# %subject% encoded subject, i.e.: "Hey%20guys%21"
# Same for %to% and %body%
# Also %mailto% for initial value of "mailto:..."
MAILERS = {
'Home' => ['ssh','-t','my-home-server.com','elm','-s','"%subject%"','%to%'],
'Work' => ['browser','https://outlook.office.com/?path=/mail/action/compose&to=%mailto%'],
'Gmail' => ['browser','https://mail.google.com/mail/u/0/?&view=cm&fs=1&to=%TO%&su=%SUBJECT%&body=%BODY%']
}
def fatal(title,message)
system('zenity','--width','400','--height','250','--error','--title',title,'--text',message)
exit -1
end
def clean(str)
#'"'+str+'"'
str.sub(/"/,'')
end
#########################
# Figure out mailto:
#########################
mailtoStr=ARGV.join('')
mailtoStr.sub!(/^mailto:/,'')
mailto = mailtoStr.split(/[\?\&]/)
mailtoStr.sub!(/\?/,'&') # Outlook is confused if you use: 'mailto:[email protected]?subject=...' instead of '..&subject..'
mailHash = Hash.new
mailto.each { |m|
m.match(/^([^=]+)=(.*)/m)
key,val = $1,$2
key,val = 'to',m unless key
mailHash[key.upcase] = clean(val)
mailHash[key.downcase] = clean(URI.decode(val))
}
fatal("No 'to' specified",'Need to specify an address in the mailto') unless mailHash['to']
FIELDS = %w(to body subject mailto)
def sendInfo(mailHash,mailtoStr,field)
return '' unless field
return mailtoStr if field=='mailto'
return '%'+field+'%' unless FIELDS.index(field.downcase)
mailHash[field] || ''
end
#########################
# Pick mailer
#########################
mailer = 'Work' if mailHash['to'].match(/@my-work-domain.com$/)
mailer ||= `zenity --width 400 --height 250 --title "Mailer select" --text "Choose mailer for #{mailHash['to']}:" --list --column "Mailer" #{MAILERS.keys.map { |m| '"'+m+'"' }.join(' ')}`
mailer.chomp!
fatal('Unknown Mailer',"Don't know mailer selection #{mailer} or no mailer selected") unless MAILERS[mailer]
cmd = MAILERS[mailer]
cmd.each { |c|
c.gsub!(/%([^%]+)%/) { sendInfo(mailHash,mailtoStr,$1) }
}
#p cmd
system(*cmd)
# Sometimes ssh is broken on my system...
system(*cmd) if cmd[0].match(/ssh/) && $?.exitstatus!=0
并且 mailto.desktop 位于 /usr/share/applications 中:
[Desktop Entry]
Encoding=UTF-8
Name=Custom mailto Mail Handler
Comment=Handle mailto links
GenericName=Mail Client
Keywords=Email;E-mail
Exec=/home/dave/bin/mailto %u
Terminal=true
X-MultipleArgs=false
Type=Application
Icon=mail-send
Categories=Application;Network;Email;
MimeType=x-scheme-handler/mailto;application/x-xpinstall;
StartupNotify=true
我有“Terminal=true”,因为我使用 ssh,这就是 ssh 窗口的位置,否则终端窗口会很快消失。如果您不使用任何基于终端的邮件程序,您可以将其设置为 false。