+ (gnus-message 6
+ "Reporting %s article %d to <%s>..."
+ (if ham "ham" "spam")
+ article spam-report-resend-to)
+ (unless spam-report-resend-to
+ (customize-set-variable
+ spam-report-resend-to
+ (read-from-minibuffer "email address to resend SPAM/HAM to? ")))
+ ;; This is ganked from the `gnus-summary-resend-message' function.
+ ;; It involves rendering the SPAM, which is undesirable, but there does
+ ;; not seem to be a nicer way to achieve this.
+ ;; select this particular article
+ (gnus-summary-select-article nil nil nil article)
+ ;; resend it to the destination address
+ (save-excursion
+ (set-buffer gnus-original-article-buffer)
+ (message-resend spam-report-resend-to))))
+
+(defun spam-report-resend-ham (articles)
+ "Report an article as ham by resending via email."
+ (spam-report-resend articles t))
+
+(defun spam-report-gmane-ham (&rest articles)
+ "Report ARTICLES as ham (unregister) through Gmane."
+ (interactive (gnus-summary-work-articles current-prefix-arg))
+ (dolist (article articles)
+ (spam-report-gmane-internal t article)))
+
+(defun spam-report-gmane-spam (&rest articles)
+ "Report ARTICLES as spam through Gmane."
+ (interactive (gnus-summary-work-articles current-prefix-arg))
+ (dolist (article articles)
+ (spam-report-gmane-internal nil article)))
+
+;; `spam-report-gmane' was an interactive entry point, so we should provide an
+;; alias.
+(defalias 'spam-report-gmane 'spam-report-gmane-spam)
+
+(defun spam-report-gmane-internal (unspam article)
+ "Report ARTICLE as spam or not-spam through Gmane, depending on UNSPAM."
+ (when (and gnus-newsgroup-name
+ (or (null spam-report-gmane-regex)
+ (string-match spam-report-gmane-regex gnus-newsgroup-name)))
+ (let ((rpt-host (if unspam "unspam.gmane.org" "spam.gmane.org")))
+ (gnus-message 6 "Reporting article %d to %s..." article rpt-host)