18.04: Добавить сценарий в качестве опции для «Обработчика почты по умолчанию»

У меня есть написанный мной сценарий, который я хотел бы использовать всякий раз, когда я нажимаю ссылку mailto :. Это означает, что мне нужно выбрать его в качестве обработчика почты по умолчанию в моих приложениях по умолчанию.

Но как мне зарегистрировать обработчик mailto, чтобы я мог выбирать его в приложениях по умолчанию?

Используя Ubuntu 18.04, не виртуализированный.

Я не использую конкретное почтовое приложение, я пытаюсь написать сценарий, который будет обрабатывать ссылки mailto за меня (например, используя разные почтовые клиенты для разных доменов назначения), но мне нужно убедить Ubuntu, что этот сценарий вариант для почтового приложения по умолчанию

2
задан 20 February 2020 в 19:02

1 ответ

Благодаря @danzel я обнаружил, что ответ действительно заключается в использовании файла .desktop.

Поэтому я создал простой скрипт, который позволяет указать набор разных почтовых программ — я использую свою рабочую почту (Outlook для Интернета), личную почту (через 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:addr@some.com?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.

0
ответ дан 21 February 2020 в 07:20

Другие вопросы по тегам:

Похожие вопросы: