-
Notifications
You must be signed in to change notification settings - Fork 0
/
quark-gnus-auto.el
152 lines (138 loc) · 5.96 KB
/
quark-gnus-auto.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
(require 'cl)
(require 'nnir)
(require 'smtpmail-multi)
(defun quark-gnus-auth-sources ()
"Return the list of all auth sources from the .authinfo[.gpg]
Temporary wrapper around auth-source-search to avoid bug #22188 - solved in emacs25"
(auth-source-search :port '(25 587 993 465) :max 999))
(defun quark-gnus-preprocess-email (email)
"Replaces charaters in email address to prepare
it to be interned as a symbol"
(replace-regexp-in-string (regexp-quote "@") "." email nil 'literal))
(defun quark-gnus-is-smtp (source)
"Naive way to determine if the source from .authinfo is an
smtp account"
(let ((host (plist-get source :host))
(port (plist-get source :port)))
(or (and host (string-match "^smtp\\." host))
(and port
(or
(string= port "25")
(string= port "587")
(string= port "465"))))))
(defun quark-gnus-is-nntp (source)
"Naive way to determin if source from .authinfo is an nntp
account"
(let ((host (plist-get source :host))
(port (plist-get source :port)))
(or (and host (or (string-match "^news\\." host)
(string-match "^nntp\\." host)))
(and port (or
(string= port "119")
(string= port "563"))))))
(defun quark-gnus-is-imap (source)
"Naive way to determin if source from .authinfo is an imap
account"
(let ((host (plist-get source :host))
(port (plist-get source :port)))
(or (and host (or (string-match "^imap\\." host)
(string-match "^imappro\\." host)
(string-match "@gmail" host)))
(and port
(or
(string= port "993")
(string= port "143"))))))
(defun quark-gnus-create-smtpmail-multi-accounts (smtps)
"Given the SMTPS - list of smtp accounts from authinfo,
create a variable `smtpmail-multi-accounts' from smtpmail-multi
package, assuming login is the email address.
Best suitable for gmail-like services.
If port is not specified use the 25 port and no encryption.
If port is 587 use starttls encryption."
(let ((accounts nil))
(dolist (source smtps)
(let* ((user (plist-get source :user))
(host (plist-get source :host))
(port-from-source (plist-get source :port))
(port (if port-from-source port-from-source "25")))
(push
`(,user
,host
,(string-to-number port)
,user
,(if (string= port "587") 'starttls 't)
nil nil nil)
accounts)))
`(setq smtpmail-multi-accounts (quote ,(reverse accounts)))))
(defun quark-gnus-create-smtpmail-multi-associations (smtps)
"Given the SMTPS - list of smtp accounts from authinfo, create
a variable `smtpmail-multi-associations' from smtpmail-multi package,
assuming login is the email address."
(let ((accounts nil))
(dolist (source smtps)
(let* ((mail (plist-get source :user))
(symb (quark-gnus-preprocess-email mail)))
(push
`(,mail ,(intern symb))
accounts)))
`(setq smtpmail-multi-associations (quote ,(reverse accounts)))))
(defun quark-gnus-create-gnu-posting-styles (smtps)
"Given the SMTPS - list of smtp accounts from authinfo, create a variable
`gnus-posting-styles' from GNUS package, assuming
login is the email address.
Best suitable for gmail-like services."
(let ((accounts nil))
(dolist (source smtps)
(let ((mail (plist-get source :user)))
(push
`((header "to" ,mail)
(address ,mail))
accounts)
(push
`((header "cc" ,mail)
(address ,mail))
accounts)))
`(setq gnus-posting-styles (quote ,(reverse accounts)))))
(defun quark-gnus-set-gnus-select-method (nntps)
"Given the NNTPS - list of NNTP accounts from authinfo, create a variable
`gnus-select-method' from GNUS package, taking the first NNTP account
from the list. If the list is empty, the variable is not changed."
(when nntps
(let ((nntp (car nntps)))
`(setq gnus-select-method '(nntp ,(plist-get nntp :host))))))
(defun quark-gnus-imap-add-to-gnus-secondary-select-methods (imaps is-gmail)
"Given the IMAPS - list of IMAP accounts from authinfo, append the list
`gnus-secondary-select-methods' from GNUS package with the generated
entries for typical gmail-alike IMAP servers."
(let ((accounts nil))
(dolist (source imaps)
(let ((user (plist-get source :user))
(host (plist-get source :host)))
(if (funcall is-gmail source)
(push
`(add-to-list 'gnus-secondary-select-methods
'(nnimap ,host
(nnimap-address "imap.gmail.com")
(nnimap-server-port "imaps")
(nnimap-stream ssl)
(nnir-search-engine imap)))
accounts)
(push
`(add-to-list 'gnus-secondary-select-methods
'(nnimap ,user
(nnimap-address ,host)
(nnimap-server-port "imaps")
(nnimap-stream ssl)
(nnir-search-engine imap)))
accounts))))
`(progn ,@(reverse accounts))))
(let ((smtps (remove-if-not 'quark-gnus-is-smtp (quark-gnus-auth-sources))))
(eval (quark-gnus-create-smtpmail-multi-accounts smtps))
(eval (quark-gnus-create-smtpmail-multi-associations smtps))
(eval (quark-gnus-create-gnu-posting-styles smtps))
(setq smtpmail-multi-default-account (caar smtpmail-multi-accounts))
(setq user-mail-address (second (car smtpmail-multi-accounts))))
(let ((nntps (remove-if-not 'quark-gnus-is-nntp (quark-gnus-auth-sources))))
(eval (quark-gnus-set-gnus-select-method nntps)))
(let ((imaps (remove-if-not 'quark-gnus-is-imap (quark-gnus-auth-sources))))
(eval (quark-gnus-imap-add-to-gnus-secondary-select-methods imaps (lambda (h) (string-match "gmail" (plist-get h :host))))))