Mostly about my amusement

Category: Software (page 11 of 22)

Double-Opt in for Subscribe to Comments plugin

A few weeks ago, my hosting service received a complaint that my blog was sending spam. I don’t spam, so I checked out what was going on.

I had been using Mark’s Subscribe to Comments plugin which has one flaw: the released version does not support double-opt in. At the time I replied to my hosting company with an explanation and I disabled that plugin. I also went onto SpamCop and replied to the complaint with what I had done to resolve this.

Being tagged a spammer is serious stuff.

Double-opt in is when someone signs up for an e-mail and the first and only e-mail that goes out is one that says “Hey, someone just signed you up for this. If it’s really you, please confirm by clicking on this link. If it’s not you, then please ignore/delete this e-mail and the system will never send you an e-mail again.”

Until the subscriber clicks on that double-opt in link, the person is NOT subscribed. It’s e-mail subscription etiquette 101 and should be adhered to. I am NOT a bulk e-mailer but you have to be responsible on the Internet. SpamHaus has a good explanation here under “confirmed opt-in”.

This is a known issue and now the SVN copy of that plugin now supports Double-Opt in. I got my copy by using this command in my wp-content/plugins directory:

cd wp-content/plugins
svn co http://svn.wp-plugins.org/subscribe-to-comments/branches/development stc

That put the svn copy into wp-content/plugins/stc. I went into the admin portion of the plugin and enabled Double-Opt in. A quick test later confirmed that it’s working. Once the 2.2 version is released, I’ll stop using the SVN copy and sync up with the WordPress.ORG copy.

One last item was that I deleted the e-mail of the subscriber who complained and now people who leave comments and want an e-mail on follow up comments will now work in a responsible way.

Moving some users to Google Apps for mail

I host the domain dembowski.net and also handle the mail delivery.  The mail ultimately ends up in Stefan’s house via his DSL line.

That DSL line has been prone to problems so I played with the idea of moving the mail to another server or VPS. But handling spam and keeping my web mail software up to date is a pain. So I wanted to move my whole domain to Google Apps for mail handling. Google is much better at distributed web mail systems and spam fighting than I am.

This was not universally accepted by all of my users. So I found a way to selectively send mail to Google Apps on a per user basis.

1. Sign up your domain for Google Apps

Okay, that one is a no brainer.  I authenticated my domain by inserting a Google supplied CNAME record into my zone file.  That established that I was the one in charge of my domain. Google lets you use it at no charge for up to 50 users.

In Google Apps I added another domain to my profile called app.dembowski.net.  This way mail from Google gets delivered as user@dembowski.net and Google will also receive mail for user@app.dembowski.net.

2. DNS changes

I set up a sub-domain called app.dembowski.net.  The DNS records for this domain are pretty sparse and only contain MX records that Google provides for users to point their domain to.  These came straight out of Google’s instructions. In my zone file I bumped the serial number and added these lines:

app.dembowski.net.      MX 10 aspmx.l.google.com.
app.dembowski.net.      MX 20 alt1.aspmx.l.google.com.
app.dembowski.net.      MX 20 alt2.aspmx.l.google.com.
app.dembowski.net.      MX 30 aspmx2.googlemail.com.
app.dembowski.net.      MX 30 aspmx3.googlemail.com.
app.dembowski.net.      MX 30 aspmx4.googlemail.com.
app.dembowski.net.      MX 30 aspmx5.googlemail.com.

Then I created a couple of  A records for mail.dembowski.net pointing to two servers I run Apache2 on. More on this later.

3. Postfix recipient rewriting

The magic happens on my two Postfix MTAs. When the primary mail server goes down, mail queues up on my secondary mail server.  It will stay there until the primary comes back. That sucks; last time we had an outage, the mail server was down for almost 24 hours.

The solution is to have Postfix receive the mail, rewrite the address to the sub-domain, and send it along for delivery.

In my /etc/postfix/main.cf file I added this line

recipient_canonical_maps = hash:/etc/postfix/recipient_canonical_maps</pre>
In the file /etc/postfix/recipient_canonical_maps I had something like this:
<pre lang="text">user1@dembowski.net  user1@app.dembowski.net
user2@dembowski.net  user2@app.dembowski.net
user3@dembowski.net  user3@app.dembowski.net

This let me turn on Google mail handling on a per user basis. I ran postmap hash:/etc/postfix/recipient_canonical_maps and restarted postfix on my servers.

Now if my mail server tanks again, as long as the secondary is up, I still get my mail via Google Apps.

4. Lazy web mail URL

The two servers that are being pointed to as mail.dembowski.net? I created an Apache2 vhost on each one for that server name. In the root directory for the new vhost I created a small index.php with the following content:

<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://mail.google.com/a/dembowski.net");
exit();
?>

I’m lazy. I can remember http://mail.dembowski.net easier than http://mail.google.com/a/dembowski.net.

Update: Or I could follow the directions and in my Google Apps dashboard just set a customized URL for mail.

After setting that up in my dashboard, I updated the mail.dembowski.net DNS record to be a CNAME pointing to ghs.google.com.

5. Test everything

Using an IMAP client (after I turned IMAP on in my Google Apps mail) I sent and received mail with my primary server’s postfix shutdown. That worked perfectly.

I also had other people in my domain send and receive mail just to make sure I did not bork that up too. All was good and we were all able to send and receive mail.

That’s it. As long as I create accounts in Google Apps and maintain the recipient_canonical_maps file, I’ve got a good solution for fighting spam with a good web mail client without impacting my other users.

Looks like I’ll need to try iTunes again

I don’t like DRM. It’s not an effective control since you can almost always convert the protected media into an unprotected version.It treats paying customers like trash and is meant to keep the fish swimming in neat little lines.

That’s why I buy all my online music from Amazon. I’m not an Amazon fan exactly, I just think that Apple is pandering to the music factory. The integration with my iPhone is broken so I buy music via the web and run iTunes and add the new files to my collection. There is a Firefox plugin but it works sporadically and I gave up on it.

Recently Apple relaxed their DRM.  Your account is still stamped on the downloaded music, but most of the songs are no longer encrypted. That means I can play that music on Linux, my XBox 360 (I think), etc.  For a not huge fee you can convert the songs in your collection from encrypted .m4p format to .m4a format.

It’s a start and I’ll give it a shot and pick up some tunes.  I’ll believe Apple’s iTunes Store is really “open” when the Creative MP3 player can plugin and sync using iTunes.

Threaded comment are fixed

Opensource software is best.

Using a comment callback function in WordPress 2.7, I was trying to customize the threaded comments and ran into a problem. So I left a comment on Jeremy’s blog. He contacted me and was able to find the problem and provide a fix.  His post has been updated with that small change and it’s all good.

Very cool, you can’t get that kind of response from any software company. I’ll keep playing around with the comment format, but now I can implement anything I like and take full advantage of the threaded comment feature.

Odd way to end a vacation

I’ve been on vacation since right before Christmas and have enjoyed the time off. Monday I go back to work all refreshed and ready to go.

After our New Years Eve party, I spent the day doing somethings that had meant to do for a while: PHP coding for my WordPress blog. My PHP fu is not that great but this is how I learn and as hobby’s go, it’s almost productive. Starting with easy ones and working my way down, the list looks like this.

1. Clean up my theme directory.

I make changes to my theme all the time and left junk in the theme directory. There is junk in there from plugins that I was experimenting with, looks that I was trying to accomplsh, etc. I can’t remember it all but I know what I need to keep and my backups are good and current.

2. Setup my Flickr badge as a WordPress plugin to put a widget in the sidebar.

I was using a text widget and hard coded the CSS into my theme’s header.php so that the page would validate properly. That worked but if I changed themes, the styling went out the window.  I had wanted to see how to create a widget plugin that inserted the CSS using the wp_head action. By looking at existing plugins I saw how and it’s not hard at all.

Now I can keep the widget no matter which theme I choose and it always validates. Next up to add options in the widget. I’m looking at the Flickr Widget to see how it’s done there. Having GPL’ed code available to examine makes life so much easier.

I want to get an options page just for giggles; I don’t plan on distributing the code since I’m re-using Flickr’s code from here.

3. And now the big one: Fix my comment CSS and get WordPress 2.7 threaded comment callback working properly.

WordPress 2.7 comes with the option of using threaded comments and getting the default output just needs these lines:

<ul class="commentlist">
<?php wp_list_comments(); ?>
</ul>

This produces good valid XHTML output and all that is required is to style it anyway you want. With some CSS I get this:

comment-thread

It’s really easy to do and between Otto and Chris Harrison’s posts, getting it looking good is simple. If you want to learn then visit those two sites and start playing with your theme.

Now if you want to explicitly control the output for threaded comments, you need to use a callback as outlined in Jeremy’s post. I’m adding a comment count and trying to keep the look close to the original theme’s styling. By inserting the theme’s original comment code I can maintain the look.

In my comments.php file I comment out the old line and add one to use the callback.

<ul class="commentlist">
<?php // wp_list_comments(array('avatar_size'=>40,'reply_text'=>'Reply to this comment')); ?>
<?php wp_list_comments('callback=custom_comment'); ?>
</ul>

In my function.php file I’m adding this code.  Be warned, I am not a PHP programmer and if anyone sees something really gross please feel free to criticize. The $cmtorder is more of a placeholder and I’m not using it yet.

<?php
function custom_comment($comment, $args, $depth) {
$GLOBALS['comment'] = $comment; ?>
<?php global $cmtcount; ?>
<?php
$pageadd = 1;
if(get_option('page_comments')) :
$page = get_query_var('cpage');
$pageadd = (get_option('comments_per_page') * ($page - 1)) + 1;
$cmtorder = get_option('comment_order');
endif; ?>

<li id="comment-<?php comment_ID() ?>" class="<?php echo tj_comment_class() ?>">
<div class="commentNumber">#<a href="#comment-<?php comment_ID() ?>"><?php echo $cmtcount + $pageadd; ?></a></div>
<div class="comment_mod">
<?php if ($comment->comment_approved == '0') : ?>
<em>Your comment is awaiting moderation.</em>
<?php endif; ?>
</div>

<div class="comment_text">
<?php comment_text() ?>
</div>

<div class="comment_author">
<?php if (function_exists('get_avatar')) { ?>
<?php echo get_avatar($comment, '32'); ?>
<?php } ?>
<p><strong><?php comment_author_link() ?></strong></p>
<p><small><?php comment_date('j M y') ?> at <?php comment_time() ?> <? edit_comment_link(__('Edit', 'sandbox'), ' ', ''); ?></small></p>
</div>
<div class="clear"></div>

<?php echo comment_reply_link(array('before' => '<div class="reply">', 'after' => '</div>', 'reply_text' => 'Reply to this comment', 'depth' => $depth, 'max_depth' => $args['max_depth'] ));  ?>
<?php $cmtcount = $cmtcount + 1; ?>
<?php } ?>

This gets the comments formatted close to the theme’s original comments but adds threading.  I added the comment count as a “why not?”  If you turn on paged comments the comment counter still work. I have not worked out changing the order yet, I’d like to see it working in reverse order if set.

comment-thread-callback

The code is a bit ugly and I’ll clean it up later. It works and I’m not getting and errors in my log so I’m happy for now. The CSS is good and the generated XHTML code is valid.

My only problem is that the javascript reply to comment box is not working exactly the way I want it to.

When you click on the “Reply to this comment” link, the comment box show up outside of that comment’s <li> … </li>. This is probably due to how I’m using comment_reply_link() but right now the codex is a little bit sparse on that topic. I’ve looked at the source code and by changing the parameters, I do get different results, just not the results I want. If I don’t use the callback, the comment box appears within that comment’s <li> … </li>.

I’ll keep playing with it and will be switching them back and forth until I like the output.

WordPress 2.7 is shaping up nicely

I’ve had this blog on WordPress 2.7-beta using SVN for a while. So when it went release candidate, all I had to do was another just run another “svn up”.

The comment enhancements are cool and Otto provided a good write up for modifying the files to take advantage of it. Implementing it and staying XHTML valid was not a problem.

My problem was that without styling it, the new comments looked like crap.

Lucky on the WordPress support forums I found that Chris Harrison mapped out all the CSS for the comment list. Adding the elements that he provided let me easily make changes and get the comments close to the original look.

I still need to play around with it but so far I’m satisfied with the results.