使用阿里雲郵件推送服務羣發郵件

EDM(電子郵件營銷)已經誕生了很多年,在國內隨着很多IM工具的普及,曾經有人斷言:郵件將在不久的將來消失,然而從目前來看並沒有消失。實際上郵件在很多特定場景是有她的重要用途的。

在亞馬孫上購物完成之後,亞馬遜會根據我的歷史購物記錄配合自身的推薦系統,向我推薦可能感興趣的書籍,這樣可以有效地促成轉化。網站註冊,忘記密碼等服務也有很多用郵件來完成。

最近我有一項需求,我想利用郵件羣發來做推廣,就是流傳已久的EDM營銷。原本我以爲這事其實沒什麼難度,找下第三方郵件發送,熟悉下sdk羣發郵件就行了,任何事情如果自己沒做過,其實是不瞭解細節的,郵件羣發存在很多細節需要注意,記錄下這次郵件羣發的思考。

首先挑選郵件羣發第三方服務,我沒有看很多第三方服務,就看了兩家,一個是搜狐,另外一個是阿里雲。比對下來阿里雲的價格更加便宜,所以我就選擇了阿里雲的郵件推送服務。阿里雲的價格如下:

每天200封免費,超出部分才計費,初始值每天2000封,這個數量是隨着發送質量動態調整的,這個需要特別注意,要發送經過驗證可達的真實郵箱,否則會被降低每日發送數量,嚴重的可能被封。被封之後,可以申請解封,但是每個賬號只有兩次機會,這個特別需要注意。我就因爲沒有仔細去了解這個規則,被封了一次,如何確保郵箱質量,我在下文將會提到。

想要發送郵件首先你得有個域名。第一步就是到阿里萬網申請一個域名,申請域名的步驟這裏就不做概述了。使用阿里雲的郵件推送服務,需要申請開通這個功能,到申請開通入口,點擊申請開通按鈕。

進入到阿里雲管理控制檯—>郵件推送—>發信域名頁面,點擊右上角的新建域名:

點擊新建域名之後,在輸入框中輸入自己的發送域名,這裏不建議使用企業郵箱作爲域名,這也是阿里雲的建議,原因其實很簡單,如果大量發送營銷推廣郵件,會導致郵箱使用異常。所以建議使用二級域名作爲發送域名,例如:mail.taobao.com。

發信域名添加完成之後,主界面就會出現一條數據。我們需要針對這個發信域名做配置:

點擊配置鏈接,將會出現一個配置參數頁面,參數頁面看上去很複雜,有人可能看到就想放棄了。其實很簡單。配置頁面總共有4個參數,其中3個參數是必須的。我們只需要把這3項參數複製到萬網的解析記錄中去就可以了。我們來看下配置參數:(配置參數說明圖)

其中1 ,2,3參數是必須的,第四個可以忽略。接下來我們要做的就是將上圖中配置界面的參數複製到域名解析列表中。打開阿里萬網的域名列表(阿里雲管理控制檯—>域名與網站(萬網)—>域名),如圖:

點擊解析鏈接,進入到解析設置頁面,進入頁面之後,點擊右上角的添加記錄按鈕,在彈出框中進行設置,彈出框界面如下:

簡單說下這幾個參數,記錄類型:記錄類型就是將上文中提到過的(配置參數說明圖)中的4種類型,全部添加進來。主機記錄也是參照上文(配置參數說明圖)的主機記錄,將圖中的主機記錄複製過來即可。解析線路保持默認即可。記錄值:記錄值就是在(配置參數說明圖)中有一個”記錄值”的一列,只需要把這一列的值複製過來就行了,有木有很簡單。

總共需要添加4次記錄就完成了解析設置,添加完成之後,界面是這樣的:

域名解析完成之後,下一步就是發信地址(阿里雲管理控制檯-->郵件推送-->發信地址)的配置了:

新建發信地址如下:

發信域名選項選擇已經配置完成的發信域名即可,賬號輸入,例如我的賬號是這樣的:[email protected]。回信地址如果沒有就不必填寫,我沒用過回信地址,所以我在這裏是沒有填寫的。發信類型選擇批量郵件。

發信地址設置完成,列表頁面就會出現剛纔添加的記錄了:

這裏需要注意一點,上圖中有一個選項:設置SMTP密碼。如果你想用smtp協議來發送郵件,那麼就需要設置smtp密碼。發送郵件有兩種方式,一種是smtp,另一種是使用阿里雲自身的sdk,使用sdk用的是阿里雲提供的密鑰。如果選擇smtp方式發送,那麼就設置下smtp密碼。

至此,所有的設置步驟已經完成了,接下來就是發送的過程了。我是使用了smtp方式作爲郵件發送的。主要考慮是以下幾點。用阿里雲的sdk發送,需要用到accessSecret,accessSecret擁有賬號的所有權限,我的代碼又是託管到git服務器上的,所以爲了安全起見用了smtp方式。

阿里雲本身也提供了子賬號的accessSecret權限,建立子賬號後,可以規定子賬號的權限,比如可以建立一個只能發送郵件的子賬號accessSecret。這樣就可以保證安全性。

smtp發送的代碼非常簡單,主要用到了第三方的類庫,代碼如下:

public class MailService {
    private static MailService mailService;

    public static MailService getInstance(String username, String pwd, String smtp,String port) {
        if (mailService== null) {
            mailService= new MailService(username, pwd, smtp,port);
            return mailService;
        } else {
            return mailService;
        }
    }

    private final transient Properties props = System.getProperties();

    /**
/     * 郵件服務器登錄驗證/
/     */
private transient MailAuthenticator authenticator;

    /**
/     * 郵箱session/
/     */
private transient Session session;

    private MailService(String username, String pwd, String smtp,String port) {
        authenticator = new MailAuthenticator(username, pwd);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", smtp);
        props.put("mail.smtp.port",port);
        session = Session.getInstance(props, authenticator);
    }

    //**/
/     * 發送郵件/
/     */
/     */*@param*/recipient 收件人郵箱地址/
/     */*@param*/subject   郵件主題/
/     */*@param*/content   郵件內容/
/     */*@throws*/AddressException/
/     */*@throws*/MessagingException/
/     *//
public void send(String recipient, String subject, String content)
            throws MessagingException {
        final MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(authenticator.getUsername()));
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(recipient));
        message.setSubject(subject);
        message.setContent(content, "text/html;charset=utf-8");
        Transport.send(message);
    }

    //**/
/     * 羣發郵件/
/     */
/     */*@param*/recipients 收件人們/
/     */*@param*/subject    主題/
/     */*@param*/content    內容/
/     */*@throws*/AddressException/
/     */*@throws*/MessagingException/
/     *//
public void send(List<String> recipients, String subject, String content) throws MessagingException {
        final MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(authenticator.getUsername()));
        final int num = recipients.size();
        InternetAddress[] addresses = new InternetAddress[num];
        for (int i = 0; i < num; i++) {
            addresses[i] = new InternetAddress(recipients.get(i));
        }
        message.setRecipients(MimeMessage.RecipientType.TO, addresses);
        message.setSubject(subject);
        message.setContent(content, "text/html;charset=utf-8");
        Transport.send(message);
    }
}

以上需要引用java.mail類庫:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.5.6</version>
</dependency>

阿里雲的配置信息如下:
[email protected]
mail.aliyunAuthorizationCode=你的smtp密碼
mail.aliyunSmtp=smtpdm.aliyun.com
mail.aliyunPort=25

以上就是使用阿里雲發送郵件的全過程了,總體上還是比較簡單的。下面再來說說需要注意的地方。

阿里雲每日的發送量是有限的,這個根據你的郵箱發送質量決定,初始值是2000,之後會根據你的郵箱質量動態調整。起初我發送了很多沒有驗證過的郵箱導致我被封,所以在大量發送郵件之前,請確保你的郵箱是真實可達的。

那麼如何驗證郵箱的真實有效性呢?這還真是個問題,思路可以參考下阮一峯的這篇文章:如何驗證 Email 地址。我在看完此篇文章之後,覺得應該沒什麼問題,覺得有效性是個可以用代碼解決的問題,我嘗試了之前阿里雲後臺發送失敗的一些郵箱,按照博客中的協議嘗試了下,沒想到返回的是200。

就是說用協議去驗證郵箱地址的時候,返回了200,但是郵箱地址其實是不存在的,這個我用qq郵箱發送過,確實是不存在的。然後我嘗試使用了第三方的服務,例如Verify Email,這個網站是按照調用次數收費的,收費價格如下:

看到了這個價格,屌絲的我已經承受不起了,因爲我的郵箱數量有幾十萬,所以費用可能會非常高,但是郵箱的轉化率實際上是比較低的,所以權衡成本,這個服務我是用不了的。此外我還發現有些不存在的qq郵箱,這個網站的驗證結果是成功的。這說明這個網站的驗證服務其實是有失敗率的。

我又看了利劍郵箱驗證和Fast Email Verifier,這兩款軟件的測試結果都不理想。最後我在網上找到了一款email驗證。總體說來這款軟件是最讓我滿意的一款,擁有非常高的準確率,當然是收費的,我花了100元,終身使用。我覺得物有所值。在這之前我覺得驗證郵箱的有效性其實不是非常難,沒想到這個事情是有技術壁壘的,出乎我的意料。

這款軟件唯一不足的地方就是沒有sdk,採用手動倒入email地址,然後批量導出有效或者無效的地址,然後自己再將這些地址倒入到自己的數據庫中,進行郵件羣發,我在使用了這款軟件之後,阿里雲後臺的數據準確性如下圖:

可以看到無效地址非常低。

第二個需要注意的地方就是郵件模板。郵件模板我之前也是覺得非常簡單,不就是一個簡單的html嗎? 真的如此嗎?事實並不是這樣,每個郵件服務商針對郵件都喜歡做不同的處理,導致你發出的郵件,客戶看到的跟你的實際上會有些區別。可以參考下這篇HTML Email 編寫指南

那麼我們如何做一個html模板呢,當然是使用一個成熟的郵件模板了,這樣少了很多煩惱和兼容性的問題。這類模板網上有很多,可以自行搜索,我使用了這個郵件模板,覺得還不錯。

郵件羣發到這裏就介紹完了,主要介紹了阿里雲的配置,還有遇到的問題和需要注意的地方,碼字不易,如果對你有幫助,歡迎點贊。詳細可以查看阿里雲郵件推送文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章