楽天ブログに自動で記事を投稿したい

  技術情報

楽天ブログではメールで記事を投稿する機能があります。この機能を使えばプログラムからブログ投稿が簡単にできそうです。ブラウザをコントロールしてweb画面から記事を投稿するよりはるかに簡単そうです。

ということで調べてみたのですが、「決められたアドレスへメール送信することで投稿」というものではなく、「楽天ブログから配信されるメールに書かれたアドレスへメールを送信することで投稿」できる仕組みのようなのです。

配信についてはブログの管理画面から、何曜日に送ってほしいか設定できるようになっていました。試しに設定してみると、該当する曜日の朝9時過ぎにメールが届きました。

Subject: 19日の日記
Date: Thu, 19 Aug 2021 09:06:57 +0900 (JST)
From: info@plaza.rakuten.co.jp no-reply@plaza.rakuten.co.jp
Reply-To: ******1234@mb.plaza.rakuten.co.jp
To: *******9999@yahoo.co.jp

<※このメールに返信しても日記を更新することは出来ません※>

<日記を更新する場合は、 *******1234@mb.plaza.rakuten.co.jp にメールを 送信して下さい>
<メールの件名が日記の件名、メールの本文が日記の本文として、日記が更新さ れます>
<画像を添付すると、画像付きの日記が更新できます>

<配信停止URL…

このメールに返信することで投稿を行えることは確認できました。反映もそこそこ早いみたいです。
しかしプログラムから自動でメール送信するという目標への技術的なハードルが一気に高くなってしまいました。

私は楽天用にYahooメールを使っているので、Yahooの受信箱を巡回、条件を満たすメールから記事投稿用のアドレスを取得することになります。

まずは下記のページを参考にpopアクセスを有効にしておく必要があります。(すでにメールクライアントを使っている人は不要です)

メールソフトで送受信するには(Yahoo!メールアドレスの場合) (yahoo-net.jp)

https://support.yahoo-net.jp/PccMail/s/article/H000007321
設定項目入力内容
受信メール(POP)サーバーpop.mail.yahoo.co.jp
受信メール(POP)ポート番号995
受信メール(POP)通信方法SSL(暗号化)
アカウント名、または、ログイン名Yahoo! JAPAN ID
パスワードYahoo! JAPAN IDのパスワード
popでの設定

ということで、Yahooメールの受信箱から投稿用のメールを探すプログラムを作ってみました。

// https://mvnrepository.com/artifact/com.sun.mail/javax.mail
@Grab(group='com.sun.mail', module='javax.mail', version='1.6.2')

import javax.mail.Folder
import javax.mail.Message
import javax.mail.Session
import javax.mail.Store
import javax.mail.URLName
import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util.regex.Matcher
import java.util.regex.Pattern
import javax.mail.Address


String host = 'pop.mail.yahoo.co.jp'
String user = '******'
String pass = '******'
String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory"

Properties properties = System.properties
properties.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY)
properties.setProperty('mail.pop3.port', '995')
properties.setProperty('mail.pop3.socketFactory.port', '995')
properties.setProperty("mail.pop3.ssl.trust", "*")  // Trust all Servers

Session session = Session.getDefaultInstance(properties)

URLName urln = new URLName('pop3', host, 995, null, user, pass)
Store store = session.getStore(urln)

store.connect()
Folder inbox = store.getFolder('Inbox')
inbox.open(Folder.READ_ONLY)

DateFormat sdf = new SimpleDateFormat('yyyy/MM/dd')
Date today = new Date()
String todayYmd = sdf.format(today)
println("今日の日付 : ${todayYmd} の投稿メール")
println("メッセージ数 : ${inbox.messageCount}")

Pattern ptn = ~/^(?<day>[0-9]{1,2})日の日記$/

Message[] messages = inbox.getMessages()
messages.each { Message it->
    Matcher mt = ptn.matcher(it.subject)
    Date sentDate = it.getSentDate()
    if (mt.find() && sentDate != null) {
        println("Subject : ${it.getSubject()}")
        String sentYmd = sdf.format(sentDate)
        int day = mt.group('day').toInteger()
        if (todayYmd == sentYmd) {
            println(" From    : ${it.getFrom()}")
            println(" ReplyTo : ${it.getReplyTo()}")
        }
    }
}

inbox.close(true)
store.close()

ユーザIDはメールアドレスではなく、あくまでID部分になります。
また、本格的に使う場合は、try-catchを使ってinbox.closeやstore.closeはfinally句に書くとかした方がいいと思います。

そんなこんなで投稿用のメールアドレスの取得が確立できました。

参考にしたページ

JavaMail POP3 over SSL Connect failed;

https://stackoverflow.com/questions/22037210/javamail-pop3-over-ssl-connect-failed

java mail pop3 imap 受信

https://qiita.com/koryo/items/0fa66023d7ca8efcff41

A JavaMail POP reader example (pop3 reader)

https://alvinalexander.com/java/javamail-pop-pop3-reader-email-inbox-example/

追記

うまく動かないときはデバッグ出力を有効にしましょう。

properties.setProperty("mail.debug", "true")

IDやパスワードが正しいはずなのにどうしてもエラーになってしまう場合、こんなエラーメッセージ「(#AUTH403) Incorrect username or password.」が出ていませんか?

これは海外からのアクセス制限が有効になっているときの応答らしいです。クラウド上のPCでは、意図しないうちに海外からのアクセスになっていることがあります。下記ヘルプを参考に制限を無効化しましょう。

Yahoo!メール ヘルプ – 海外からのアクセス制限 –
海外からのメールソフトによるアクセスを制限できます。海外から、メールソフトやスマートフォンを利用してYahoo!メールを閲覧しない場合は、アクセス制限を設定することで、メールアカウントを第三者に利用されることや、メールの情報が漏えいする危険性を軽減できます。

https://support.yahoo-net.jp/SccMail/s/article/H000010027

LEAVE A COMMENT