From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Eric Schulte" Subject: Re: [ANN] org-mime -- using orgmode to send html mail? Date: Tue, 13 Apr 2010 18:57:07 -0600 Message-ID: <87mxx6hmvw.fsf@gmail.com> References: <87eij05had.fsf@gmail.com> <878w98w4sz.fsf@stats.ox.ac.uk> <87sk7f8d6x.fsf@gmail.com> <87aatizcef.fsf@gmail.com> <71591C25-1B0B-4162-A53C-16DB9436C0F3@gmail.com> <8739z9c3vq.fsf@gmail.com> <8739z44lyl.fsf@gmail.com> <87bpdoio0j.fsf@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Return-path: Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1O1quw-0000O7-8s for emacs-orgmode@gnu.org; Tue, 13 Apr 2010 20:57:22 -0400 Received: from [140.186.70.92] (port=56288 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O1qut-0000NW-Qw for emacs-orgmode@gnu.org; Tue, 13 Apr 2010 20:57:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1O1qun-0005cd-7Z for emacs-orgmode@gnu.org; Tue, 13 Apr 2010 20:57:18 -0400 Received: from mail-pz0-f200.google.com ([209.85.222.200]:36985) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1O1qum-0005cH-Na for emacs-orgmode@gnu.org; Tue, 13 Apr 2010 20:57:13 -0400 Received: by pzk38 with SMTP id 38so4567155pzk.25 for ; Tue, 13 Apr 2010 17:57:11 -0700 (PDT) In-Reply-To: (Andrew Hyatt's message of "Mon, 12 Apr 2010 21:31:13 -0400") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Andrew Hyatt Cc: emacs-orgmode@gnu.org So, for some reason the `org-mime-org-export' helper function is returning nil on your (and Eric's) machines. Could you try evaluating (C-M-x) the following in your *scratch* buffer? (insert (org-mime-org-export "html" "- first - second - third" (make-temp-file "quick-test"))) When I execute the above it inserts the following into the scratch buffer
  • first
  • second
  • third
If instead you get an error, or it inserts nil, then it means that our systems are somehow different with respect to that function, which is a slight alteration of `org-run-like-in-org-mode'. At that point you could try using something like (org-run-like-in-org-mode 'org-export-as-html) to export a non-html buffer to html, or you could also try starting up Emacs with the -Q option, then loading org-mime.el, opening an org-mode file, and calling org-mime-org-buffer-htmlize, and sending an email to yourself. Sorry I can't be of more help, I'm really mystified as to how this function could be returning nil. Best -- Eric Andrew Hyatt writes: > Thanks for the response. I upgraded, now I get a > > Debugger entered--Lisp error: (wrong-type-argument arrayp t) > substring(t 33) > (progn (insert org-mime-default-header) (insert body) (write-file tmp-fi= le) > (org-load-modules-maybe) (unless org-local-vars (setq org-local-vars ...)) > (substring (eval ...) (if ... ... 0))) > (unwind-protect (progn (insert org-mime-default-header) (insert body) > (write-file tmp-file) (org-load-modules-maybe) (unless org-local-vars ...) > (substring ... ...)) (and (buffer-name temp-buffer) (kill-buffer > temp-buffer))) > (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn ... > ... ... ... ... ...) (and ... ...))) > (with-current-buffer temp-buffer (unwind-protect (progn ... ... ... ... = ... > ...) (and ... ...))) > (let ((temp-buffer ...)) (with-current-buffer temp-buffer (unwind-protect > ... ...))) > (with-temp-buffer (insert org-mime-default-header) (insert body) > (write-file tmp-file) (org-load-modules-maybe) (unless org-local-vars (se= tq > org-local-vars ...)) (substring (eval ...) (if ... ... 0))) > (save-excursion (with-temp-buffer (insert org-mime-default-header) (inse= rt > body) (write-file tmp-file) (org-load-modules-maybe) (unless org-local-va= rs > ...) (substring ... ...))) > org-mime-org-export("org" #("\nHTML test\n\n~foo~\n=3Dbar=3D\n_baz_\n\n|= 1 | 2 > |\n| a | b |\n" 0 1 (fontified t) 1 11 (fontified t) 11 12 (fontified t) = 12 > 18 (fontified t) 18 24 (fontified t) 24 30 (fontified t) 30 31 (fontified= t) > 31 40 (fontified t face (gnus-cite-1 message-cited-text)) 40 41 (fontified > t) 41 50 (fontified t face (gnus-cite-1 message-cited-text)) 50 51 > (fontified t)) "/tmp/mail2522ZvL") > (let* ((region-p ...) (html-start ...) (html-end ...) (raw-body ...) > (tmp-file ...) (body ...) (org-export-skip-text-before-1st-heading nil) > (org-export-htmlize-output-type ...) (org-export-preserve-breaks > org-mime-preserve-breaks) (html-and-images ...) (html-images ...) (html > ...)) (delete-region html-start html-end) (save-excursion (goto-char > html-start) (insert ... ...))) > org-mime-htmlize(nil) > call-interactively(org-mime-htmlize record nil) > > I tried this with orgstruct-mode off and on, but it was the same error > either way. Earlier, before I got the latest version, I tried with > orgstruct-mode on, and it successfull htmlized my mail. But, when I recei= ved > it, the mail only contained the word "nil". > > On Mon, Apr 12, 2010 at 1:22 PM, Eric Schulte wro= te: > >> Hi Andrew, >> >> Thanks for the report. My guess is that somehow the call to >> org-export-as-html is erroring out because some org-mode variables >> aren't being set, maybe you don't have orgstruct-mode as a minor-mode in >> your email composition -- not that it's required, but that could be the >> difference between our setups which is causing you to see the bug and >> not me. >> >> I've changed the `org-mime-org-export' so it more closely mimics the >> `org-run-like-in-org-mode' wrapping function, which should hopefully fix >> this problem. Please let me know either way, and if the problem >> persists we can try to figure out exactly which variable isn't being >> initialized. >> >> Thanks for the report! -- Eric >> >> Andrew Hyatt writes: >> >> > This looks great. However, I get an error on my test mail: >> > >> > This is should be HTML mode. >> > >> > ~foo~ >> > =3Dbar=3D >> > _baz_ >> > >> > | Table | A | >> > | 1 | 2 | >> > >> > On calling org-mime-htmlize >> > >> > Debugger entered--Lisp error: (wrong-type-argument stringp nil) >> > string-match(nil #("This is should be HTML mode." 0 28 (fontified t)= )) >> > byte-code("\304\211. \305\n \"\203A >> > org-html-handle-time-stamps(#("This is should be HTML mode." 0 28 >> > (fontified t))) >> > byte-code(" \203. >> > org-export-as-html(nil nil nil string t) >> > (let nil (org-export-as-html nil nil nil (quote string) t)) >> > eval((let nil (org-export-as-html nil nil nil (quote string) t))) >> > (progn (insert org-mime-default-header) (insert body) (write-file >> > tmp-file) (eval (list ... org-local-vars ...))) >> > (unwind-protect (progn (insert org-mime-default-header) (insert body) >> > (write-file tmp-file) (eval ...)) (and (buffer-name temp-buffer) >> > (kill-buffer temp-buffer))) >> > (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn >> ... >> > ... ... ...) (and ... ...))) >> > (with-current-buffer temp-buffer (unwind-protect (progn ... ... ... >> ...) >> > (and ... ...))) >> > (let ((temp-buffer ...)) (with-current-buffer temp-buffer >> (unwind-protect >> > ... ...))) >> > (with-temp-buffer (insert org-mime-default-header) (insert body) >> > (write-file tmp-file) (eval (list ... org-local-vars ...))) >> > (save-excursion (with-temp-buffer (insert org-mime-default-header) >> (insert >> > body) (write-file tmp-file) (eval ...))) >> > org-mime-org-export("html" #("\nThis is should be HTML >> > mode.\n\n~foo~\n=3Dbar=3D\n_baz_\n\n| Table | A |\n| 1 | 2 | \n\n-= - \n" 0 >> 1 >> > (fontified t) 1 42 (fontified t) 42 43 (fontified t) 43 44 (article-ty= pe >> > emphasis fontified t) 44 47 (fontified t) 47 48 (article-type emphasis >> > fontified t) 48 50 (fontified t) 50 63 (fontified t face (gnus-cite-1 >> > message-cited-text)) 63 64 (fontified t) 64 78 (fontified t face >> > (gnus-cite-1 message-cited-text)) 78 79 (fontified t rear-nonsticky t)= 79 >> 80 >> > (fontified t) 80 84 (fontified t)) "/tmp/mail2522NRw") >> > (org-mime-replace-images (org-mime-org-export "html" raw-body tmp-fi= le) >> > tmp-file) >> > (let* ((region-p ...) (html-start ...) (html-end ...) (raw-body ...) >> > (tmp-file ...) (body ...) (org-export-skip-text-before-1st-heading nil) >> > (org-export-htmlize-output-type ...) (org-export-preserve-breaks >> > org-mime-preserve-breaks) (html-and-images ...) (html-images ...) (html >> > ...)) (delete-region html-start html-end) (save-excursion (goto-char >> > html-start) (insert ... ...))) >> > org-mime-htmlize(nil) >> > >> > >> > On Fri, Apr 9, 2010 at 12:41 PM, Eric Schulte > >wrote: >> > >> >> Announcing the addition of org-mime to the contrib directory of Org-m= ode >> >> >> >> this allows sending HTML email using org-mode including... >> >> >> >> >> >> - *tables* colname onecolname two 11 24 39 >> >> - *inline images* including latex equations [image: $f(n) =3D n + >> >> \frac{1}{n} \int_{0}^{n}{d_x f(x) + f(n - x)}$] and the results of >> >> ditaa blocks, etc=E2=80=A6 >> >> >> >> [image: blue.png] >> >> >> >> - *blockquotes* >> >> >> >> HTML e-mail is the use of a subset of HTML (often ill-defined) to >> >> provide formatting and semantic markup capabilities in e-mail that >> are not >> >> available with plain text. =E2=80=93 wikipedia >> >> >> >> - fontified *code blocks* (shown below) >> >> - and *HTML character* conversion, like =E2=88=80 character c s.t.= =E2=88=83 h =E2=88=88 >> *HTML >> >> characters* and c =E2=89=A1 h, org-html-export of c results in h >> >> >> >> >> >> >> >> The original org-mode formatted plain text is included as a text/plain >> >> mime alternative to the generated html. >> >> >> >> Below find the org-mime export of the org-mime worg page which will be >> >> available at http://orgmode.org/worg/org-contrib/org-mime.php. >> >> >> >> Best -- Eric >> >> >> >> General >> >> >> >> org-mime can be used to send HTML email using Org-mode HTML export. >> >> >> >> This approximates a WYSiWYG HTML mail editor from within Emacs, and c= an >> be >> >> useful for sending tables, notified source code, and inline images in >> email. >> >> >> >> How to use it >> >> Setup >> >> >> >> org-mime exposes two functions >> >> `org-mime-htmlize' can be called from within a mail composition buff= er >> to >> >> export either the entire buffer or just the active region to html, and >> embed >> >> the results into the buffer as a text/html mime section. >> >> >> >> org-mime-htmlize is an interactive Lisp function in `org-mime.el'. >> >> >> >> (org-mime-htmlize ARG) >> >> >> >> Export a portion of an email body composed using `mml-mode' to >> >> html using `org-mode'. If called with an active region only >> >> export that region, otherwise export the entire body. >> >> >> >> `org-mime-org-buffer-htmlize' can be called from within an Org-mode >> >> buffer to export either the whole buffer or the narrowed subtree or >> active >> >> region to HTML, and open a new email buffer including the resulting H= TML >> >> content as an embedded mime section. >> >> >> >> org-mime-org-buffer-htmlize is an interactive Lisp function in >> >> `org-mime.el'. >> >> >> >> (org-mime-org-buffer-htmlize) >> >> >> >> Export the current org-mode buffer to HTML using >> >> `org-export-as-html' and package the results into an email >> >> handling with appropriate MIME encoding. >> >> >> >> The following key bindings are suggested, which bind the C-c M-o key >> >> sequence to the appropriate org-mime function in both email and Org-m= ode >> >> buffers. >> >> >> >> (add-hook 'message-mode-hook >> >> (lambda () >> >> (local-set-key "\C-c\M-o" 'org-mime-htmlize))) >> >> (add-hook 'org-mode-hook >> >> (lambda () >> >> (local-set-key "\C-c\M-o" 'org-mime-org-buffer-htmlize))) >> >> >> >> CSS style customization >> >> >> >> Email clients will often strip all global CSS from email messages. In >> the >> >> case of web-based email readers this is essential in order to protect >> the >> >> CSS of the containing web site. To ensure that your CSS styles are >> rendered >> >> correctly they must be included in the actual body of the elements to >> which >> >> they apply. >> >> >> >> The `org-mime-html-hook' allows for the insertion of these important = CSS >> >> elements into the resulting HTML before mime encoding. The following = are >> >> some possible uses of this hook. >> >> >> >> - for those who use color themes with Dark backgrounds it is useful >> to >> >> set a dark background for all exported code blocks and example >> regions. This >> >> can be accomplished with the following >> >> >> >> (add-hook 'org-mime-html-hook >> >> (lambda () >> >> (org-mime-change-element-style >> >> "pre" (format "color: %s; background-color: %s; paddi= ng: >> 0.5em;" >> >> "#E6E1DC" "#232323")))) >> >> >> >> - the following can be used to nicely offset block quotes in email >> >> bodies >> >> >> >> (add-hook 'org-mime-html-hook >> >> (lambda () >> >> (org-mime-change-element-style >> >> "blockquote" "border-left: 2px solid gray; padding-le= ft: >> 4px;"))) >> >> >> >> >> >> For other customization options see the org-mime customization group. >> >> Credits >> >> >> >> org-mime was developed by Eric Schulte with much-appreciated help and >> >> discussion from everyone on the "using orgmode to send html mail< >> http://thread.gmane.org/gmane.emacs.orgmode/23153>" >> >> thread especially David Maus. >> >> >> >> "Eric Schulte" writes: >> >> >> >> > Carsten Dominik writes: >> >> > >> >> >> On Apr 5, 2010, at 7:39 AM, Eric Schulte wrote: >> >> >> >> >> >>> Hi, >> >> >>> >> >> >>> It is now possible to send HTML mail directly form an org-mode >> buffer. >> >> >>> >> >> >>> Calling `org-mime-org-buffer-htmlize' (could probably use a better >> >> >>> name) >> >> >>> from inside of an org-mode buffer will use `org-export-as-html' to >> >> >>> generate HTML of the buffer (respecting regions and subtree >> >> >>> narrowing), >> >> >>> and will then package the resulting HTML with all linked images i= nto >> a >> >> >>> message buffer. >> >> >>> >> >> >>> As usual thanks to Carsten's thoughtfully organized functions and >> >> >>> control variables this was surprisingly easy to implement. >> >> >>> >> >> >>> Cheers -- Eric >> >> >>> >> >> >>> The code is still up at http://github.com/eschulte/org-mime >> >> >> >> >> >> CONTIRB? yes, after the release..... >> >> >> >> >> > >> >> > Sounds great, I'm move this into contrib then. -- Eric >> >> > >> >> >> >> >> >> - Carsten >> >> >> >> >> >>> >> >> >>> "Eric Schulte" writes: >> >> >>> >> >> >>>> Dan Davison writes: >> >> >>>> >> >> >>>> [...] >> >> >>>> >> >> >>>>> >> >> >>>>> As I understand it the code you've written is designed to be >> >> >>>>> called in a >> >> >>>>> message-mode buffer with orgstruct-mode in force. Would it make >> >> >>>>> sense to >> >> >>>>> also include in your package a complementary function, that one >> >> >>>>> calls in >> >> >>>>> an org-mode buffer? I envisage this generating the HTML, forming >> the >> >> >>>>> multipart email contents, and then saving it to the kill ring, = so >> >> >>>>> that >> >> >>>>> it can be pasted into an email. >> >> >>>>> >> >> >>>>> This function would have access to the directory-name and so >> >> >>>>> should be >> >> >>>>> able to resolve relative paths. Also, there might be some other >> >> >>>>> advantages -- for example when exporting just a region or subtr= ee, >> >> >>>>> buffer-wide properties such as #+TITLE and #+AUTHOR are picked = up >> >> >>>>> by the >> >> >>>>> org exporter and packaged into the HTML. >> >> >>>>> >> >> >>>>> In other words, can I use your machinery to package up the HTML >> >> >>>>> generated by Org's C-e dispatcher into an >> appropriately-constructed >> >> >>>>> email? >> >> >>>>> >> >> >>>> >> >> >>>> Hi Dan, >> >> >>>> >> >> >>>> That sounds like a good idea, I've added it to a fledgling task >> list >> >> >>>> packaged in the README at [1]. I'd say there are two options. >> >> >>>> >> >> >>>> 1) which you mentioned saving the entire exported content to the >> >> >>>> kill-ring. One problem here is that everything is still text = and >> >> >>>> pastable only *before* the mime export process, which means th= at >> >> >>>> linked images wouldn't resolve after pasting into the email >> client. >> >> >>>> >> >> >>>> 2) having the function generate a new mail buffer containing the >> >> >>>> exported content. This buffer would need to have it's >> >> >>>> `buffer-file-name' set, for images to resolve during export. = I'm >> >> >>>> not >> >> >>>> sure how this should best work. >> >> >>>> >> >> >>>> Thanks -- Eric >> >> >>>> >> >> >>>> Footnotes: >> >> >>>> [1] http://github.com/eschulte/org-mime >> >> >>> >> >> >>> >> >> >>> _______________________________________________ >> >> >>> Emacs-orgmode mailing list >> >> >>> Please use `Reply All' to send replies to the list. >> >> >>> Emacs-orgmode@gnu.org >> >> >>> http://lists.gnu.org/mailman/listinfo/emacs-orgmode >> >> >> >> >> >> - Carsten >> >> >> >> _______________________________________________ >> >> Emacs-orgmode mailing list >> >> Please use `Reply All' to send replies to the list. >> >> Emacs-orgmode@gnu.org >> >> http://lists.gnu.org/mailman/listinfo/emacs-orgmode >> >> >> >> >>