SQLの窓

2018年10月24日


Javamail で IMAP 受信

https://javaee.github.io/javamail/


マルチパートは、最大3つまでチェックして、2番目か3番目に添付ファイルがあれば保存します。
2番目が HTML メールの場合は、標準出力に出力します。

ヘッダ部分は、メッセージ番号で取得しますが、違った処理を行う為に UID に変換しておいて、本文の取得には UID を使用します。

メッセージボックス(フォルダ) にメッセージをコピーまたは移動している場合は、日付順には並びません。自分でソートする必要があります。
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.UIDFolder;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeUtility;

public class Main {

	public static void main(String[] args) {

		try {
		
			// http://connector.sourceforge.net/doc-files/Properties.html
			Properties props = System.getProperties();
			// セッション
			Session session = Session.getInstance(props, null);
			// IMAP で SSL を使用する
			Store imap4 = session.getStore("imaps");
	
			// 接続
			imap4.connect("さくらユーザ.sakura.ne.jp", 993, "ユーザ@さくらユーザ.sakura.ne.jp", "パスワード");
	
			System.out.println(imap4.getURLName().toString());
	
			// https://stackoverflow.com/questions/11435947/how-do-i-uniquely-identify-a-java-mail-message-using-imap
			Folder folder = imap4.getFolder("INBOX");
			UIDFolder uf = (UIDFolder)folder;
			folder.open(Folder.READ_ONLY);
	
			// 全てのメッセージ
			int totalMessages = folder.getMessageCount();
			System.out.println("Total messages = " + totalMessages);
	
			// 新しいメッセージ
			int newMessages = folder.getNewMessageCount();
			System.out.println("New messages = " + newMessages);
	
			// メッセージの一覧を取得
			Message[] msgs = folder.getMessages();

			// メッセージがコピー・移動されていると日付順とは限らない
			for (int i = msgs.length-1; i >= 0; i--) {
	
				// UID を取得
				Long messageId = uf.getUID(msgs[i]);
				System.out.println("UID = " + messageId);
				
				// From
				Address[] address = msgs[i].getFrom();
				String addressText = "";
				if (address != null) {
					// address[0].toString() のままでは正しく表示されない
					addressText = MimeUtility.decodeText(address[0].toString());
				}
				System.out.println("Address = " + addressText);
	
				// Subject
				String subjectText = MimeUtility.decodeText(msgs[i].getSubject());
				System.out.println("Subject = " + subjectText);
	
				// 受信日時
				Date date = msgs[i].getSentDate();
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
				String dateText = sdf.format(date);
				System.out.println("Date = " + dateText);
	
				// 本文(  UID より取得 )
				Message msg = uf.getMessageByUID(messageId);
				Part part = msg;
				String bodyText = "";
				if (part.isMimeType("text/plain")) {
					bodyText = part.getContent().toString();
				}
				else if (part.isMimeType("multipart/*")) {
					Multipart mp = (Multipart)part.getContent();
					// マルチパートの先頭
					bodyText = mp.getBodyPart(0).getContent().toString();
					
					if ( mp.getBodyPart(1).isMimeType("text/html") ) {
						String htmlText = mp.getBodyPart(1).getContent().toString(); 
						System.out.println("HtmlText = " + htmlText);
					}

					String filename = ((Part)mp.getBodyPart(1)).getFileName();
					// ファイル名があったら保存 
					if ( filename != null ) {
						System.out.println("ファイル名 = " + filename);
						File file = new File(filename);
						((MimeBodyPart)mp.getBodyPart(1)).saveFile(file);
					}

					// 3つ目がある場合
					if ( mp.getCount() > 2 ) { 
						filename = ((Part)mp.getBodyPart(2)).getFileName();
						// ファイル名があったら保存 
						if ( filename != null ) {
							System.out.println("ファイル名 = " + filename);
							File file = new File(filename);
							((MimeBodyPart)mp.getBodyPart(2)).saveFile(file);
						}
					}
				}
				
				System.out.println("Body = " + bodyText);
				
			}
	
			folder.close();
			imap4.close();
			
		} catch (Exception ex) {
			// handle any errors
			System.out.println("Exception: " + ex.getMessage());
		}
			
	}

}





posted by lightbox at 2018-10-24 16:29 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

2018年10月21日


TKMP + imap + C# + PowerShell : メールボックス(階層)の一覧表示

.NET用メール送受信クラスライブラリ (TKMP.DLL)

TKMP : ImapClient Members

TKMP : Mailbox Members

▼ バッチファイル
powershell -NoProfile -ExecutionPolicy Unrestricted .\imap_sub_mailbox.ps1 ユーザ パスワード
imap_sub_mailbox.ps1
$user = $Args[0]
$pass = $Args[1]

$code = @"
using System;
using TKMP.Net;
using TKMP.Reader;
public class MyClass {
	public static void mail_Subbox() {

		ImapClient client = null;

		// 接続準備
		BasicImapLogon logon = new BasicImapLogon("${user}@さくらユーザ.sakura.ne.jp", "${pass}");
		client = new ImapClient(logon, "さくらユーザ.sakura.ne.jp", 993);
		client.AuthenticationProtocol = AuthenticationProtocols.SSL;

		// 接続
		try {
			if (!client.Connect())
			{
				Console.WriteLine("接続できませんでした");
				return;
			}
		}
		catch (Exception ex) {
			Console.WriteLine("接続エラーが発生しました" + ex.Message );
			return;
		}

		// 階層のセパレータ文字列の取得
		Console.WriteLine("Separator : " + client.Separator);

		// デフォルトメールボックスの表示
		Console.WriteLine("FullName : " + client.DefaultMailbox.FullName);

		// Mailbox 一覧 : 実質 INBOX
		Mailbox[] mailbox_list = client.GetMailBox();

		foreach (Mailbox mb in mailbox_list) {

			Console.WriteLine( "ルート : " + mb.FullName);

			// 全て表示
			show_Subbox( mb );

		}

		// 受信終了
		client.Close();

	}

	// ***************************************
	// メールボックス(階層)の一覧表示
	// ***************************************
	public static void show_Subbox( Mailbox mb ) {

		Console.WriteLine( "mailbox : " + mb.FullName );

		if ( (mb.Flags & MailBoxFlags.HasChildren) == MailBoxFlags.HasChildren ) {

			Mailbox[] mailbox_list = mb.SubMailbox;
			foreach (Mailbox mailbox in mailbox_list) {

				show_Subbox( mailbox );

			}
		}

	}
}
"@

$path = "C:\user\ps\TKMPDLL_3.1.8"
Add-Type -Path ("${path}\TKMP.dll")
Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies ("${path}\TKMP.dll")

[MyClass]::mail_Subbox()


実行結果
Separator : .
FullName : INBOX
ルート : INBOX
mailbox : INBOX
mailbox : INBOX.個人用
mailbox : INBOX.AAA
mailbox : INBOX.spam
mailbox : INBOX.Sent
mailbox : INBOX.TEST
mailbox : INBOX.Trash
mailbox : INBOX.Draft
mailbox : INBOX.Drafts
mailbox : INBOX.最上位のフォルダ
mailbox : INBOX.メールアイテム格納用
mailbox : INBOX.メールアイテム格納用.階層テスト
posted by lightbox at 2018-10-21 11:06 | PowerShell + C# | このブログの読者になる | 更新情報をチェックする

nuget.exe + SMO + PowerShell + C# : テーブルの CREATE TABLE 文 を取得

nuget.exe Windows x86 Commandline のダウンロードページ

ダウンロードする SMO のバージョン確認

▼ SMO のダウンロード
nuget install Microsoft.SqlServer.SqlManagementObjects -Version 140.17283.0
▼ PowerShell 実行用のバッチファイル
powershell -NoProfile -ExecutionPolicy Unrestricted .\create_sql.ps1 sa ""
create_sql.ps1
# バッチファイルからの引数
$user = $Args[0]
$pass = $Args[1]

$code = @"
using System;
using System.Text;
using System.IO;
using System.Collections.Generic;
using System.Collections.Specialized;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;

public class MyClass {

	public static void create_sql() {

		// BOM なしのテキスト用
		// https://docs.microsoft.com/ja-jp/dotnet/api/system.text.utf8encoding.-ctor?view=netframework-4.7.2
		UTF8Encoding UTF8N_Enc = new UTF8Encoding(false);

		// false は上書き
		// https://docs.microsoft.com/ja-jp/dotnet/api/system.io.streamwriter.-ctor?view=netframework-4.7.2
		StreamWriter WriteFile = new StreamWriter("sqlexpress.sql", false, UTF8N_Enc);

		// サーバー : Microsoft.SqlServer
		Server srv;
		// インスタンス
		srv = new Server();

		// サーバーインスタンスの情報
		srv.ConnectionContext.AutoDisconnectMode = AutoDisconnectMode.NoAutoDisconnect;
		srv.ConnectionContext.LoginSecure = false;

		// PowerShell の文字列の埋め込み
		srv.ConnectionContext.Login = "${user}";
		srv.ConnectionContext.Password = "${pass}";

		// 接続
		srv.ConnectionContext.Connect();

		// バージョンの表示
		Console.WriteLine(srv.Information.Version);

		// データベース選択
		Database myDb = srv.Databases["lightbox"];

		// テーブル一覧
		foreach (Table myTable in myDb.Tables) {

			// テーブルに関するスクリプト一覧
			StringCollection tableScripts = myTable.Script();

			// スクリプトの書き込み
			foreach (string script in tableScripts) {
				// テキストファイル書き込み
				WriteFile.WriteLine(script);
			}
		}

		// 出力テキストファイルの後処理
		WriteFile.Close();
		WriteFile.Dispose();

		// 接続解除
		srv.ConnectionContext.Disconnect();

	}
}
"@

# 共通のパスを作成
$path = "C:\user\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40"

# 配列定義
$dll = @(1..5)

# 配列にライブラリファイル名を代入
$dll[0] = "Microsoft.SqlServer.ConnectionInfo.dll"
$dll[1] = "Microsoft.SqlServer.Smo.dll"
$dll[2] = "Microsoft.SqlServer.Management.Sdk.Sfc.dll"
$dll[3] = "Microsoft.SqlServer.SmoExtended.dll"
$dll[4] = "Microsoft.SqlServer.SqlEnum.dll"

# PowerShell の単純変数の埋め込みと配列変数の埋め込み
Add-Type -Path `
	( `
	"${path}\$($dll[0])", `
	"${path}\$($dll[1])", `
	"${path}\$($dll[2])", `
	"${path}\$($dll[3])", `
	"${path}\$($dll[4])" `
	)

Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies `
	( `
	"${path}\$($dll[0])", `
	"${path}\$($dll[1])", `
	"${path}\$($dll[2])", `
	"${path}\$($dll[3])", `
	"${path}\$($dll[4])" `
	)

# 実行
[MyClass]::create_sql()

関連する記事

C# : SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する

C# : VB.net : SQLExpress(SQLServer) : SQL-DMO と同等の SMO によるバックアップ
上のリンク先のコードを使用すれば、PowerShell で SQLServer のバックアップが出来ます
posted by lightbox at 2018-10-21 10:12 | PowerShell + C# | このブログの読者になる | 更新情報をチェックする

2018年10月19日


C# : SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する

SMO のダウンロード方法は、C# : VB.net : SQLExpress(SQLServer) : SQL-DMO と同等の SMO によるバックアップ を参照して下さい。

こちらは、同じコードを PowerShell で実行します

参考ページ : Generate Scripts for database objects with SMO for SQL Server
※ 参考ページでは、いろいろなオプションが紹介されています。

using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SQLExpress_backup
{
	class Program
	{
		static void Main(string[] args)
		{

			{

				UTF8Encoding UTF8N_Enc = new UTF8Encoding();
				// false は上書き
				StreamWriter WriteFile = new StreamWriter("sqlexpress.sql", false, UTF8N_Enc);

				// サーバー
				Server srv;
				// インスタンス
				srv = new Server();

				// サーバーインスタンスの情報
				srv.ConnectionContext.AutoDisconnectMode = AutoDisconnectMode.NoAutoDisconnect;
				srv.ConnectionContext.LoginSecure = false;
				srv.ConnectionContext.Login = "sa";
				srv.ConnectionContext.Password = "";
				// 接続
				srv.ConnectionContext.Connect();

				// バージョンの表示
				Console.WriteLine(srv.Information.Version);

				// 参考
				// https://www.mssqltips.com/sqlservertip/1833/generate-scripts-for-database-objects-with-smo-for-sql-server/
				// Scripter scripter = new Scripter(srv);

				Database myDb = srv.Databases["lightbox"];
				foreach (Table myTable in myDb.Tables)
				{

					StringCollection tableScripts = myTable.Script();
					foreach (string script in tableScripts)
					{
						WriteFile.WriteLine(script);
					}
				}

				WriteFile.Close();
				WriteFile.Dispose();

				srv.ConnectionContext.Disconnect();

			}


		}
	}
}


結果サンプル

※ sqlexpress.sql に出力された内容です
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[コード名称マスタ](
	[区分] [int] NOT NULL,
	[コード] [nvarchar](10) COLLATE Japanese_CI_AS NOT NULL,
	[名称] [nvarchar](50) COLLATE Japanese_CI_AS NULL,
	[数値1] [int] NULL,
	[数値2] [int] NULL,
	[作成日] [datetime] NULL,
	[更新日] [datetime] NULL
) ON [PRIMARY]

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[社員マスタ](
	[社員コード] [nvarchar](4) COLLATE Japanese_CI_AS NOT NULL,
	[氏名] [nvarchar](50) COLLATE Japanese_CI_AS NULL,
	[フリガナ] [nvarchar](50) COLLATE Japanese_CI_AS NULL,
	[所属] [nvarchar](4) COLLATE Japanese_CI_AS NULL,
	[性別] [int] NULL,
	[作成日] [datetime] NULL,
	[更新日] [datetime] NULL,
	[給与] [int] NULL,
	[手当] [int] NULL,
	[管理者] [nvarchar](4) COLLATE Japanese_CI_AS NULL,
	[生年月日] [datetime] NULL
) ON [PRIMARY]

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[取引データ](
	[取引区分] [nvarchar](2) COLLATE Japanese_CI_AS NOT NULL,
	[伝票番号] [int] NOT NULL,
	[行] [int] NOT NULL,
	[取引日付] [datetime] NULL,
	[取引先コード] [nvarchar](4) COLLATE Japanese_CI_AS NULL,
	[商品コード] [nvarchar](4) COLLATE Japanese_CI_AS NULL,
	[数量] [int] NULL,
	[単価] [int] NULL,
	[金額] [int] NULL,
	[更新済] [nvarchar](1) COLLATE Japanese_CI_AS NULL
) ON [PRIMARY]

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[商品マスタ](
	[商品コード] [nvarchar](4) COLLATE Japanese_CI_AS NOT NULL,
	[商品名] [nvarchar](50) COLLATE Japanese_CI_AS NULL,
	[在庫評価単価] [int] NULL,
	[販売単価] [int] NULL,
	[商品分類] [nvarchar](3) COLLATE Japanese_CI_AS NULL,
	[商品区分] [nvarchar](1) COLLATE Japanese_CI_AS NULL,
	[作成日] [datetime] NULL,
	[更新日] [datetime] NULL,
	[備考] [ntext] COLLATE Japanese_CI_AS NULL,
	[削除フラグ] [nvarchar](1) COLLATE Japanese_CI_AS NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[得意先マスタ](
	[得意先コード] [nvarchar](4) COLLATE Japanese_CI_AS NOT NULL,
	[得意先名] [nvarchar](50) COLLATE Japanese_CI_AS NULL,
	[得意先区分] [nvarchar](1) COLLATE Japanese_CI_AS NULL,
	[担当者] [nvarchar](4) COLLATE Japanese_CI_AS NULL,
	[郵便番号] [nvarchar](7) COLLATE Japanese_CI_AS NULL,
	[住所1] [nvarchar](100) COLLATE Japanese_CI_AS NULL,
	[住所2] [nvarchar](100) COLLATE Japanese_CI_AS NULL,
	[作成日] [datetime] NULL,
	[更新日] [datetime] NULL,
	[締日] [int] NULL,
	[締日区分] [int] NULL,
	[支払日] [int] NULL,
	[備考] [nvarchar](100) COLLATE Japanese_CI_AS NULL
) ON [PRIMARY]

SET ANSI_NULLS (Transact-SQL)
SET ANSI_NULLS が ON の場合、WHERE column_name = NULL を使用する SELECT ステートメントを実行すると、column_name に NULL 値が入っていた場合は条件は成り立たず、行が返されません。逆に、SET ANSI_NULLS が OFF の場合は、ISO 標準が適用されません。 WHERE column_name = NULL を使用する SELECT ステートメントでは、column_name に NULL 値を持つ行が返されます。

SET ANSI_NULLS OFF;
select * from [社員マスタ] where 手当 = null;

この SQL では、手当が NULL の行が戻されます


SET QUOTED_IDENTIFIER ON にすると、テーブル名等の識別市子を "(ダブルクォート)で囲む事ができます

SET QUOTED_IDENTIFIER OFF; 
select * from "社員マスタ"

この SQL はエラーとなります
posted by lightbox at 2018-10-19 14:10 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2018年10月18日


PHP の imap 関数で( Windows ローカル )、Yahoo メールのメールをさくらインターネットのメールへコピーする

imap_append でデータを追加しているので、同じメールでも追加されて増えていきます。

メッセージ作成に時間がかかるので、WEB 上の実行の場合は、タイムアウトに注意する必要があります。

imap_utf8_to_mutf7 は、日本語で作成されたフォルダに対して必要です。
<?php
error_reporting( E_ALL & ~E_NOTICE & ~E_STRICT );
session_cache_limiter('nocache');
session_start();

header( "Access-Control-Allow-Origin: *" );
header( "Content-Type: application/json; charset=utf-8" );

# デバッグログの初期化
file_put_contents("debug.log", "開始\n" );

mb_internal_encoding("UTF-8");

xlog("ログの出力");

# ***************************
# IMAP 接続( 送信元 )
# ***************************
$con = @imap_open("{imap.mail.yahoo.co.jp:993/imap/ssl}INBOX", "アカウント", "パスワード");
if ( $con === FALSE ) {
	print imap_last_error();
	xlog(imap_last_error());
	exit();
}

# ***************************
# IMAP 接続( 送信先 )
# ***************************
$folder = imap_utf8_to_mutf7("個人用");
$con2 = @imap_open("{さくらユーザ.sakura.ne.jp:993/imap/ssl}INBOX.{$folder}", "ユーザ@さくらユーザ.sakura.ne.jp", "パスワード");
if ( $con2 === FALSE ) {
	print imap_last_error();
	xlog(imap_last_error());
	exit();
}

# ***************************
// 現在のメールボックスに関する情報を得る
# ***************************
$mbox_info = imap_mailboxmsginfo( $con );
xlog("\n■■■ \$mbox_info 現在のメールボックスに関する情報 -------");
xlog( print_r( $mbox_info ,true ));

if( $mbox_info->Nmsgs == 0 ) {
	xlog( "メールメッセージがありません" );
	exit();
}

// ***************************
// メッセージ件数
// ***************************
$max = $mbox_info->Nmsgs;
xlog("【メッセージ件数:{$max}】" );

// 一番古いものから 30件
if ( $max > 30 ) {
	$max = 30;
}

// ***************************
// $max 〜 1
// 最新から表示
// ***************************
for( $i = 1; $i <= $max; $i++ ) {

	$header = imap_fetchheader( $con, $i );
	$body = imap_body( $con, $i );
	imap_append( $con2, "{さくらユーザ.sakura.ne.jp:993/imap/ssl}INBOX.{$folder}", $header . "\r\n" . $body );

}

// ***************************
// IMAP 接続解除
// ***************************
imap_close($con2);
imap_close($con);

print json_encode($mbox_info, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE );

// ***************************
// ログ出力
// ***************************
function xlog($message) {
	file_put_contents("debug.log", "{$message}\n" , FILE_APPEND );
}
?>





posted by lightbox at 2018-10-18 15:22 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

PHP の imap 関数( Windows のローカル )で、さくらインターネットのメールボックスの情報を取得する

Sylpheed( Windows メールクライアント ) で、INBOX のフォルダの中にさらにフォルダを作成して読み出しています



<?php
error_reporting( E_ALL & ~E_NOTICE & ~E_STRICT );
session_cache_limiter('nocache');
session_start();

header( "Access-Control-Allow-Origin: *" );
header( "Content-Type: application/json; charset=utf-8" );

# デバッグログの初期化
file_put_contents("debug.log", "開始\n" );

mb_internal_encoding("UTF-8");

xlog("ログの出力");

# ***************************
# IMAP 接続
# ***************************
$con = @imap_open("{さくらサーバ:993/imap/ssl}INBOX", "アカウント", "パスワード");
if ( $con === FALSE ) {
	print imap_last_error();
	xlog(imap_last_error());
	exit();
}

// メールボックスのリストを読み込み、各ボックスに関する詳細な情報を返す
$mbox = imap_getmailboxes( $con, "{さくらサーバ}", "*" );
xlog("\n■■■ \$mbox_info 現在のメールボックスに関する情報 -------");
xlog( print_r( $mbox ,true ));

if( $mbox == FALSE ) {
	xlog( "imap_getmailboxes に失敗しました" );
	exit();
}

# ***************************
# デリミタ取得( サーバ依存 )
# ***************************
$delimiter = $mbox[0]->delimiter;

# ***************************
# フォルダ情報の配列
# ***************************
foreach ($mbox as $obj) {

	// サーバー文字列を削除して
	// 日本語を含むフォルダをデコード
	$obj->name = imap_mutf7_to_utf8( str_replace( "{さくらサーバ}", "", $obj->name ) );

	// . が無い場合は、ルートのメールボックス
	if ( strstr($obj->name,".") !== FALSE ) {

		// フォルダパスの分解
		$data = explode( $delimiter, $obj->name );

		// 先頭はメールボックス
		$mailbox = $data[ 0 ];

		// 先頭より下を再度連結する
		$name = "";
		for( $i = 1; $i < count( $data ); $i++ ) {
			if ( $i > 1 ) {
				$name .= ".";
			}
			$name .= $data[ $i ];
		}

		// フォルダのメールボックス以下の階層
		xlog( $mailbox . " のフォルダ名 : " . $name );

	}

}

// ***************************
// IMAP 接続解除
// ***************************
imap_close($con);

// ***************************
// デバッグ用 JSON出力
// ***************************
print json_encode($mbox, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE );

// ***************************
// ログ出力
// ***************************
function xlog($message) {
	file_put_contents("debug.log", "{$message}\n" , FILE_APPEND );
}
?>


JSON の内容
[
    {
        "name": "INBOX.メールアイテム格納用.階層テスト",
        "attributes": 64,
        "delimiter": "."
    },
    {
        "name": "INBOX.メールアイテム格納用",
        "attributes": 32,
        "delimiter": "."
    },
    {
        "name": "INBOX.Drafts",
        "attributes": 64,
        "delimiter": "."
    },
    {
        "name": "INBOX.Trash",
        "attributes": 64,
        "delimiter": "."
    },
    {
        "name": "INBOX.spam",
        "attributes": 64,
        "delimiter": "."
    },
    {
        "name": "INBOX.Sent",
        "attributes": 64,
        "delimiter": "."
    },
    {
        "name": "INBOX.Draft",
        "attributes": 64,
        "delimiter": "."
    },
    {
        "name": "INBOX",
        "attributes": 40,
        "delimiter": "."
    }
]
log の内容
開始
ログの出力

■■■ $mbox_info 現在のメールボックスに関する情報 -------
Array
(
    [0] => stdClass Object
        (
            [name] => {さくらサーバ}INBOX.&MOEw,DDrMKIwpDDGMOBoPH0NdSg-.&lo5cZDDGMLkwyA-
            [attributes] => 64
            [delimiter] => .
        )

    [1] => stdClass Object
        (
            [name] => {さくらサーバ}INBOX.&MOEw,DDrMKIwpDDGMOBoPH0NdSg-
            [attributes] => 32
            [delimiter] => .
        )

    [2] => stdClass Object
        (
            [name] => {さくらサーバ}INBOX.Drafts
            [attributes] => 64
            [delimiter] => .
        )

    [3] => stdClass Object
        (
            [name] => {さくらサーバ}INBOX.Trash
            [attributes] => 64
            [delimiter] => .
        )

    [4] => stdClass Object
        (
            [name] => {さくらサーバ}INBOX.spam
            [attributes] => 64
            [delimiter] => .
        )

    [5] => stdClass Object
        (
            [name] => {さくらサーバ}INBOX.Sent
            [attributes] => 64
            [delimiter] => .
        )

    [6] => stdClass Object
        (
            [name] => {さくらサーバ}INBOX.Draft
            [attributes] => 64
            [delimiter] => .
        )

    [7] => stdClass Object
        (
            [name] => {さくらサーバ}INBOX
            [attributes] => 40
            [delimiter] => .
        )

)

INBOX のフォルダ名 : メールアイテム格納用.階層テスト
INBOX のフォルダ名 : メールアイテム格納用
INBOX のフォルダ名 : Drafts
INBOX のフォルダ名 : Trash
INBOX のフォルダ名 : spam
INBOX のフォルダ名 : Sent
INBOX のフォルダ名 : Draft
posted by lightbox at 2018-10-18 11:49 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり