emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Orgmode] [ANN] org-mime -- using orgmode to send html mail?


From: Andrew Hyatt
Subject: Re: [Orgmode] [ANN] org-mime -- using orgmode to send html mail?
Date: Wed, 14 Apr 2010 14:00:00 -0400

Thanks! I  finally got it to work. I actually did have the latest code, but my issue was that when I upgraded to the new org, I forgot to byte-compile before I did M-x org-reload.

After I got your latest code, it all works now.  I'm looking forward to using it!

On Wed, Apr 14, 2010 at 10:59 AM, Eric Schulte <address@hidden> wrote:
Hi Andrew,

I started my emacs with the -Q option, and to my surprise I got the same
error that you have described.  I've been able to hunt down the source
of this problem, and it is an old version of org-export-as-org, which
means that you are not loading the latest version of the core org-mode,
but rather the version distributed with Emacs.

This is what happened to me when I started with the -Q option and simple
required org-install without first adding the path to the newer version
of org-mode to my load path.

An easy way to verify that this is the case is to call describe-function
with C-h f org-export-as-org, then jump to the source-code of the
function by pressing enter on the linked function name, and jumping down
to the last 5 lines of the function definition.  If they don't look like


(if (equal to-buffer 'string)
          (progn (setq str-ret (buffer-string))
                 (kill-buffer (current-buffer))
                 str-ret)
        (kill-buffer (current-buffer)))


then you are still using an old version of Org-mode.  Hopefully once you
are sync'd to the head of the org-mode repository this error will be
fixed.

Hope this helps, Best -- Eric

Andrew Hyatt <address@hidden> writes:

> I do get the same result you do.  Hopefully, I'll have some time tomorrow to
> look into the issue.  RIght now, though, my problem is not the nil, but the
> error I reported in my previous email.
>
> On Tue, Apr 13, 2010 at 8:57 PM, Eric Schulte <address@hidden>wrote:
>
>> 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
>>
>> <ul>
>> <li>
>> first
>> </li>
>> <li>
>> second
>> </li>
>> <li>
>> third
>> </li>
>> </ul>
>>
>> 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 <address@hidden> 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-file)
>> > (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
>> (setq
>> > org-local-vars ...)) (substring (eval ...) (if ... ... 0)))
>> >  (save-excursion (with-temp-buffer (insert org-mime-default-header)
>> (insert
>> > body) (write-file tmp-file) (org-load-modules-maybe) (unless
>> org-local-vars
>> > ...) (substring ... ...)))
>> >  org-mime-org-export("org" #("\nHTML test\n\n~foo~\n=bar=\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
>> received
>> > it, the mail only contained the word "nil".
>> >
>> > On Mon, Apr 12, 2010 at 1:22 PM, Eric Schulte <address@hidden
>> >wrote:
>> >
>> >> 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 <address@hidden> writes:
>> >>
>> >> > This looks great.  However, I get an error on my test mail:
>> >> >
>> >> > This is should be HTML mode.
>> >> >
>> >> > ~foo~
>> >> > =bar=
>> >> > _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=bar=\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-type
>> >> > 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-file)
>> >> > 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 <address@hidden
>> >> >wrote:
>> >> >
>> >> >> Announcing the addition of org-mime to the contrib directory of
>> Org-mode
>> >> >>
>> >> >> this allows sending HTML email using org-mode including...
>> >> >>
>> >> >>
>> >> >>    - *tables*   colname onecolname two  11 24 39
>> >> >>    - *inline images* including latex equations [image: $f(n) = n +
>> >> >>    \frac{1}{n} \int_{0}^{n}{d_x f(x) + f(n - x)}$] and the results of
>> >> >>    ditaa blocks, etc…
>> >> >>
>> >> >> [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. – wikipedia
>> >> >>
>> >> >>     - fontified *code blocks* (shown below)
>> >> >>    - and *HTML character* conversion, like ∀ character c s.t. ∃ h ∈
>> >> *HTML
>> >> >>    characters* and c ≡ 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
>> can
>> >> 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
>> buffer
>> >> 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
>> HTML
>> >> >> 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-mode
>> >> >> 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;
>> padding:
>> >> 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-left:
>> >> 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" <address@hidden> writes:
>> >> >>
>> >> >> > Carsten Dominik <address@hidden> 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
>> into
>> >> 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" <address@hidden> writes:
>> >> >> >>>
>> >> >> >>>> Dan Davison <address@hidden> 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
>> subtree,
>> >> >> >>>>> 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
>> that
>> >> >> >>>>   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.
>> >> >> >>> address@hidden
>> >> >> >>> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
>> >> >> >>
>> >> >> >> - Carsten
>> >> >>
>> >> >> _______________________________________________
>> >> >> Emacs-orgmode mailing list
>> >> >> Please use `Reply All' to send replies to the list.
>> >> >> address@hidden
>> >> >> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
>> >> >>
>> >> >>
>> >>
>>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]