kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

PHPMailer 发送邮件

使用 PHP 自带 mail

https://www.php.net/manual/zh/function.mail.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public function testEmail()
{
	$to = "1@qq.com";
	$subject = "test email";
	$message = "test email msg";
	$headers = array(
		'From' => '2@qq.cn'
	);

	if (mail($to, $subject, $message, $headers)) {
		echo "send ok";
	} else {
		echo "send fail";
	}
}

使用 PHPMailer

https://www.php.cn/faq/545800.html

PHPMailer的安装和配置

使用PHPMailer库前,需要先将其安装到项目中。在命令行中切换到你项目的根目录下,运行下面的命令进行安装:

1
composer require phpmailer

安装完毕后,我们需要在项目中引用PHPMailer类文件。在代码中添加以下语句:

1
2
3
4
require_once "tools/composer/vendor/autoload.php";

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;

在以上示例中,我们使用了isSMTP()方法将SMTP协议开启,使用了SMTPDebug调试模式输出SMTP交互信息,设置了SMTP服务器地址、用户名和密码等信息,设置了发件人和收件人的邮箱地址和名称,设置了邮件主题和正文,同时还设置了纯文本形式的邮件正文。

PHPMailer发送附件邮件

发送带附件的邮件,我们需要使用PHPMailer类的addAttachment()方法添加附件。下面我们将举一个例子来演示如何实现加入附件的邮件发送。

1
$mail->addAttachment('path/to/file.pdf');

样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// 不认证
public function testEmail2()
{
	$mail = new PHPMailer();
	$mail->isSMTP();
	$mail->Host = '192.168.100.41';
	$mail->Port = 25;

	$mail->setFrom('2@qq.cn', 'secure');
	$mail->addAddress('1@qq.com', 'kk');
	$mail->Subject = 'Email Subject';
	$mail->Body = 'Email Body';
	$mail->AltBody = 'Email Body in Plain Text';

//    $mail->addAttachment('path/to/file.pdf');

	if(!$mail->send()) {
		echo "error " . $mail->ErrorInfo;
	} else {
		echo "ok";
	}
}

// SASL 认证
public function testEmail3()
{
	$mail = new PHPMailer();
	$mail->isSMTP();
	$mail->Host = '192.168.100.41';
	$mail->Port = 25;
// TODO tls ?
//    $mail->Port = 587;
//    $mail->SMTPSecure = 'tls';

// user 1
	$mail->SMTPAuth = true;
	$mail->Username = '3@qq.cn';
	$mail->Password = '123456';

	$mail->setFrom('2@qq.cn', 'secure');
	$mail->addAddress('1@qq.com', 'kk');
	$mail->Subject = 'Email Subject';
	$mail->Body = 'Email Body';
	$mail->AltBody = 'Email Body in Plain Text';

//    $mail->addAttachment('path/to/file.pdf');

	if(!$mail->send()) {
		echo "error " . $mail->ErrorInfo;
	} else {
		echo "ok";
	}
}

Excel 的列与数字转换

Excel 的列与数字转换

1
2
3
4
十进制   0 1 ... 9 10 11 ... 100 101
按十进制 A B ... Z BA BB ... BAA BAB // Z=26  ZZ=26*26        ZZZ=26*26*26
实际上   A B ... Z AA AB ... AAA AAB // Z=26  ZZ=26*26 + 26   ZZZ=26*26*26 + 26*26 + 26
	//                    转成公式  Z=26  ZZ=(Z)*26 + 26  ZZZ=(ZZ)*26 + 26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function id_to_xls($id)
{
	$k = '';
	while (true) {
		$k = chr($id % 26 + ord('A')) . $k;
		$id -= 26;
		if ($id < 0)
			break;
		$id = (int)($id / 26);
	}
	return $k;
}

function xls_to_id($xlsCol)
{
	$hh = 0;
	for ($i = 0; $i < strlen($xlsCol); $i ++) {    // ZZ = 26*26 + 26
		$hh = $hh * 26;               //      26*26
		$hh += ord($xlsCol[$i]) - ord('A') + 1; //      26
	}
	return $hh - 1;
}


for ($i = 0; $i < 26*26*26 + 26*26 + 26 + 10; $i ++) {
	$k = id_to_xls($i);
	$id = xls_to_id($k);
	echo $i, "\t", $k, "\t", $id, "\n";
}

Excel getOldCalculatedValue 忽略计算值

https://cloud.tencent.com/developer/ask/sof/111247127

https://blog.csdn.net/weixin_36251052/article/details/115960992

XLS文件中的每个单元格都包含一个预先计算的值以及公式。如果我可以让PHPExcel在读取文件时不尝试计算公式(而只是按原样使用预先计算的值)

使用 getOldCalculatedValue() 将返回为在MS Excel中生成的公式单元格计算的最后一个值(即使这样,也可以在MS Excel中禁用计算,然后不会设置此值). PHPExcel生成的文件不会填充此值,因此它只提供默认值0.

一般来说,在尝试评估公式值时,应始终使用getCalculatedValue()

https://www.codenong.com/4584963/

如果不确定单元格的内容(包括值或公式),我建议您首先检查该单元格是否具有公式,然后进行复制-相应地粘贴。在这种情况下,getOldCalculatedValue()非常有用。这是一个例子:

1
2
3
4
5
$code = $sheet->getCell('A'.$y)->getValue();
if (strstr($code, '=') == true) {
	$code = $sheet->getCell('A'.$y)->getOldCalculatedValue();
}
$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A'.$l, $code);

对于大型数据集,getCalculatedValue() 函数确实很麻烦,并且需要大量内存才能正确执行。

https://www.codenong.com/5983845/

https://blog.csdn.net/weixin_30770783/article/details/98541565

getValue() 获取的是公式本身

而通过 getCalculatedValue()会有对象     getFormattedValue() 获取到的是公式计算后的值