在Windows Azure上安装Sendy(一个PHP应用程序),通过亚马逊SES来发送廉价的电子报邮件


[原文发表地址] Installing Sendy (a PHP app) on Windows Azure to send inexpensive newsletter email via Amazon SES

[原文发表时间] 2031-03-19 6:14 AM

TL;DR 总结

· Sendy.co 是一个友好而完美的PHP应用程序,它使用亚马逊的SES(简单邮件服务)来廉价地发送邮件。

· 在Windows Azure上可以很容易地安装PHP应用程序。

· Azure网站不支持mod_rewrite,所以你需要把这些规则引入到web.config。相关内容你可以参考帖子 great Sendy web.config for Windows

· 即使官方并没有说Sendy支持Windows,但在Azure 上可以很好的工作。我可以确认Sendy在任何地方都可以很好工作。

· 我现在就在Windows Azure上用亚马逊SES来运行我的电子报系统

· 下面是技术详细信息。

寻找一个更便宜的电子报解决方案

为什么不选择 Rube Goldbergian 解决方案? 其实,它并没有那么糟糕,这是有其背景故事的。我在几个月前开了一个小的链接的博客电子报,纯属娱乐。

如果你喜欢你可以在http://hanselman.com/newsletter上进行订阅。它是一个低流量、一个月一到两次的小东西,主要是用来和朋友们分享我在网络上遇到的问题。

我开始是在 TinyLetter.com 做的,它在低流量电子报方面做得非常好。然而,它的流量开始增加,现在我的站点已经达到了TinyLetter允许的最大订阅者数量。 TinyLetter 是MailChimp的前台,所以我看了一下它们的报价 。看上去5k-10k的订阅者数量每个月需要75美元!让我再查一下SendGrid。他们有一个至多100k邮件量的每个月$79的选择,但那还是需要每年960美元,然而这个电子报没有销售任何东西,也没有提供任何有用的服务。

假设我可以雇佣人或者寻求赞助商,但那需要工作量。我只是想把我的列表发出去而已。我可以用我的博客。好吧,我正在用,但我喜欢电子报所提供的高连通性,所以我已经发了几周的电子报了,这样订阅者可以及早得到信息。订阅者可以明显地查看它或者他们不要订阅。

Twitter上的一个人向我介绍了Sendy.co。它是一个自己做主机的PHP应用程序。它前端是亚马逊的简单邮件服务(SES),用它发邮件是极便宜的。这个应用程序真的非常完美而且友好。你需要花59美元来购买,但他们在网站上说“如果你遇到问题,我们可以帮助你。如果问题没有解决,我们会给你退款。”这句话打动了我,因此我买了它。

我对PHP一无所知,然而,我了解网页,所以我确信我可以把它配好。

Sendy网站有诸多免责申明

需要什么?

你需要获得Unix服务器上PHP和mySQL的支持,比如Apache上的Linux。几乎所有的主机公司都支持他们。WINDOWS上不支持的,你不用犯傻去尝试了

好吧,我承认,最后部分是我自己加上去的。但我认为我不会在Linode上来部署它,因为我有Azure帐号,而且并不是每个月都用。我确信这个可以实现。再说了,即使不行,我也可以花最少的钱在成千上万的小型主机上部署这个PHP应用程序。如果这个可以的话,那真的太好了,我可以在一个地方拥有所有的东西。

在Windows Azure云平台上做一个Sendy PHP应用程序的实例

我切换到 Azure,然后开了一个带有MySQL数据库的网站:

Making a new website with a new MySQL DB

下面,我在Azure里为我的站点下载了发布配置文件。我也看了数据库的连接字符串,因为我需要这个来连接到Sendy实例。

clip_image002

然后我下载了Sendy(付费后)输入密码并解压到一个目录。我在WebMatrix上打开了这个目录。它在我的本地机上安装了PHP,这样我就可以在本地运行它了(尽管我没有实际操作)。在这个实例中我用WebMatrix作为直接发布到Azure的超级简单的方法。

The Sendy PHP app opens nicely in WebMatrix

我点击远程选项卡,然后点设置来导入我下载的发布配置文件。先不要发布!我还需要添加一个web.config,这样我们才能在Windows上运行这个PHP应用程序。

Windows上的Sendy - .htaccess vs. web.config URL rewrite

我注意到在我的Sendy安装中有一个.htaccess文件。那意味着它们可能已经让mod_rewrite运行,来让URLs更好。这是他们的文件:

ErrorDocument 404 "[404 error] If you're seeing this error after install, check this thread on our forum for the fix: http://sendy.co/forum/discussion/5/404-error-after-install/p1"
 
Options +FollowSymLinks
Options -Multiviews
 
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9-]+)$ $1.php [L]
 
# Link tracker
RewriteRule ^l/([a-zA-Z0-9/]+)$ l.php?i=$1 [L]
 
# Open tracker
RewriteRule ^t/([a-zA-Z0-9/]+)$ t.php?i=$1 [L]
 
# Web version
RewriteRule ^w/([a-zA-Z0-9/]+)$ w.php?i=$1 [L]
 
# unsubscribe
RewriteRule ^unsubscribe/(.*)$ unsubscribe.php?i=$1 [L]
 
# subscribe
RewriteRule ^subscribe/(.*)$ subscribe.php?i=$1 [L]

 带有PHP的Windows Azure 网站还不支持mod_rewrite,所以我只能让web.config来做UrlRewrite一样的事情。幸运的是IIS上5年前已经可以做到mod_rewrite规则引入到web.config文件中了。

我将Sendy放到网站的根目录下,所以没有别的子目录或路径了。如果在sendy或其他目录下,我可能还要在Regular Expression下设置得更为具体一些。您必须要考虑Sendy在什么位置,web.config又在什么位置。这样一来,最简单的方法就是根目录了,将Sendy放到它自己的路径下,然后添加web.config。您将会发现这真是一个不错的选择。

<configuration>
  <system.webServer>
    <rewrite>
      <rules>
            <rule name="Sendy all" stopProcessing="true">
                <match url="^([a-zA-Z0-9-]+)$" ignoreCase="true" />            
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                    </conditions>
                <action type="Rewrite" url="{R:1}.php" appendQueryString="true" />
            </rule>
 
            <rule name="Sendy: link tracker" stopProcessing="true">
                <match url="^l/([a-zA-Z0-9/]+)$" ignoreCase="true" />
                <action type="Rewrite" url="l.php?i={R:1}" appendQueryString="true" />
            </rule>
            
            <rule name="Sendy: open tracker" stopProcessing="true">
                <match url="^t/([a-zA-Z0-9/]+)$" ignoreCase="true" />
                <action type="Rewrite" url="t.php?i={R:1}" appendQueryString="true" />
            </rule>
            
            <rule name="Sendy: web version" stopProcessing="true">
                <match url="^w/([a-zA-Z0-9/]+)$" ignoreCase="true" />
                <action type="Rewrite" url="w.php?i={R:1}" appendQueryString="true" />
            </rule>
            
            <rule name="Sendy: unsubscribe" stopProcessing="true">
                <match url="^unsubscribe/(.*)$" ignoreCase="true" />
                <action type="Rewrite" url="unsubscribe.php?i={R:1}" appendQueryString="true" />
            </rule>
            
            <rule name="Sendy: subscribe" stopProcessing="true">
                <match url="^subscribe/([a-zA-Z0-9/]+)$" ignoreCase="true" />
                <action type="Rewrite" url="subscribe.php?i={R:1}" appendQueryString="true" />
            </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>
我和Azure网站团队提过我们应该要么直接支持mod_rewrite,要么自动将现有的文件转成这样的格式。

注意: 这个web.config和Sendy论坛上提到的文件不一样的,比它更好,而且改进了很多。它工作得更好更彻底。论坛上的这个不是非常完美。

这个web.config需要和Sendy应用程序在同一个目录中。我是直接用WebMatrix制作的这个文件。

Windows Azure Sendy 配置

下一步,修改includes/config.php,写入您的应用程序的位置还有您的数据库连接的详细信息。 

<?php
    //==================================================================================//  
    // Configuration
    //==================================================================================//
 
    //path to your Sendy installation (without the trailing 
    slash)
    define('APP_PATH', 
    'http://pantspantspants.hanselman.com');
    
    //database connection credentials
    $dbHost = 'somefunkyurl.cleardb.com'; //mySQL Hostname
    $dbUser = 'ladaladalada'; //mySQL Username
    $dbPass = 'pardypary'; //mySQL Password
    $dbName = 'sendyDBName'; //mySQL Database Name
    //$dbPort = 3306; //mySQL port (only if you need to change it)
    
    //domain of cookie (99.99% chance you don't need to edit this)
    define('COOKIE_DOMAIN', '');
    
    //==================================================================================//
?>

我选择将我的网站扩展至共享模式,这样我就可以为域添加自定义CNAME。我转到 DNSimple 上,在这里我可以管理我的DNS,为Hanselman.com添加一个CNAME来指向我的fancypantsmail.azurewebsites.net 站点。然后在Azure点击管理域 ,添加这个新的子域。

注意:你告诉Sendy的域名必须和config.php文件中中的一致,也要与你真实运行的相一致。我为hanselman.com购买了它,这样它可以只在hanselman.com上运行。在CNAME子域问题没有正确解决前,Sendy还是不能运行的。

成Sendy的安装

Sendy入门 写的非常好。请仔细阅读它。

我点击我的URL,在Sendy中输入我的许可证密钥。如果你没有看到任何CSS或图片或者你看到了404错误,你就知道这个应用程序还没有安装正确。那意味着 web.config (我用来模仿 mod_rewrite)还不正确。

我跳过了入门基础的第四步,因为我相信我已经做过这个了,即使我并不计划上传任何文件。我安装了亚马逊SES,验证了我的邮件地址。做好这个后,反馈和投诉处理也是超级重要的,所以请认真阅读。

你会要确认你的亚马逊SES邮件被验证过,那样Sendy有个反馈和投诉处理节点的安装。

疑难杂症: 我不得不确认SES和SNS都是在亚马逊东部第一区。

一旦这些节点安装好了,而且也检查过了 Sendy入门基础 中解释的,接下来你就可以做一些测试了。

建立一个电子报活动

Sendy 应用程序真是非常的好,而且易于使用,易于运行。我发现它和TinyLetter一样易于使用,然而显然还有很多强大的功能我还没有用到。

image

我可以将我的用户转移过来,中间很少碰到麻烦。我从TrinyLetter中导出他们,然后导入到Sendy。我想知道什么时候MySQL数据库会变得大的让我需要为此付费?但现在我为我的网站创建的MySQL数据库还是免费的。

做一个订阅表格

我到现在还是没有发现有可以内建到Sendy应用程序的订阅表格(你能找到吗?),所以我在 http://hanselman.com/newsletter上做了一个,那只是发送到Sendy API订阅节点。在 http://sendy.co/api.上有详细信息,它只是一个HTTP POST! 你可以将它内建到任何你喜欢的地方。我只是自己做了一个简单的表格。

Sending mails!

希望在不久的将来这将成为http://hanselman.com/newsletter的一个合理而经济的解决方案!

* 免责申明及细则: Sendy 链接是引用的链接,但在Sendy上他们 并不认识我。我只是喜欢他们。如果你购买它的话,也许我可以得到一点饮料钱。还要注意,在Windows上安装Sendy,在他们说之前显然还是不支持的。不要在Windows问题上烦扰那些友善的人。假设你拥有足够的技术,而且愿意进行尝试。我在Azure上安装只是因为我在Azure上已经有12个站点了。你也许可以在一台亚马逊或者Linode的Linux机器成功安装。祝你好运!

Comments (1)

  1. fancypantsmail now is Newsletter Plus Software says:

    I oppened fancypantsmail.azurewebsites.net and it is other PHP application foe Email marketing. It is support sending via Amazon SES API, Mandrill API and Sendgridd API. So good.

Skip to main content