18.04:添加脚本作为“默认邮件处理程序”的选项

18.04:添加脚本作为“默认邮件处理程序”的选项

我编写了一个脚本,希望每次单击 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。

相关内容