SQLの窓

2018年11月15日


WebRTC による WEBカメラ表示( 2018/11/15 ) : iPhone + Safari は iOS11 のみで確認

過去何度も繰り返して来た『WebRTC による WEBカメラ表示』ですが、いろいろ変遷ありつつこのような形で現在動作確認しています。Chrome と Edge で確認したところによると、旧 API でも動作しています。

デモページ

▼ MDN 資料
MediaDevices - Web API インターフェイス | MDN
Taking still photos with WebRTC - Web APIs | MDN

今回、iPhone の iOS11 で 動作確認したところ、旧 API 側で動作したようです。しかし、iOS12 では Safari 側でカメラとマイクを利用すると設定した上で、実行時に許可する必要があるのですが( iOS11 未確認 : PCでは基本的に皆そうです )、うまく動作せず検証は保留となっています( デバイス所持者が自分以外なので )

※ 共通事項 : インターネット上では SSL である事
※ WebRTC が使えない場合は動画で代替え
<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width initial-scale=1.0 minimum-scale=1.0 maximum-scale=1.0 user-scalable=no" name="viewport">
<meta charset="UTF-8">
<link rel="shortcut icon" href="https://winofsql.jp/WinOfSql.ico">

<title>WEBカメラの表示</title>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.1/css/bootstrap.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.css">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.js"></script>

<style>
@media screen and ( min-width:480px ) {
	#content {
		padding: 20px;
	}
	#camera {
		width: 480px;
		height: 360px;
	}
}
@media screen and ( max-width:479px ) {
	#content {
		padding: 0px;
	}
	#camera {
		width: 100%;
	}
}

</style>
</head>
<body>
<div id="content">

	<video id="camera" autoplay></video>
	<a class="btn btn-secondary btn-sm float-right ml-4"
		href=".">フォルダ</a>

	<a class="btn btn-secondary btn-sm float-right ml-4"
		onclick="$('#camera').css({'width':'100%', 'height':'100%'})"
		href="#">100%</a>

	<a class="btn btn-secondary btn-sm float-right"
		onclick="$('#camera').css({'width':'auto', 'height':'auto'})"
		href="#">auto</a>

</div>

<script>
// *************************************
// 簡易スマホチェック
// *************************************
jQuery.isMobile = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()));
toastr.options={"closeButton":false,"debug":false,"newestOnTop":false,"progressBar":false,"positionClass":"toast-bottom-center","preventDuplicates":false,"onclick":null,"showDuration":"300","hideDuration":"1000","timeOut":"3000","extendedTimeOut":"1000","showEasing":"swing","hideEasing":"linear","showMethod":"fadeIn","hideMethod":"fadeOut"};
if ( !$.isMobile ) {
	toastr.options.positionClass = "toast-top-center";
}

// *************************************
// localhost 以外では SSL で処理する
// *************************************
if ( location.host != "localhost" ) {
	if ( location.protocol == "http:" ) {
		location.protocol = "https:"
	}
}

// *************************************
// カメラ参照
// *************************************
// カメラ用 video 要素(DOM オブジェクト)
var camera;
camera = $("#camera").get(0);

// *************************************
// 最新 API
// *************************************
if ( navigator.mediaDevices ) {

	// カメラ表示
	navigator.mediaDevices.getUserMedia({video: true})
	.then(function(stream){
		// カメラのストリームを表示
		camera.srcObject = stream;
	})
	.catch(function(err){
		// ブラウザで使用を拒否した場合等( 動画で代替 )
		errorVideo();
	});
}
// *************************************
// 旧 API
// *************************************
else {
	// 旧 WebRTCチェック用
	var api = [
		"webkitGetUserMedia", "mozGetUserMedia","msGetUserMedia"
	]
	$.each(api,function(idx){
		if (navigator.getUserMedia = navigator.getUserMedia || navigator[api[idx]]) {
			return false;
		}
	});
	// WebRTC 使用可能
	if ( navigator.getUserMedia ) {
		// スマホでは、幅いっぱいに使う
		if ( $.isMobile ) {
			$("#camera").css("width","100%");
		}
		// カメラの表示
		navigator.getUserMedia({video: true}, 
			function(stream) {
				// カメラのストリームを表示
				camera.srcObject = stream;
				// ▼ 旧実装
				// camera.src = window.URL.createObjectURL(stream);
			},
			function(err){
				// ブラウザで使用を拒否した場合等( 動画で代替 )
				errorVideo();
			}
		);	
	}
	else {
		// 動画で代替
		errorVideo();
	}
}

// *************************************
// 動画で代替
// *************************************
function errorVideo() {

	toastr.error( "WebRTC を使用できません");

	$("#camera")
	.prop({ 
		"loop" : true, "muted" : true, "controls" : true,
		"src" : "TriggerRally.mp4"
	})
	.css({"border": "solid 1px #000"});

}
</script>

</body>
</html>

参考

Apple Safari の WebRTC について
WebRTC で URL.createObjectURLはまもなく使えなくなる




【APIの最新記事】
posted by lightbox at 2018-11-15 15:53 | API | このブログの読者になる | 更新情報をチェックする

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 + 通信 | このブログの読者になる | 更新情報をチェックする
container 終わり

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

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