magento 1.9.x订单邮件发送不出去

1.解决办法

crontab要设置正确,因为1.9.1之后订单邮件是任务计划队列发出

SSH
sudo crontab -e
#add
 * * * * * /bin/sh /www/wwwroot/path/magento/cron.sh

按照你的路径来修改上方,推荐Aoe_Scheduler 插件

https://github.com/AOEpeople/Aoe_Scheduler

此外,stackoverflow 有人给出直接修改成不用队列发送的,如果修改不了crontab也可以考虑

连接如下

  1. 修改email template (推荐)
  2. 修改order
  3. BSS
  4. 官方论坛的帖子1 帖子2

PHP 假日判断方式

确认你不是想知道是今天是周几


echo date('w'); //返回当天的星期;数字0表示是星期天,数字123456表示星期一到六

国内放假安排信息源:

参考 信息公开公文公报

国内有开发者在维护的API :

http://tool.bitefu.net/jiari/

测试工具
https://www.sojson.com/httpRequest/

也可以参考 股票开市,来自 新浪

因为假日安排是人工硬编码,API也存在格式变化或者停止服务的其他状况。

自编写固定假日数字也是一个选择。

python 读取写入文件笔记

使用版本python 3.8

  • 读取时候提示编码错误
  • 比如
UnicodeDecodeError: 'gbk' codec can't decode byte xxxx :illegal multibyte sequence

3.8 可用做法是,参考

FILE_OBJECT= open('order.log','r', encoding='UTF-8')

另外一种,可能对2.x版本,我的3.8不行

FILE_OBJECT= open('order.log','rb')
  • CSV 写入会有空行,3.8 newline=” 参考
with open(output_bad, "w",newline='', encoding='UTF-8') as bad:

2.x版本是’wb+’

with open('xxx.csv','wb+',encoding='utf-8') as csvfile:#将写入方式改为wb+ 二进制写入

python 将字符串str转化成单个/一个列表list

使用的是方括号直接转化

r = 'dsadsd'
list_r = list(r)
entire_r = [r]
print('list(r) is %s'%list_r)
print('[r] is %s'%entire_r)

list(r) is ['d', 's', 'a', 'd', 's', 'd']
[r] is ['dsadsd']

尤其 CSV 的writer.writerow 传递的是list 参数,如果使用string,就存在把string分解到很多列的问题。

搜索了string转list给出都是list()函数转化,python确实是一门好用的语言

Centos7 VM 安装记录

  1. 上网问题

使用的CentOS-7-x86_64-Minimal-1908,输入ifconfig的时候提示,没有此命令。

vi /etc/sysconfig/network-scripts ifcfg-ens33

把 ONBOOT属性更改为yes ,NAT模式下(我使用的)就获取到IP 了

2.install 问题 could not resolve host

网络通了以后换源,我使用的是aliyunhttps://developer.aliyun.com/mirror/centos

官方的知道方案,比较详细

【翻译】使用composer 安装Magento 2.3.x

官方原文链接

RoadMap

We use Composer to manage Magento components and their dependencies. Using Composer to get the Magento software metapackage provides the following advantages:

我们使用Composer来管理Magento组件及其依赖项。使用Composer获得Magento软件metapackage有以下优势:

  • Reuse third-party libraries without bundling them with source code
  • Reduce extension conflicts and compatibility issues by using a component-based architecture with robust dependency management
  • Adhere to PHP-Framework Interoperability Group (FIG) standards
  • Repackage Magento Open Source with other components
  • Use the Magento software in a production environment

– 重用第三方库,而不用将它们与源代码绑定
-通过使用基于组件的体系结构和健壮的依赖关系管理,减少扩展冲突和兼容性问题
-遵守PHP框架互操作性组(FIG)标准
-可以用其他组件重新打包Magento开源代码
-在生产环境中使用Magento软件

You must create a Composer project from our metapackage if you want to use the Magento Web Setup Wizard to upgrade the Magento software and third-party extensions.

如果您想使用Magento Web安装向导升级Magento软件和第三方扩展,则必须从我们的集合包中创建Composer项目。 (这也是我首先翻译这个文章的意图,因为手动向导安装无法在网页前端升级操作,官方有讲)

Prerequisites

Before you continue, you must do the following:

先决条件
在你继续之前,你必须做以下事情:
-设置一个满足系统需求的服务器(2G以上内存,apache 2.2 or 2.4,
MySQL 5.6, 5.7 /MariaDB 10.0, 10.1, 10.2,PHP 7.1.3+/ 7.2.x 及扩展/OPcache/PHP配置设置 ,SSL 1.1以上/不支持自签名,系统依赖,MAT/SMTP 邮箱服务,Redis3.2/Varnish 4.x 5.2/ Elasticsearch 5.2.x 2.x/ RabbitMQ 3.7.x )
-创建Magento文件系统所有者(详细)
-安装Composer
-获取Magento代码存储库的身份验证密钥 (详细

Get the metapackage

To get the Magento metapackage:

  1. Log in to your Magento server as, or switch to, the Magento file system owner.
  2. Change to the web server docroot directory or a directory that you have configured as a virtual host docroot.
  3. Create a new Composer project using the Magento Open Source or Magento Commerce metapackage.

获取安装包

-以Magento文件系统所有者(详细)的身份登录Magento服务器,或切换到该服务器。
-更改到web服务器docroot目录或已配置为虚拟主机docroot的目录。
-使用Magento开源或Magento 商业版的 metapackage 创建一个新的Composer项目。

开源版

composer create-project --repository=https://repo.magento.com/ magento/project-community-edition <install-directory-name>

商业版

composer create-project --repository=https://repo.magento.com/ magento/project-enterprise-edition <install-directory-name>

When prompted, enter your Magento authentication keys. Your public key is your username; your private key is your password.

If you encounter errors, such as Could not find package... or ...no matching package found, make sure there are no typos in your command. If you still encounter errors, you may not be authorized to download Magento Commerce. Contact Magento support for help.

See troubleshooting for help with more errors.

当提示时,输入Magento身份验证密钥。你的公钥是你的用户名;您的私钥是您的密码。
如果遇到错误,比如找不到包…还是……没有找到匹配的包,请确保您的命令中没有输入错误。如果您仍然遇到错误,您可能没有授权下载Magento Commerce。联系Magento寻求帮助。
有关更多错误,请参见疑难解答。

Set file permissions设置文件权限

You must set read-write permissions for the web server group before you install the Magento software. This is necessary so that the Setup Wizard and command line can write files to the Magento file system.

在安装Magento软件之前,必须为web服务器组设置读写权限。这是必要的,以便安装向导和命令行可以将文件写入Magento文件系统。

cd /var/www/html/<magento install directory>
find var generated vendor pub/static pub/media app/etc -type f -exec chmod g+w {} +
find var generated vendor pub/static pub/media app/etc -type d -exec chmod g+ws {} +
chown -R :www-data . # Ubuntu
chmod u+x bin/magento

安装magento 一种是命令行一种是页面安装向导

(已经到这一步了,别折腾自己了,选择页面向导安装吧)

http://<Magento-host-or-IP>/<path-to-magento-root>/setup
For example: http://localhost/magento2ee/setup

命令行方式

This example assumes that the Magento install directory is named magento2ee, the db-host is on the same machine (localhost), and that the db-namedb-user, and db-password are all magento:

假设文件夹名为 magento2ee ,数据库在同一台服务器,数据库链接参数如上。

bin/magento setup:install \
--base-url=http://localhost/magento2ee \
--db-host=localhost \
--db-name=magento \
--db-user=magento \
--db-password=magento \
--backend-frontname=admin \
--admin-firstname=admin \
--admin-lastname=admin \
[email protected] \
--admin-user=admin \
--admin-password=admin123 \
--language=en_US \
--currency=USD \
--timezone=America/Chicago \
--use-rewrites=1

命令行更多官方细节

iPhone bluetooth APN window10 show INVALID_MDL_RANGE blue screen -手机蓝牙分享网络蓝屏

首先先说下,如果你电脑没有360管家,可能不适用

First of all, If you not use ‘ 360 security managemnt soft(Qihoo)’,maybe can not help you.Please check your firewell settings.

我(dell inspiron 15-3568)(win10 ver1809)试过2块网卡 普通的AC3165 和AC9260 都是自带蓝牙,然后更新最新驱动(360驱动大师和驱动精灵),然后我的iPhone 6s Plus 还是连上蓝牙个人局域网后,大概30秒左右的时间就会蓝屏,错误代码INVALID_MDL_RANGE

搜索引擎发现很少人遇到这个问题,本文只是记录下,后面遇到问题了,再更新吧

下一步,我测试安卓手机会不会正常(测试机型-小米4 lte 一样不行)

然后问下微信dell客服(dell 客服首先收给了官方的驱动,也是不行;后面恢复了BIOS也不行;看了dmp文件说是360的问题,卸载360中)

OK。搞定了,卸载了360,使用默认驱动,没问题了,现在更新就是基于蓝牙APN。当然也可能其他安全软件的拦截。

学到一个单词 Tethering 意思为网络共享

网上遇到问题的网友(没有给出解决问题办法):

1.微软社区,中文

微软论坛,英文

2.戴尔论坛,dell xps机型,英文

3.联想社区,英文

宝塔面板安装godaddy 证书

步骤一,生成CSR 和私钥

https://www.chinassl.net/ssltools/generator-csr.html

当然有其他家都可以,这一步得到CSR和密钥,就是宝塔证书的左栏( 密钥(KEY) )

步骤二,拿着CSR去godaddy 申请证书(如果你域名在godaddy上就不用这样,直接就生成了)

步骤三,下载证书crt文件,选择是一串数字和字母的,不要包含bundle字样的,编辑代码,获取就是 宝塔右栏( 证书(PEM格式) )

最后,保存生效就可以了

参看链接:

https://www.bt.cn/bbs/forum.php?mod=viewthread&tid=704&highlight=ssl%E8%AF%81%E4%B9%A6

贝塔斯曼数据奖学金-Python部分-1

统计学理论学完后,就到了技术部分,包含Python和SQL(使用的是Postgre)

今天先回顾学过的Python部分:

1.Data Types And Operators数据类型和操作符

首先学的是操作符,简单的加减乘除就和普通一样,比较特殊的是

** 求幂运算,简单来说就是次方,3的6次方 3**6

// 向下整数除法 7//2 =3   -7//2=-4

% 求余数

负值是等号,==是判断是否相等

+= -= *=

 

整数和浮点数

type() 检查参数类型

int(49.7) =49 直接舍去

 

报错会有两种 Exception 和error

exception是运行时报错

error是运行前,检查出来的错误。

 

布尔值true false、逻辑运算and or not


接下来是比较重要的难点

字符串string、列表list、元组tuples、set集合、字典 dictionary

Data Structure Ordered Mutable Constructor Example
int NA NA int() 5
float NA NA float() 6.5
string Yes No ' ' or " " or str() “this is a string”
bool NA NA NA True or False
list Yes Yes [ ] or list() [5, ‘yes’, 5.7]
tuple Yes No ( ) or tuple() (5, ‘yes’, 5.7)
set No Yes { } or set() {5, ‘yes’, 5.7}
dictionary No Keys: No { } or dict() {‘Jun’:75, ‘Jul’:89}

字符串:有序,不可修改

单引号来包含双引号

\ 来转义

+ 来合并字符串,*来复制,没有减法和除法

len()/format()

a.count(b)/a.find(b)


list列表 可排序可改变,使用广泛

names = [“Carol”, “Albert”, “Ben”, “Donna”]

names[0]第一个 ;names[-1]最后一个,[len(string)-1]

month[6:9]  7-9月份,不包含上限。

[:6]前6个元素,不包含7

in 和not in判断

max() 最大的int,字符串首字母靠后的,多重type无法比较-min()

sorted()从下到大排序

sorted(list,reverse=True)从大到小排序

“-“.join(list)连接字符串

b.append(‘one’)添加到列表末尾 直接使用

b=names.pop(1) 提出第二个元素


元组Tuples 包含不可变 有序的数据结构,括号可选

没有append和pop方法

tup1[0] 方括号索引查找

内置4个函数,cmp比较两个元组,max,min和tuple(listname)转化

location = (13.4125, 103.866667)
print("Latitude:", location[0])
print("Longitude:", location[1])

元组解包,就是把元组内的参数赋值,下方第二行就是解包

dimensions = 52, 40, 100
length, width, height = dimensions
print("The dimensions are {} x {} x {}".format(length, width, height))

也可以写成

length, width, height = 52, 40, 100
print("The dimensions are {} x {} x {}".format(length, width, height))

set 集合 包含唯一元素 且 顺序不定,可以修改

scores=[‘4′,’5′,’6′,’9’]

可以由list生成 set(listname)

set.add(‘newone’)添加元素 没有append() 随机添加到一个位置

set.pop()随机删除一个元素


dictionary 字典 存储的是元素对 key:value,数组的概念

key可以是int string float 不可变的值且统一

elements = {“hydrogen”: 1, “helium”: 2, “carbon”: 6}

print(elements[“helium”])

添加就直接添加 elements[“lithium”] = 3

“some” in elements 检查是否存在于字典

elements .get(“some”) 比直接方括号elements.[“some”]要安全,不存咋的话,也只返回None而不是报错

还可以设置成elements .get(“some”,”There\`s no such key”)来自定义返回语句


Compound Data Structures 应该是python的多维数组

elements = {"hydrogen": {"number": 1,
                         "weight": 1.00794,
                         "symbol": "H"},
              "helium": {"number": 2,
                         "weight": 4.002602,
                         "symbol": "He"}}

hydrogen_weight = elements[“hydrogen”][“weight”]

 



控制流 control flow

IF ELIF ELSE

注意冒号和缩进。

points = 174

points = 174  # use this input when submitting your answer

# set prize to default value of None
prize = None

# use the value of points to assign prize to the correct prize name
if points <= 50:
    prize = "wooden rabbit"
elif 151 <= points <= 180:
    prize = "wafer-thin mint"
elif points >= 181:
    prize = "penguin"

# use the truth value of prize to assign result to the correct message
if prize:
    result = "Congratulations! You won a {}!".format(prize)
else:
    result = "Oh dear, no prize this time."

print(result)

 


循环 loop

for和while的使用

usernames = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]

for i in range(len(usernames)):
    usernames[i] = usernames[i].lower().replace(" ", "_")

print(usernames)

while求阶乘

# Start with a sample number for first test - change this when testing your code more!
number = 6   
# We'll always start with our product equal to the number
product = number

# Write while loop header line - how will you tell it when to stop looping?
while  number > 1:
    # Each time through the loop, what do we want to do to our number?
    number -= 1
    # Each time, what do we want to multiply the current product by?
    product *= number
# Print out final product (how do we indicate this should happen after loop ends?)
print(product)

for的方式

# This is the number we'll find the factorial of - change it to test your code!
number = 6
# We'll start with the product equal to the number
product = number

# Write a for loop that calculates the factorial of our number 
for num in range(1, number):
    product *= num

# print the factorial of your number
print(product)

range函数,使用此函数得到list的索引

range(start,stop,step) start 和step默认是1

range(5)只有一个整数时,是stop的值 ,0-4

range(2,10) 是start =2 和stop=10 step默认为1, 2~8

迭代字典

fruit_count, not_fruit_count = 0, 0
basket_items = {'apples': 4, 'oranges': 19, 'kites': 3, 'sandwiches': 8}
fruits = ['apples', 'oranges', 'pears', 'peaches', 'grapes', 'bananas']

#Iterate through the dictionary
for fruit, count in basket_items.items():
    if fruit in fruits:
       fruit_count += count
    else:
        not_fruit_count += count

print("The number of fruits is {}.  There are {} items that are not fruits.".format(fruit_count, not_fruit_count))

 

while 是条件为真时继续运行

card_deck = [4, 11, 8, 5, 13, 2, 8, 10]
hand = []

# adds the last element of the card_deck list to the hand list
# until the values in hand add up to 17 or more
while sum(hand)  < 17:
    hand.append(card_deck.pop())
limit = 40

num = 0
while (num+1)**2 < limit:
    num += 1
nearest_square = num**2

print(nearest_square)

break 和 continue

break终止并跳出循环

continue 跳过本次迭代,而不完全跳出循环

headlines = ["Local Bear Eaten by Man",
             "Legislature Announces New Laws",
             "Peasant Discovers Violence Inherent in System",
             "Cat Rescues Fireman Stuck in Tree",
             "Brave Knight Runs Away",
             "Papperbok Review: Totally Triffic"]

news_ticker = ""
for headline in headlines:
    news_ticker += headline + " "
    if len(news_ticker) >= 140:
        news_ticker = news_ticker[:140]
        break

print(news_ticker)

zip and enumerate 打包和枚举

打包可简单理解成多个list拼成字典

x_coord = [23, 53, 2, -12, 95, 103, 14, -5]
y_coord = [677, 233, 405, 433, 905, 376, 432, 445]
z_coord = [4, 16, -6, -42, 3, -6, 23, -1]
labels = ["F", "J", "A", "Q", "Y", "B", "W", "X"]

points = []
for point in zip(labels, x_coord, y_coord, z_coord):
    points.append("{}: {}, {}, {}".format(*point))

for point in points:
    print(point)

 

cast_names = ["Barney", "Robin", "Ted", "Lily", "Marshall"]
cast_heights = [72, 68, 72, 66, 76]

cast = dict(zip(cast_names, cast_heights))
print(cast)
{'Lily': 66, 'Barney': 72, 'Marshall': 76, 'Ted': 72, 'Robin': 68}

 

枚举 Enumerate

cast = ["Barney Stinson", "Robin Scherbatsky", "Ted Mosby", "Lily Aldrin", "Marshall Eriksen"]
heights = [72, 68, 72, 66, 76]

for i, character in enumerate(cast):
    cast[i] = character + " " + str(heights[i])

print(cast)

 

['Barney Stinson 72', 'Robin Scherbatsky 68', 'Ted Mosby 72', 'Lily Aldrin 66', 'Marshall Eriksen 76']

List Comprehensions 列表推导

应该理解成对list的筛选

multiples_3 = [x * 3 for x in range(1, 21)]
print(multiples_3)
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60]

12306客户服务汇总

1.改签规定:

一张车票可以办理一次改签。

车票改签后,旅客取消旅行的,可以按规定退票,但开车后改签的车票不能退票。对已改签车票暂不提供“变更到站”服务。

links


在12306.cn网站购票后,在有运输能力的前提下,可在车站售票窗口办理改签:

(1)开车前48小时(不含)以上,可改签预售期内的其他列车;

开车前48小时以内,可改签开车前的其他列车,也可改签开车后至票面日期当日24:00之间的其他列车,不办理票面日期次日及以后的改签;

开车之后,旅客仍可改签当日其他列车,但只能在票面发站办理改签。已经办理“变更到站”的车票,不再办理改签。开车前48小时~15天期间内,改签至距开车15天以上的其他列车,又在距开车15天前退票的,仍核收5%的退票费。改签后的车票乘车日期在春运期间的,退票时一律按开车时间前不足24小时标准核收退票费。

(2)按购票时所使用的在线支付工具相关规定,在铁路售票窗口改签时,改签后新车票票价高于原车票、需补收票价差额的,请使用带有银联标志的银行卡支付新车票全额票款,原车票票款在规定时间内退回购票时所使用的在线支付工具;

改签后新车票票价低于原车票的,退还差额,对差额部分核收退票费并执行现行退票费标准,应退票款在规定时间内退回购票时所使用的在线支付工具。改签后的新车票票价等于原车票的,无需办理支付。

  (3)在车站售票窗口改签后,出具纸质车票。

links


自2015年春运开始,铁路部门进一步推出了优惠旅客的服务措施,放宽了开车后改签的条件,即:在当日其他列车有余票的情况下,允许旅客在开车后办理改签。其主要变化:

一是扩大了范围,取消了“特殊情况”的限制条件,只要当日其他列车有余票,任何旅客均可在开车后办理改签;

二是延长了办理时间,将“开车后2小时内”延长至当日24时之前

三是简化了办理流程,无需经站长同意,在车站售票处改签窗口即可直接办理。

links


 

依据《铁路安全管理条例》(国务院令第639号)有关规定,在动车组列车上吸烟或者在其他列车的禁烟区域吸烟的,由公安机关责令改正,处500元以上2000元以下的罚款。


按照车票票面指定的日期、车次,可以在中途站上车,但未乘区间的票价不退。在12306.cn网站购票的,在中途站上车时,请在开车前换取纸质车票进站、乘车。


一名成年人旅客可以免费携带一名身高不足1.2米的儿童。如果身高不足1.2米的儿童超过一名时,一名儿童免费,其他儿童请购买儿童票。

儿童身高为1.2~1.5米的,请购买儿童票;超过1.5米的,请购买全价座票。

成年人旅客持卧铺车票时,儿童可以与其共用一个卧铺,并按上述规定免费或购票。


儿童票可享受客票、加快票和空调票的优惠,儿童票票价按相应客票和附加票公布票价的50%计算。免费乘车及持儿童票乘车的儿童单独使用卧铺时,另收全价卧铺票价,有空调时还另收半价空调票票价。儿童票的座别与成年人旅客的车票相同,到站不能远于成年人旅客车票的到站。