function open_imap(&$arr_mail_account, &$imap, $account_no)
{
    // account list array, from config.php
    global $arrAccountsImap;
    // $account_noの範囲チェック
    if ($account_no <= 0 || $account_no > count($arrAccountsImap)) {
        printf("<p>アカウント指定Noが範囲外です<br/>account=%d</p>\n", $account_no);
        return false;
    }
    // メールアカウント情報(サーバ名、ユーザ名、パスワード等)を得る
    $arr_mail_account = GetMailAccount($arrAccountsImap[$account_no - 1][1], 'imap');
    if (!isset($arr_mail_account['server']) || !isset($arr_mail_account['user']) || !isset($arr_mail_account['password']) || strcmp($arr_mail_account['protocol'], 'imap')) {
        print "<p>メールアカウント管理エラー(server/user/password値が得られないか、protocolがimapでない)</p>\n";
        return false;
    }
    // IMAPサーバに接続する
    if (!strcmp($arr_mail_account['port'], '993')) {
        // IMAP SSL
        $imap = new Net_IMAP('ssl://' . $arr_mail_account['server'], 993);
    } elseif (!strcmp($arr_mail_account['port'], '143')) {
        // IMAP with StartTLS
        $imap = new Net_IMAP($arr_mail_account['server'], 143, true);
    } else {
        printf("<p>このプログラムで利用可能なMAPサーバのポートは993(SSL)もしくは143のみです</p>\n<p>port=%s</p>\n", $arr_mail_account['port']);
        return false;
    }
    if (PEAR::isError($imap->login($arr_mail_account['user'], $arr_mail_account['password']))) {
        print "<p>IMAPサーバへの接続に失敗</p>\n";
        return false;
    }
    printf("<p>IMAPサーバに接続 (%s)</p>\n", htmlspecialchars($arr_mail_account['user']));
    return true;
}
function open_pop3(&$arr_mail_account, &$pop3, $account_no)
{
    // account list array, from config.php
    global $arrAccountsPop3;
    // $account_noの範囲チェック
    if ($account_no <= 0 || $account_no > count($arrAccountsPop3)) {
        printf("<p>アカウント指定Noが範囲外です<br/>account=%d</p>\n", $account_no);
        return false;
    }
    // メールアカウント情報(サーバ名、ユーザ名、パスワード等)を得る
    $arr_mail_account = GetMailAccount($arrAccountsPop3[$account_no - 1][1], 'pop3');
    if (!isset($arr_mail_account['server']) || !isset($arr_mail_account['user']) || !isset($arr_mail_account['password']) || strcmp($arr_mail_account['protocol'], 'pop3')) {
        print "<p>メールアカウント管理エラー(server/user/password値が得られないか、protocolがpop3でない)</p>\n";
        return false;
    }
    // POP3サーバに接続する
    if (!$pop3->connect($arr_mail_account['server'], $arr_mail_account['port'])) {
        print "<p>POP3サーバへの接続に失敗</p>\n";
        return;
    }
    if (!$pop3->login($arr_mail_account['user'], $arr_mail_account['password'], true)) {
        $pop3->disconnect();
        print "<p>POP3サーバへの接続に失敗</p>\n";
        return;
    }
    printf("<p>POP3サーバに接続(%s)</p>\n", htmlspecialchars($arr_mail_account['user']));
    return true;
}
function open_smtp(&$arr_mail_account, &$smtp, $account_no, $debug_flag)
{
    // account list array, from config.php
    global $arrAccountsSmtp;
    // $account_noの範囲チェック
    if ($account_no <= 0 || $account_no > count($arrAccountsSmtp)) {
        printf("<p>アカウント指定Noが範囲外です<br/>account=%d</p>\n", $account_no);
        return false;
    }
    // メールアカウント情報(サーバ名、ユーザ名、パスワード等)を得る
    $arr_mail_account = GetMailAccount($arrAccountsSmtp[$account_no - 1][1], 'smtp');
    if (!isset($arr_mail_account['server']) || !isset($arr_mail_account['user']) || !isset($arr_mail_account['password']) || strcmp($arr_mail_account['protocol'], 'smtp')) {
        print "<p>メールアカウント管理エラー(server/user/password値が得られないか、protocolがsmtpでない)</p>\n";
        return false;
    }
    // 新しい Net_SMTP オブジェクトを作成します
    if (!($smtp = new Net_SMTP($arr_mail_account['server'], $arr_mail_account['port']))) {
        print "<p>ネットワーク異常(SMTPオブジェクト作成不能)</p>";
        return false;
    }
    // デバッグ出力を、stdoutに送る
    if ($debug_flag) {
        $smtp->setDebug(true);
    }
    // SMTP サーバに接続します
    if (PEAR::isError($e = $smtp->connect())) {
        print "<p>ネットワーク異常(SMTPでコネクション不能)</p>";
        return false;
    }
    // ユーザ名、パスワードを用いてSMTPログオンします
    // (Digest-MD5, CRAMMD5, LOGIN, PLAINの順に暗号強度の高いもので接続します)
    if (PEAR::isError($e = $smtp->auth($arr_mail_account['user'], $arr_mail_account['password']))) {
        $smtp->disconnect();
        print "<p>SMTPサーバの認証に失敗</p>";
        return false;
    }
    printf("<p>接続:%s@%s:%s</p>\n", $arr_mail_account['user'], $arr_mail_account['server'], $arr_mail_account['port']);
    return true;
}
function sendmail_sendmsg($account_no, $subject, $rcpt, $fromname, $msg, $debug_flag)
{
    // account list array, from config.php
    global $arrAccountsSmtp;
    // $account_noの範囲チェック
    if ($account_no <= 0 || $account_no > count($arrAccountsSmtp)) {
        printf("<p>アカウント指定Noが範囲外です<br/>account=%d</p>\n", $account_no);
        return;
    }
    // メールアカウント情報(サーバ名、ユーザ名、パスワード等)を得る
    $arr_mail_account = GetMailAccount($arrAccountsSmtp[$account_no - 1][1], 'smtp');
    if (!isset($arr_mail_account['server']) || !isset($arr_mail_account['user']) || !isset($arr_mail_account['password']) || strcmp($arr_mail_account['protocol'], 'smtp')) {
        print "<p>メールアカウント管理エラー(server/user/password値が得られないか、protocolがsmtpでない)</p>\n";
        return;
    }
    // 送信者のアドレス(user@example.com)の文字列を作成する
    $from = '';
    if (strpos($arr_mail_account['user'], '@') === false) {
        $from = $arr_mail_account['user'] . '@' . $arr_mail_account['server'];
    } else {
        $from = $arr_mail_account['user'];
    }
    // mime形式のヘッダ、メール本文
    $mime = new Mail_mime();
    // mime構造規定の配列を初期化(エンコード別の処理が必要ない場合は値も初期化時に設定)
    $mime_param = array();
    $mime_header = array('User-Agent' => 'PHP Pear Net_mime', 'To' => $rcpt);
    // 送信者名(From),タイトル(Subject)をエンコードする
    $internal_charset_save = mb_internal_encoding();
    // 現在の内部エンコードを一旦保存
    switch ($_POST['subj_transfer']) {
        case 'mime-base64':
            $mime_param['head_encoding'] = 'base64';
            mb_internal_encoding($_POST['msg_encode']);
            // 送信者名(From)
            $mime_header['From'] = mb_encode_mimeheader(mb_convert_encoding($fromname, $_POST['msg_encode'], 'UTF-8'), $_POST['msg_encode'], 'B') . "<" . $from . ">";
            // タイトル(Subject)
            $mime_header['Subject'] = mb_encode_mimeheader(mb_convert_encoding($subject, $_POST['msg_encode'], 'UTF-8'), $_POST['msg_encode'], 'B');
            break;
        case 'mime-quoted-printable':
            $mime_param['head_encoding'] = 'quoted-printable';
            mb_internal_encoding($_POST['msg_encode']);
            // 送信者名(From)
            $mime_header['From'] = mb_encode_mimeheader(mb_convert_encoding($fromname, $_POST['msg_encode'], 'UTF-8'), $_POST['msg_encode'], 'Q') . "<" . $from . ">";
            // タイトル(Subject)
            $mime_header['Subject'] = mb_encode_mimeheader(mb_convert_encoding($subject, $_POST['msg_encode'], 'UTF-8'), $_POST['msg_encode'], 'Q');
            break;
        case 'plain':
            $mime_param['head_encoding'] = '7bit';
            $mime_header['From'] = mb_convert_encoding($fromname, $_POST['msg_encode'], 'UTF-8') . "<" . $from . ">";
            $mime_header['Subject'] = mb_convert_encoding($subject, $_POST['msg_encode'], 'UTF-8');
            break;
        default:
            printf("<p>送信者名(From)とタイトル(Subject)転送方式の指定が範囲外 (value=%s)</p>", htmlspecialchars($_POST['subj_transfer']));
            return;
    }
    mb_internal_encoding($internal_charset_save);
    // 本文のエンコード
    $str_temp = '';
    switch ($_POST['msg_encode']) {
        case 'ISO-2022-JP':
            $mime_param['head_charset'] = 'iso-2022-jp';
            $mime_param['text_charset'] = 'iso-2022-jp';
            $str_temp = mb_convert_encoding($msg . "\n\n", 'ISO-2022-JP', 'UTF-8');
            break;
        case 'UTF-8':
            $mime_param['head_charset'] = 'utf8';
            $mime_param['text_charset'] = 'utf8';
            //$str_temp = mb_convert_encoding($msg . "\n\n", 'UTF-8', 'UTF-8');
            $str_temp = $msg;
            break;
        case 'SJIS':
            $mime_param['head_charset'] = 'shift-jis';
            $mime_param['text_charset'] = 'shift-jis';
            $str_temp = mb_convert_encoding($msg . "\n\n", 'SJIS', 'UTF-8');
            break;
        case 'EUC-JP':
            $mime_param['head_charset'] = 'euc-jp';
            $mime_param['text_charset'] = 'euc-jp';
            $str_temp = mb_convert_encoding($msg . "\n\n", 'EUC-JP', 'UTF-8');
            break;
        default:
            printf("<p>本文エンコード形式の指定が範囲外 (value=%s)</p>", htmlspecialchars($_POST['msg_encode']));
            return;
    }
    // 本文の転送エンコードは、$mime_param['text_encoding']を設定することで自動的に行われる
    /*
        switch($_POST['msg_transfer']) {
            case '7bit' : break;
            case '8bit' : break;
            case 'quoted-printable' : quoted_printable_encode_self($str_temp, $_POST['msg_transfer']); break;
            case 'base64' : $str_temp = base64_encode($str_temp); break;
            case 'binay' : break;
            default :
                printf("<p>本文転送形式の指定が範囲外 (value=%s)</p>", htmlspecialchars($_POST['msg_transfer']));
                return;
        }
    */
    $mime->setTxtBody($str_temp);
    $mime_param['text_encoding'] = $_POST['msg_transfer'];
    /* Mail_Mime オブジェクトを構築 */
    $smtp_body = $mime->get($mime_param);
    $smtp_header = $mime->headers($mime_header);
    $smtp_auth = array('host' => $arr_mail_account['server'], 'port' => $arr_mail_account['port'], 'auth' => true, 'username' => $arr_mail_account['user'], 'password' => $arr_mail_account['password'], 'debug' => $debug_flag ? true : false);
    /* 新しいMailオブジェクトを作成 */
    $mail =& Mail::factory('smtp', $smtp_auth);
    /* メールの送信 */
    if (PEAR::isError($e = $mail->send($rcpt, $smtp_header, $smtp_body))) {
        printf("<p>送信エラー発生<br/>エラーメッセージ:%s</p>\n", $e->getMessage());
    } else {
        print "<p>送信完了</p>\n<p>詳細情報<br/>===========</p>\n<pre>\n";
        print htmlspecialchars(print_r($smtp_header, true));
        printf("</pre>\n<p>本文 : %d バイト</p>\n", strlen($smtp_body));
    }
}